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