cpu scheduler负责调度两种资源:线程和中断, 按优先级从高到低:

  • 中断:设备告诉内核它们已经处理完成:如网卡发送完成了一个packet或是硬盘完成了一个io请求。
  • 内核进程:
  • 用户进程:

context switches:上下文切换

大多数的处理器在同一时刻只能运行一个进程,在多核处理器中,linux内核将每一个core当作一个独立的处理器。

一个内核可以同时运行50~50000个进程。如果只有一个cpu,内核必须负责高度和平衡这些进程。

每个线程将会分配一个时间片,直到这个线程的时间片用完,或是被更高优先级的线程抢占,它才会被重新放回cpu队列。切换线程的过程就是context switch。

每进行一次context switch,就要花费一些资源来将处理CPU寄存器和加入cpu队列。context switch越高,则内核调度的工作负担越大。

run queue

每个cpu都有一个运行队列。线程,要么在sleep状态(阻塞并等待IO),要么在运行状态。运行队列越长,则等待cpu处理这个线程的时间越长。

load就是用来描述运行队列的。它的值等于当前正在处理的线程+运行队列里面的线程。

比如当前系统核数是2,有两个线程正在执行行,还有4个线程在运行队列里面,那么它的load=2+4

cpu utilizaion

CPU的利用率。包含:

  • user time: 用户空间的使用时间
  • system time: 内核空间的使用时间
  • wait io: 等待IO的时间(阻塞并等待IO)
  • idle: 空闲时间

cpu性能监控

正常情况下的值:

  • run queues: 每个处理器的run queue长度要<=3

cpu利用率:

  • 56%-70%的user time
  • 30%-35%的system time
  • 0%-5%的idle time

context switches:这个值与cpu利用率相关

cpu性能监控相关工具

vmstat,mpstat:


性能排查实例

实例1

高的中断数量,少的上下文切换数量,说明是单个进程在访问硬件设备。
user time消耗了85%的时间,并且上下文切换少说明是可能是单个应用造成的。

实例2

上下文切换大于中断,说明上下文切换花费的时间过多。

wa过多,表示是在等待IO。

可能是因为大量线程等待IO,需要将线程切换出去。

实例3

CPU0,CPU1正在处理cpu密集型的进程

CPU2空闲

CPU3处理内核和其它系统函数

ps -psr可以看到哪些进程在哪个核心运行

ps -eo pid,ni,pri,pcpu,psr,comm

总结:

  • 每个核的run queue <=3
  • cpu利用率:用户空间(70%)内核空间(30%)
  • 如果内核空间战用过多,很可能是负荷过重,内核花太多的资源在进行优先级调度
  • running CPU bound process(绑定CPU) always get penalized while I/O process are rewarded;?

Comments

2015-11-30