(d) 当iowait占用率过高的时候,通常意味着某些程序的IO操作效率很低,或者IO对应设备的性能很低以至于读写操作需要很长的时间来完成;
(e) 当irq/softirq占用率过高的时候,很可能某些外设出现问题,导致产生大量的irq请求,这时候通过检查/proc/interrupts文件来深究问题所在;
(f) 当steal占用率过高的时候,黑心厂商虚拟机超售了吧!
第四行和第五行是物理内存和虚拟内存(交换分区)的信息:
total = free + used + buff/cache,现在buffers和cached Mem信息总和到一起了,但是buffers和cached
Mem的关系很多地方都没说清楚。其实通过对比数据,这两个值就是/proc/meminfo中的Buffers和Cached字段:Buffers是针对raw disk的块缓存,主要是以raw block的方式缓存文件系统的元数据(比如超级块信息等),这个值一般比较小(20M左右);而Cached是针对于某些具体的文件进行读缓存,以增加文件的访问效率而使用的,可以说是用于文件系统中文件缓存使用。
而avail Mem是一个新的参数值,用于指示在不进行交换的情况下,可以给新开启的程序多少内存空间,大致和free + buff/cached相当,而这也印证了上面的说法,free + buffers + cached Mem才是真正可用的物理内存。并且,使用交换分区不见得是坏事情,所以交换分区使用率不是什么严重的参数,但是频繁的swap in/out就不是好事情了,这种情况需要注意,通常表示物理内存紧缺的情况。
最后是每个程序的资源占用列表,其中CPU的使用率是所有CPU core占用率的总和。通常执行top的时候,本身该程序会大量的读取/proc操作,所以基本该top程序本身也会是名列前茅的。
top虽然非常强大,但是通常用于控制台实时监测系统信息,不适合长时间(几天、几个月)监测系统的负载信息,同时对于短命的进程也会遗漏无法给出统计信息。
1.2 vmstat
vmstat是除top之外另一个常用的系统检测工具,下面截图是我用-j4编译boost的系统负载。
r表示可运行进程数目,数据大致相符;而b表示的是uninterruptible睡眠的进程数目;swpd表示使用到的虚拟内存数量,跟top-Swap-used的数值是一个含义,而如手册所说,通常情况下buffers数目要比cached Mem小的多,buffers一般20M这么个数量级;io域的bi、bo表明每秒钟向磁盘接收和发送的块数目(blocks/s);system域的in表明每秒钟的系统中断数(包括时钟中断),cs表明因为进程切换导致上下文切换的数目。
说到这里,想到以前很多人纠结编译linux kernel的时候-j参数究竟是CPU Core还是CPU Core+1?通过上面修改-j参数值编译boost和linux kernel的同时开启vmstat监控,发现两种情况下context switch基本没有变化,且也只有显著增加-j值后context switch才会有显著的增加,看来不必过于纠结这个参数了,虽然具体编译时间长度我还没有测试。资料说如果不是在系统启动或者benchmark的状态,参数context switch>100000程序肯定有问题。
1.3 pidstat
如果想对某个进程进行全面具体的追踪,没有什么比pidstat更合适的了——栈空间、缺页情况、主被动切换等信息尽收眼底。这个命令最有用的参数是-t,可以将进程中各个线程的详细信息罗列出来。
-r: 显示缺页错误和内存使用状况,缺页错误是程序需要访问映射在虚拟内存空间中但是还尚未被加载到物理内存中的一个分页,缺页错误两个主要类型是:
(a). minflt/s 指的minor faults,当需要访问的物理页面因为某些原因(比如共享页面、缓存机制等)已经存在于物理内存中了,只是在当前进程的页表中没有引用之,这种情况下MMU只需要设置对应的entry就可以了,这个代价是相当小的;
(b). majflt/s 指的major faults(hard page fault),MMU需要在当前可用物理内存中申请一块空闲的物理页面(如果没有可用的空闲页面,则需要将别的物理页面切换到交换空间去以释放得到空闲物理页面),然后从外部低速设备加载数据到该物理页面中,并设置好对应的entry,这个代价是相当高的,和前者有几个数据级的差异;如果发生较多的major faults,虽然可以将交换分区建立在高速设备(比如PCI-E SSD)上改善性能,但主要是提示你缺物理内存了;
|
文章评论