要探索Ubuntu上的CPU性能,我正在使用sysbench
的{{1}}测试。我还使用cpu
将某些CPU绑定到一个进程。
我用来运行实验的脚本如下:
taskset
我有一个48核服务器,因此最大线程数不超过核数。
现在的结果是:
for concur in {1..24}
do
end=$(($concur-1))
echo "--> Create $concur jobs"
for i in $(seq 0 $end)
do
j=`expr $i \\* 2`
taskset -c $j-$(($j+1)) sysbench --test=cpu --cpu-max-prime=200000 --num-threads=2 run > sysbench-cpu-$concur-$i.out &
pids[${i}]=$!
done
echo "--> Waiting for ${pids[*]}"
for pid in ${pids[*]}; do
wait $pid
done
unset pids
echo "--> Clean up ${pids[*]}"
done
结果显示,运行更多作业时,时间在增加。但是为什么呢?
由于该作业完全是与CPU绑定的作业,在sysbench中,该作业只是每个线程计算的素数为Concurrent Jobs | Average Time For Each Job(s)
1 331.8708
2 342.1978
3 354.9352333
4 360.505625
5 363.86354
6 363.632
7 363.9364429
8 363.761375
9 365.1571667
10 365.81912
11 366.2094909
12 366.56025
13 377.9281923
14 388.7300214
15 398.2705067
16 406.7716438
17 414.7786471
18 422.2813444
19 429.1379421
20 434.907065
21 440.5540571
22 445.3167864
23 450.0088783
24 456.5647417
,因此没有锁定,甚至没有占用内存来存储数组。我知道当使用太多内核时,可以为其他系统线程安排线程,但是在这里,当产生中等作业时(例如占用20个内核的10个作业),性能仍然比1个作业差。