vmstat 是linux查看 CPU , 内存运行状态的入门工具, 把其作为性能诊断工具也是很强大。以此文做个记录.
1. 术语背景
(1) 打工仔--CPU
CPU 很无辜,是个任劳任怨的打工仔,每时每刻都有工作在做(进程、线程)并且自己有一张工作清单(可运行队列),由老板(进程调度)来决定他该干什么,他需要和老板沟通以便得到老板的想法并及时调整自己的工作(上下文切换),部分工作做完以后还需要及时向老板汇报(中断),所以打工仔(CPU)除了做自己该做的工作以外,还有大量时间和精力花在沟通和汇报上。
(2) page cache , buffer cache 傻傻分不清?
page cache用来缓存文件数据,buffer cache用来缓存磁盘数据。在有文件系统的情况下,对文件操作,那么数据会缓存到page cache,如果直接采用dd等工具对磁盘进行读写,那么数据会缓存到buffer cache。
(3) 虚拟内存是啥?
虚拟内存 = 物理内存 + swap
2. vmstat
执行: vmstat 2
看不懂? 下面开始分析每个字段:
§ r 可运行队列的线程数,这些线程都是可运行状态,只不过 CPU 暂时不可用;
§ b 被 blocked 的进程数,正在等待 IO 请求;
§ swpd,已使用的 SWAP 空间大小,KB 为单位;
§ free,可用的物理内存大小,KB 为单位;
§ buff,物理内存用来缓存读写操作的 buffer 大小,KB 为单位;
§ cache,物理内存用来缓存进程地址空间的 cache 大小,KB 为单位;
§ si,数据从 SWAP(磁盘) 读取到 RAM(swap in)的大小,KB 为单位;
§ so,数据从 RAM 写到 SWAP(磁盘)(swap out)的大小,KB 为单位;
§ bi,磁盘块从文件系统或 SWAP 读取到 RAM(blocks in)的大小,block 为单位;
§ bo,磁盘块从 RAM 写到文件系统或 SWAP(blocks out)的大小,block 为单位;
§ in 每秒CPU的中断次数,包括时间中断
§ cs 每秒上下文切换次数
§ us 用户占用 CPU 的百分比
§ sy 内核和中断占用 CPU 的百分比
§ id 空闲 CPU时间
§ Wt 所有可运行的线程被 blocked 以后都在等待 IO,这时候 CPU 空闲的百分比
3. 问题排查
如何根据vmstat 排查问题呢?
(1 ) 可运行队列线程数r太大 ?
每个可运行队列不应该超过3个线程(每个CPU核心),比如:双核心理器系统的可运行队列里不应该超过6个线程。理论最大单核> 5,CPU是瓶颈!
(2)Swapd si so 不为0 ?
这个通常是内存不足的信号,正常情况下这3个字段都会是0 ,表示IO操作没操作到swap分区,系统没有进行swap in/out操作。如果内存不足,系统就会临时操作到swap分区,严重会导致系统崩溃。
(3) free 太小 ,cache 太大?
free 正常情况下最好保持几百M的预留,如果free太小,也可能引起程序异常,虽然此时cached增长很快,容量很大。
可以手动释放cached容量
echo 3 > /proc/sys/vm/drop_caches
也可以修改限制最小预留大小:
echo xxx > /proc/sys/vm/min_free_kbytes 修改限制free 最小值
(4) buff 持续减少?
buff 稳步减少说明系统知道内存不够了,kwapd 正在从 buff 那里借用部分内存
(5) cs 太大 ?
进程切换成本大概平均是30us(微妙)一次,假如每秒8W的切换平均到每个核上(16核机器)是5000次每秒,耗费时间是5000*30us=150ms,也就是说有15%的时间耗费在进程切换上,如果这时候的iowait最高才1.5%,也就是说相比iowait此时进程切换带来的影响更大
另外:
context switch(cs)比 interrupts(in)要高得多,说明内核不得不来回切换进程.
(6) sy >> us ?
system time(sy)很高而 user time(us)很低,而且加上高频度的上下文切换(cs),说明正在运行的应用程序调用了大量的系统调用(system call)
system time(sy)一直保持在 80% 以上,而且上下文切换较低(cs),说明某个进程可能一直霸占着 CPU(不断请求资源)
(7) 中断太高?
interrupts(in)非常高,context switch(cs)比较低,说明这个 CPU 一直在不停的请求资源.
4. 更多参考:
http://www.cnblogs.com/ggjucheng/archive/2012/01/05/2312625.html
http://soft.chinabyte.com/os/50/12301550.shtml
http://www.vpsee.com/2009/11/linux-system-performance-monitoring-memory/
http://www.searchtb.com/2013/02/iowait_why_and_optimization.html