1. 为什么系统负载很高,CPU使用率不高?
1)大量的中断
可能是在不断磁盘读写,网络通讯, 也可能是模块使用不当或者硬件上出问题导致外设不断给CPU送中断;
2)系统负载高(load/loadavg)
负载高表示有很多程序等待调度运行,它会导致上下文切换频繁。
3) 上下文切换过于频繁
上下文切换是指CPU从一个进程切换到另一个进程,这个过程也是需要消耗一定时间的。如果说上下文切换过于频繁,说明CPU用于执行进程代码的时间少了。第2点有提到负载高会引起上下文切换频繁,但是上下文切换频繁负载不一定就高。
2. 系统统计:
# vmstat -s
3850536 K total memory
435656 K used memory
444704 K active memory
482420 K inactive memory
2749692 K free memory
35036 K buffer memory
630152 K swap cache
4190204 K total swap
0 K used swap
4190204 K free swap
22097 non-nice user cpu ticks
398 nice user cpu ticks
57515 system cpu ticks
1832006 idle cpu ticks
19672 IO-wait cpu ticks
0 IRQ cpu ticks
19937 softirq cpu ticks
0 stolen cpu ticks
521649 pages paged in
747828 pages paged out
0 pages swapped in
0 pages swapped out
8836085 interrupts
13743858 CPU context switches
1618561648 boot time
84026 forks
cat /proc/stat
- ctxt 169484918 系统的上下文切换数
cat /proc/interrupts
- LOC: 16646624 17617208 19843962 18641958 Local timer interrupts
系统timer中断数
vmstat -n 1
每秒更新状态,有runqueue大小,cs的数量,swap in/out的数量,cpu的状态
进程统计:
pidstat -u -w 1
每秒刷新进程的cpu使用和上下文切换数量统计
cat /proc/752/status
- voluntary_ctxt_switches: 1625 主动放弃cpu执行的调度、切换
- nonvoluntary_ctxt_switches: 26 非自愿被调度,不然timer中断、外部中断
cat /proc/752/stack
当前wait chain (wchan)上的调用栈,backtrace(是不是感觉很不错)
3. CPU密集型:cpu时间片不够用,cpu使用率高
IO密集型: 进程频繁切换,执行一点就自动放弃,cpu使用率低。一般为磁盘读写、网络数据
有两个内核线程kswapd和events(新内核改为kworker),在特定情况下会表现得像IO密集型进程。
其中kswapd是用于管理虚拟内存的,当物理内存不足,需要频繁交换虚拟内存,kswapd的上下文切换将明显增多;
而events用来处理工作队列,当不断有work进入排队且这些work处理时间很短时,
events的上下文切换会明显增多
iotop
展示进程的io的使用
注意展示结果,可能和想的不一样,因为很多的io操作都是在内核线程完成的
100%IO并不意味着它正在使用所有IO操作.这意味着除了等待IO之外什么都不做.因此,具有低/零磁盘带宽的高%IO可以是正常的。btrfs-submit就是这种,死等IO结束什么也不做。