测试服务器性能
操作系统是 CentOS
CONCURRENCY=8
TIME_START=`date`
for ((idx = 0; idx < $CONCURRENCY; idx++))
do
time echo "scale=5000; a(1)*4" | bc -l > /dev/null &
done
echo "$TIME_START Start"
RUNNING_PROCESS_NUM=1
while [ $RUNNING_PROCESS_NUM -gt 0 ]
do
printf ".";
sleep 1
RUNNING_PROCESS_NUM=$(ps ax | grep ' bc -l' | grep -v 'grep' | wc -l)
done
TIME_STOP=`date`
echo "$TIME_STOP Stop"
输出是这个样子:
...........................................................................................................
real 2m23.185s
user 0m35.672s
sys 0m0.003s
.
real 2m23.394s
user 0m35.712s
sys 0m0.004s
real 2m23.537s
user 0m35.738s
sys 0m0.004s
real 2m23.552s
user 0m35.753s
sys 0m0.004s
real 2m23.557s
user 0m35.775s
sys 0m0.005s
real 2m23.563s
user 0m35.807s
sys 0m0.005s
real 2m23.624s
user 0m35.853s
sys 0m0.000s
real 2m23.748s
user 0m35.888s
sys 0m0.002s
Fri Nov 16 14:58:13 CST 2012 Stop
解释一下我理解的输出。
real 就是从开始,到所有进程结束,实际花费的总时间。
user 是一个 CPU 核心,跑完一个进程花费的时间。
我这是跑了 8 个并发进程,平均每个进程的耗时是 35.8 秒,按照这个计算,总耗时应该是 286 秒。
但看我 Start 和 Stop 的实际输出,只用了 2 分 25 秒,跟 real 是吻合的,换算成纯时间,是 145 秒,基本是 286 的一半。
为什么是一半?
因为我的服务器是双核。
怎么看几核 CPU ?
最简单的方法,就是 top 命令,然后按数字 1,就能展开所有 Cpu,数一数就知道是几核了。
也就是,双核处理器会把原本单核处理器所需要的计算时间减少为一半。
为了证实我的观点,我在单核服务器上测试,也在 8 核处理器上测试,结果如下:
1 核心 CPU
..........................................................................................................................................................................................................................
real 4m41.794s
user 0m35.129s
sys 0m0.022s
.
real 4m42.468s
user 0m35.241s
sys 0m0.026s
real 4m42.529s
user 0m35.241s
sys 0m0.026s
real 4m42.788s
user 0m35.187s
sys 0m0.018s
real 4m43.017s
user 0m35.204s
sys 0m0.021s
real 4m42.777s
user 0m35.189s
sys 0m0.029s
real 4m42.802s
user 0m35.217s
sys 0m0.021s
real 4m42.830s
user 0m35.232s
sys 0m0.028s
Fri Nov 16 15:37:51 CST 2012 Stop
4 核心 CPU
.....................................................................................................................................
real 2m31.157s
user 1m13.471s
sys 0m0.086s
real 2m31.468s
user 1m13.749s
sys 0m0.065s
.
real 2m31.985s
user 1m13.807s
sys 0m0.085s
real 2m32.060s
user 1m13.840s
sys 0m0.113s
real 2m32.095s
user 1m13.730s
sys 0m0.081s
real 2m32.149s
user 1m13.910s
sys 0m0.070s
real 2m32.350s
user 1m14.029s
sys 0m0.070s
.
real 2m32.688s
user 1m13.662s
sys 0m0.114s
Fri Nov 16 15:38:08 CST 2012 Stop
8 核心 CPU
................................
real 0m35.736s
user 0m35.343s
sys 0m0.006s
.
real 0m35.779s
user 0m35.386s
sys 0m0.001s
real 0m35.915s
user 0m35.395s
sys 0m0.004s
real 0m35.982s
user 0m35.442s
sys 0m0.004s
real 0m36.131s
user 0m35.434s
sys 0m0.006s
real 0m36.396s
user 0m35.448s
sys 0m0.101s
..
real 0m38.238s
user 0m35.491s
sys 0m0.005s
..........
real 0m48.669s
user 0m35.412s
sys 0m0.012s
Fri Nov 16 15:32:39 CST 2012 Stop
其实我搞这个测试的最初目的,是在考虑单核心 CPU 的 VPS 服务器是否可以满足需要,从 user 这个数值上,可以判断 CPU 单核心的处理能力。在 CPU 运算密集的程序运行时,多核心的优势还是很明显,但前提是你的程序得能分成多个进程,或者你写多线程的。
测试 VPN 的 CPU 运算能力,这个脚本还是很有用的。
我测试得出的结论,user 在 35 秒左右的,CPU 都很棒。
但上面那个 4 核心的结果,user 时间是 1m13s,真有够慢。明显这个 VPS 的 CPU 比较忙,运算能力差,还好是 4 核心,要是单核心就太慢了。
上面这个测试 CPU 脚本的 shell 是我写的,但是命令是从下面这个网站找到的。
http://duguo.org/kb/server/test/simple_linux_benchmark.html
这里还介绍了测试 DISK 和 NETWORK 的命令以及输出结果,我也 copy 了一份备用:
CPU
DISK
time dd bs=1M count=5000 if=/tmp/dd.test of=/dev/null
rm -f /tmp/dd.test
NETWORK-SERVER
NETWORK-CLIENT
Sample Output
real 0m42.638s
user 0m42.623s
sys 0m0.012s
leakon@server:~$ time dd bs=1M count=5000 if=/dev/zero of=/tmp/dd.test
5000+0 records in
5000+0 records out
5242880000 bytes (5.2 GB) copied, 92.0074 s, 57.0 MB/s
real 1m32.013s
user 0m0.004s
sys 0m6.996s
leakon@server:~$ time dd bs=1M count=5000 if=/tmp/dd.test of=/dev/null
5000+0 records in
5000+0 records out
5242880000 bytes (5.2 GB) copied, 2.79148 s, 1.9 GB/s
real 0m2.797s
user 0m0.188s
sys 0m2.608s
leakon@server:~$ rm -f /tmp/dd.test
leakon@server:~$ time dd if=/dev/zero bs=1M count=1000 | nc 10.235.47.219 2222 -v
Connection to 10.235.47.219 2222 port [tcp/*] succeeded!
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 113.536 s, 9.2 MB/s
real 1m53.590s
user 0m0.948s
sys 0m7.176s
leakon@server:~$ nc -v -l 2222 > /dev/null
Connection from 10.235.47.219 port 2222 [tcp/*] accepted