服务器 CPU 性能测试 命令行工具

测试服务器性能

操作系统是 CentOS

 

#!/bin/bash

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"

 

输出是这个样子:
 

Fri Nov 16 14:55:48 CST 2012 Start
...........................................................................................................
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

Fri Nov 16 15:33:07 CST 2012 Start
..........................................................................................................................................................................................................................
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

Fri Nov 16 15:35:34 CST 2012 Start
.....................................................................................................................................
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

Fri Nov 16 15:31:50 CST 2012 Start
................................
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

time echo "scale=5000; a(1)*4" | bc -l > /dev/null

DISK

time dd bs=1M count=5000 if=/dev/zero of=/tmp/dd.test
time dd bs=1M count=5000 if=/tmp/dd.test of=/dev/null
rm -f /tmp/dd.test

NETWORK-SERVER

nc -v -l 2222 > /dev/null

NETWORK-CLIENT

time dd if=/dev/zero bs=1M count=1000 | nc SERVER_HOST_NAME 2222 -v

Sample Output

leakon@server:~$ time echo "scale=5000; a(1)*4" | bc -l > /dev/null
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

Leave a Reply

Your email address will not be published.

*