cpu scheduler负责调度两种资源:线程和中断 按优先级从高到低: 1)中断:设备告诉内核它们已经处理完成:如网卡发送完成了一个packet或是硬盘完成了一个io请求。 2)内核进程: 3)用户进程:
## 1. context switches:上下文切换
大多数的处理器在同一时刻只能运行一个进程,在多核处理器中,linux内核将每一个core当作一个独立的处理器。 一个内核可以同时运行50~50000个进程。如果只有一个cpu,内核必须负责高度和平衡这些进程。 每个线程将会分配一个时间片,直到这个线程的时间片用完,或是被更高优先级的线程抢占,它才会被重新放回cpu队列。切换线程的过程就是context switch。 每进行一次context switch,就要花费一些资源来将处理CPU寄存器和加入cpu队列。context switch越高,则内核调度的工作负担越大。
## 2.run queue
每个cpu都有一个运行队列。线程,要么在sleep状态(阻塞并等待IO),要么在运行状态。运行队列越长,则等待cpu处理这个线程的时间越长。 load就是用来描述运行队列的。它的值等于当前正在处理的线程+运行队列里面的线程。 比如当前系统核数是2,有两个线程正在执行行,还有4个线程在运行队列里面,那么它的load=2+4
## 3.cpu utilizaion
CPU的利用率。包含: user time: 用户空间的使用时间 system time: 内核空间的使用时间 wait io: 等待IO的时间(阻塞并等待IO) idle: 空闲时间
## 4.cpu性能监控
正常情况下的值: run queues: 每个处理器的run queue长度要<=3 cpu利用率: 56%-70%的user time 30%-35%的system time 0%-5%的idle time context switches:这个值与cpu利用率相关
## 5.cpu性能监控相关工具
vmstat,mpstat:
## 6.性能排查实例
实例1:
高的中断数量,少的上下文切换数量,说明是单个进程在访问硬件设备。 user time消耗了85%的时间,并且上下文切换少说明是可能是单个应用造成的。 实例2:
上下文切换大于中断,说明上下文切换花费的时间过多。 wa过多,表示是在等待IO。 可能是因为大量线程等待IO,需要将线程切换出去。
实例3: CPU0,CPU1正在处理cpu密集型的进程 CPU2空闲 CPU3处理内核和其它系统函数
ps -psr可以看到哪些进程在哪个核心运行 ps -eo pid,ni,pri,pcpu,psr,comm
## 7.总结:
1)每个核的run queue <=3 2)cpu利用率:用户空间(70%)内核空间(30%) 3)如果内核空间战用过多,很可能是负荷过重,内核花太多的资源在进行优先级调度 4)running CPU bound process(绑定CPU) always get penalized while I/O process are rewarded;?
来源链接:http://www.trueeyu.com/?p=1749 网摘文章,如有问题,请联系我们