上下文切换
一、运行vmstat,观察上下文切换的情况:
vmstat 1
R列,就绪队列的长度远远超过CPU个数,所以肯定会有大量的CPU竞争
us和sy,这两列的CPU使用率,其中系统CPU使用率很高,说明CPU主要被内核占用
in列:中断次数很高,说明中断处理也是个潜在的问题
综合这几个指标,可以知道,系统的就绪队列过长,也就是正在运行和等待CPU的进程数过多,导致了大量的上下文切换,而上下文切换又导致了系统CPU使用率升高。
二、继续分析,用pidstat来看一下,CPU和进程上下文切换的情况:
-wt 参数表示输出线程的上下文切换指标
pidstat -wt 1
pidstat的输出中,可以看到是哪个线程上下文切换过多。
三、接下来,继续分析中断次数上升的根源(中断只发生在内核态)
从/proc/interrupts这个只读文件读取,提供了一个只读的中断使用情况
watch -d cat /proc/interrupts(动态显示)
总结:
上下文切换指标:
(1).上下文切换次数取决于系统本身的CPU性能,如果系统的上下文切换次数比较稳定,那么从数百到1万以内都是正常的
(2).当上下文切换次数超过1万次,或者切换次数出现数量级增长时,就很可能已经出现了性能问题
同一个进程下线程上下文切换,因为共享虚拟内存,切换过程中,虚拟内存这些资源保持不变,只需要切换线程的私有数据,寄存器等不共享的数据。(多线程代替多进程)
自愿上下文切换变多了,说明进程都在等待资源,有可能发生IO等其他问题
非自愿上下文切换变多了,说明进程都在被强制调度,都在争抢CPU,说明CPU的确成了瓶颈
中断上下文切换变多了,说明CPU被中断处理程序占用,需要通过查看 /proc/interrupts文件分析具体的中断类型