原帖地址:http://os.51cto.com/art/201006/203872.htm
在这篇文章中, 主要介绍 Linux 测试 cpu 性能的一些基础知识. 首先介绍一下 Linux kernel 中的调度器 (scheduler), 调度器负责调度系统中的两种资源,一是线程,二是中断.调度器给不同资源不同的优先级.
Linux 测试 cpu 性能从高到低为:
1. 硬件中断(Hardware Interrupts)-- 这些请求由硬件触发,比如磁盘已经完成了读写任务或是网卡受到了新的数据包.
2. 软件中断(Software Interrupts)-- 这里指的是维护内核运行的内核态软件中断.比如内核的时钟管理进程.
3. 实时进程(Real time threads)-- 实时进程比内核本身具备更高的优先级,它可以抢占内核的 CPU 时间片,在 2.4 内核是一个不可抢占的内核,它中不支持实时程序.
4. 内核进程(Kernel threads)-- 包括所以的内核程序.
5. 用户进程(User threads)-- 所有运行在用户态的进程.
关于 Linux 测试 cpu 性能,有 3 个重要的概念:上下文切换(context switchs),运行队列(Run queue)和使用率(utilization).
上下文切换:
目前流行的 CPU 在同一时间内只能运行一个线程,超线程的处理器可以在同一时间运行多个线程(包括多核 CPU),Linux 内核会把多核的处理器当作多个单独的 CPU 来识别.
一个标准的 Linux 内核何以支持运行 50~50000 个进程运行,对于普通的 CPU,内核会调度和执行这些进程.每个进程都会分到 CPU 的时间片来运行,当一个进程用完时间片或者被更高优先级的进程抢占后,它会备份到 CPU 的运行队列中,同时其他进程在 CPU 上运行.这个进程切换的过程被称作上下文切换.过多的上下文切换会造成系统很大的开销.
运行队列:
每个 CPU 都会维持一个运行队列,理想情况下,调度器会不断让队列中的进程运行.进程不是处在 sleep 状态就是 run able 状态. 如果 CPU 过载,就会出现调度器跟不上系统的要求,导致可运行的进程会填满队列.队列愈大,程序执行时间就愈长."load" 用来表示运行队列,用 top 命令我们可以看到 CPU 一分钟,5 分钟和 15 分钟内的运行队列的大小.这个值越大表明系统负荷越大.
Linux 测试 cpu 性能 CPU 使用率:
CPU 使用率可分为一下几个部分
User Time-执行用户进程的时间百分比;
System Time-执行内核进程和中断的时间百分比;
Wait IO-因为 IO 等待而使 CPU 处于 idle 状态的时间百分比;
Idle-CPU 处于 Idle 状态的时间百分比.
关于时间片和动态优先级:
时间片对于 CPU 来说是很关键的参数,如果时间片太长,就会使系统的交互性能变差,用户感觉不到并行.如果太短,又会造成系统频繁的上下文切换,使性能下降.对于 IO Bound 的系统来讲并不需要太长的时间片,因为系统主要是 IO 操作;而对于 CPU Bound 的系统来说需要长的时间片以保持 cache 的有效性.每一个进程启动的时候系统都会给出一个默认的优先级,但在运行过程中,系统会根据进程的运行状况不断调整优先级,内核会升高或降低进程的优先级(每次增加或降低 5),判断标准是根据进程处于 sleep 状态的时间.IO Bound 进程大部分时间在 sleep 状态,所以内核会调高它的优先级,CPU Bound 进程会被内核惩罚降低优先级.因此,如果一个系统上即运行 IO Bound 进程,又运行 CPU Bound 进程,我们会发现,IO Bound 进程的性能不会下降,而 CPU Bound 进程性能会不断下降.
我们运行一个 CPU Bound 的程序:cpu-hog.用 ps 命令可以看出它的优先级在不断下降.
term1# . / cpu - hog term2#
while : ; do ps - eo pid,
ni,
pri,
pcpu,
comm | egrep 'hog|PRI'; sleep 1; done PID NI PRI % CPU COMMAND 22855 0 20 84.5 cpu - hog PID NI PRI % CPU COMMAND 22855 0 18 89.6 cpu - hog PID NI PRI % CPU COMMAND 22855 0 15 92.2 cpu - hog PID NI PRI % CPU COMMAND 22855 0 15 93.8 cpu - hog
我们运行 find 命令,是一个 IO Bound 的程序,可以观察到它的优先级不断提高.
term1# find / term2#
while : ; do ps - eo pid,
ni,
pri,
pcpu,
comm | egrep 'find|PRI'; sleep 1; done PID NI PRI % CPU COMMAND 23101 0 20 0.0 find PID NI PRI % CPU COMMAND 23101 0 21 4.0 find PID NI PRI % CPU COMMAND 23101 0 23 3.5 find PID NI PRI % CPU COMMAND 23101 0 23 4.3 find PID NI PRI % CPU COMMAND 23101 0 23 4.2 find PID NI PRI % CPU COMMAND 23101 0 23 4.4 find
正如我们之前讨论的任何系统的性能比较都是基于基线的,并且监控 CPU 的性能就是以上 3 点,运行队列,CPU 使用率和上下文切换.以下是一些对于 CPU 很普遍的性能要求:
1. 对于每一个 CPU 来说运行队列不要超过 3,例如,如果是双核 CPU 就不要超过 6;
2. 如果 CPU 在满负荷运行,应该符合下列分布,
a) User Time:65%~70%
b) System Time:30%~35%
c) Idle:0%~5%
3. 对于上下文切换要结合 CPU 使用率来看,如果 CPU 使用满足上述分布,大量的上下文切换也是可以接受的.
常用的监视工具有,vmstat, top,dstat 和 mpstat.
# vmstat 1 procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu---- r b swpd free buff cache si so bi bo in cs us sy id wa 0 0 104300 16800 95328 72200 0 0 5 26 7 14 4 1 95 0 0 0 104300 16800 95328 72200 0 0 0 24 1021 64 1 1 98 0 0 0 104300 16800 95328 72200 0 0 0 0 1009 59 1 1 98 0
r 表示运行队列的大小,
b 表示由于 IO 等待而 block 的线程数量,
in 表示中断的数量,
cs 表示上下文切换的数量,
us 表示用户 CPU 时间,
sys 表示系统 CPU 时间,
wa 表示由于 IO 等待而是 CPU 处于 idle 状态的时间,
id 表示 CPU 处于 idle 状态的总时间.
总结的说,Linux 测试 CPU 性能监控包含以下方面:
检查系统的运行队列,确保每一个 CPU 的运行队列不大于 3.
确保 CPU 使用分布满足 70/30 原则(用户 70%,系统 30%).
如果系统时间过长,可能是因为频繁的调度和改变优先级.
CPU Bound 进程总是会被惩罚(降低优先级)而 IO Bound 进程总会被奖励(提高优先级).
来源: