每次执行工作负载前都需要开启一些设置比如启用大页之类的,而且一个负载执行完又得手动重新调节其他设置,有没有可能写一个脚本,捕获程序结束,并且自动收集数据呢。

#!/bin/bash

run_program() {
	# 程序名字,自动运行时用指定改运行哪个程序了
    program_name=$1
    # 工作负载输出保存的地址和文件名
    log_file="${program_name}.log"

    #运行程序前的操作做,这里是用root权限写入某个文件
    echo 2 > /sys/kernel/mm/profd/hotness_metric
    echo 5 > /sys/kernel/mm/profd/scanning_interval

	# 运行程序,除了程序运行的命令,还获取了进程id
    ./"${program_name}" -g 27 -n 2 &
    program_pid=$!

	# 如果程序没结束就一直收集数据
    while kill -0 "$program_pid" >/dev/null 2>&1
    do
        cat /sys/fs/cgroup/memory/memory.hotness.access_freq.stats >> "./${log_file}"
        sleep 100
    done
}


#get other infomations
#!/bin/bash

run_program() {
    program_name=$1
   
    ./gapbs/"${program_name}" -g 27 -n 4 >> ../res/gapbs.$program_name.out &
    program_pid=$!  
    
    echo "$program_pid"
    
    sudo perf stat -p $program_pid -o ../res/perf.$program_name.out -e dTLB-loads,dTLB-load-misses,iTLB-loads,iTLB-load-misses,dTLB-stores,dTLB-store-misses,cpu-cycles,cache-misses,cache-references,page-faults,major-faults,minor-faults -a  & 
    while kill -0 "$program_pid" >/dev/null 2>&1
    do
        vmstat >> ../res/vm.$program_name.out
        iostat -xz >> ../res/io.$program_name.out
        sleep 15
    done
    
}

sudo ../tools/mlc >> ../res/mlc1-7-64.txt
sleep 20
# 运行下一个程序 bc 并收集信息
run_program "bc"
sleep 100

run_program "sssp"
sleep 100

# 运行 sssp 并收集信息
run_program "sssp" &

# 等待 sssp 运行完成
wait $!

# 做其他有需要的设置
echo 0 > /sys/kernel/mm/profd/scanning_interval

# 运行下一个程序 bc 并收集信息
run_program "bc"

program_pid=$! 是获取最近在后台运行的命令的进程ID(PID)。在这种情况下,它将获取 ./"${program_name}" -g 27 -n 2 命令的进程ID。

这样做的目的是在后续的循环中,通过检查 kill -0 "$program_pid" 的返回值来确定程序是否仍在运行。如果返回值为0,则表示进程仍在运行,循环将继续。如果返回值不为0,则表示进程已退出,循环将结束。

program_pid=$! 获取的是相应程序的进程ID,而不是脚本本身的进程ID


后续:

ycsb_collect.sh: command not found

将上述脚本保存为一个文件(例如 run_xx.sh),然后在控制台中运行以下命令以给予脚本执行权限

chmod +x run_xx.sh

接下来,运行脚本:

./run_xx.sh

ycsb:

#!/bin/bash

run_load() {
    ycsb-0.17.0/bin/ycsb load memcached -s -P ycsb-0.17.0/workloads/workloada -p memcached.hosts=127.0.0.1 -p memcached.port=11211 -p recordcount=1000000000 -threads 16 >> ../res/ycsb.load.txt &
    
    sleep 10; program_pid=$(pgrep java)

    echo "$program_pid"
    
    sudo perf stat -p $program_pid -o ../res/perfjava.load.txt -e page-faults -a &
    sudo perf stat -p $(pgrep memcached) -o ../res/perfmemcached.load.txt -e page-faults -a -I 60 sleep 1200 &
    while kill -0 "$program_pid" >/dev/null 2>&1
    do
        iostat -xz >> ../res/io.load.txt
        vmstat >> ../res/vm.load.txt
        sleep 15
    done
}


run_program() {
    program_name=$1

    ycsb-0.17.0/bin/ycsb run memcached -s -P ycsb-0.17.0/workloads/workload${program_name} -p "memcached.hosts=127.0.0.1" -p "memcached.port=11211" -p recordcount=1000000000 -p operationcount=666666667 -threads 16 >> ../res/ycsb.${program_name}.txt &
    
    sleep 10; program_pid=$(pgrep java)

    echo "$program_pid"
    
    sudo perf stat -p $program_pid -o ../res/perfjava.load.txt -e page-faults -a &
    sudo perf stat -p $(pgrep memcached) -o ../res/perfmemcached.load.txt -e page-faults -a &
    while kill -0 "$program_pid" >/dev/null 2>&1
    do
        iostat -x >> ../res/io.${program_name}.txt
        vmstat >> ../res/vm.${program_name}.txt
        sleep 15
    done
}

export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/bin/java

run_load
sleep 50

run_program "a" 
sleep 100

run_program "b"
sleep 100

run_program "d"
sleep 100

sudo ../tools/mlc >> ../res/mlctest.txt

文章作者: 易百分
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 易百分 !