Linux性能之CPU性能
CPU的性能依赖于它所获取的资源。内核有个调度器,负责调度两种类型的资源:线程(单or多)和中断。调度器赋予不同的资源不同的优先级。其中中断最高,然后内核(系统)进程次之,用户进程为最后。内核如何管理着三种不同资源?在说之前需要了解几个概念:上下文切换、运行队列、吞吐量。
上下文切换:
许多现代单核处理器一段时间只能运行一个进程或者线程;在许多双核或者多核处理器上,Linux系统把每个核当作是单一的处理器,这样就可以并行运行多个进程或者线程。一个标准的Linux内核支持50~50000个线程。若CPU的数量有限,只能去调度和平衡这些线程。对于每个线程,CPU都会为其定量地分配时间,在线程运行期间如果被高优先级的线程打断,优先级高的进程占用处理器,此线程进入一个队列,这样一个过程称为上下文切换。内核每次只能响应一个上下文切换,线程离开CPU寄存器进入一个队列。一个系统的上下文切换切换越多,为了管理进程的调度,内核的负担加重。
运行队列:
每个CPU管理着一个运行队列,我们知道线程(或者进程)要么是睡眠状态(阻塞和等待IO),要么是运行状态。如果CPU子系统处于高负载的状态,内核调度器可能无法满足系统,这样的结果就是可运行的进程塞满运行队列,那么一个运行队列越大,程序执行时间就越久。在监控性能软件中,一个叫做load的子目录,经常用来描述运行队列的状态。系统的负载是由当前已经执行的线程数量和在CPU运行队列里的线程数量组成。比如说在一个双核系统中,有4个线程是在运行队列中,那么其负载就是6。使用dstat -lamp命令进行查看的时候,第一列的load-avg,显示的就是在1,5,15分钟的平均情况。
CPU的吞吐量:
CPU的吞吐量定义为CPU使用的百分比,CPU的吞吐量对于衡量一个系统的好坏致关重要,CPU吞吐量分为以下几个类型:
用户时间:也就是CPU在用户空间执行线程是所花费时间的百分比;
系统时间:CPU在执行内核线程或者处理中断时候所花费时间的百分比;
IO等待时间:线程被阻塞等待IO请求完成,这期间CPU所花费的时间百分比;
空闲时间:CPU啥事情都不干所花费时间的百分比。
了解上面概念后,像前面一篇博客里提到,衡量的时候我们需要一个基线,CPU性能的这几个基线如下:
运行队列:单个处理器上的一个运行队列内一般所包含的线程不超过1~3个,比如一个双核处理器,在运行队列内不应当超过6个线程。
CPU吞吐量:如果CPU是满载的,那么会有下面的指标:
user time:65%~70%;system time:30%~35%;idle time:0%~5%。
上下文切换:上下文切换的数量和CPU负载直接相关。如果CPU的负载一直保持在之前可接受的平衡范围内,那么数目特别大的上下文切换是可接受的。
在上一篇博客里提到了vmstat,接下来对这个命令进行解析,比如每隔1秒打印出系统的情况:
r:运行队列内线程的数目,这些线程是可运行的,但是CPU无法执行他们。
b:被阻塞等待IO请求完成的线程的数目。
in:运行的中断的数目。
cs:当前操作系统中上下文切换的数目。
us:用户CPU负载的百分比;
sys:内核和中断负载的百分比;
wa:处理器在线程阻塞等待IO请求所占的百分比;
id:CPU完全空闲的时间百分比;
根据上面这参数所表达的意思就可看出CPU性能那部分出问题。其实可以直接查看CPU的状态,使用mpstat命令。终端键入下面命令监控所有的CPU:
上面命令是查看所有CPU的状态,每隔1秒钟打印一次。
其实监控CPU的性能只要把握以下几点即可:
1、检查系统运行队列,确保每个处理器上不超过3个可运行的线程;
2、确保CPU的负载,用户空间不超过70%,系统不超过30%。
3、当CPU在系统空间花费较多的时间,这种情况下是过载,需要尝试重新安排优先级。
4、运行CPU范畴的进程效果不是很好,而IO范畴的进程则效果很不错。