zoukankan      html  css  js  c++  java
  • Linux System and Performance Monitoring

    写在前面:本文是对OSCon09的《Linux System and Performance Monitoring》一文的学习笔记,主要内容是总结了其中的要点,以及加上了笔者自己的一些理解。通过总结,一方面是为了加深笔者自己的理解,另一方面也是希望能对有需要的朋友有所帮助。

    做为一名服务器开发工程师,经常会有分析系统性能,解决系统性能瓶颈的需求。通常我们所说的性能问题,不外乎就是CPU/Memory/IO/Network这四个方面,这四个方面每个都有各自独特之处,同时也都是相互关联的。下面就分别从这四个方面展开进行介绍。

    CPU

    基本概念

    1. 内核调度的优先级:在Linux系统中,内核scheduler调度资源包括两种:threads(Process是由threads组成)和interrupt,这些被调度的资源是有特定的优先级的,以下从高到底:

      • Interrupts: Interrupt被设备用来通知内核相关的事件,优先级是最高的
      • Kernel(System) Processes:所有的系统进程都是以仅次于Interrupt的优先级被调度的
      • User Processes: 所有的应用程序都是run在用户态空间,以最低的优先级被内核调度

    2. 上下文切换(Context Switch): 线程在运行过程中,CPU时间片用完,或者是被更高优先级的的资源抢占了CPU,该线程都会被放到一个等待队列,等待下一次被调度,这样的一次过程称为一次上下文切换。另外,在用户程序调用系统调用(System call)的时候,也会发生上下文切换(这个也有叫Mode Switch的, 确实跟前面两种情况有所区别)。

    3. 运行队列(Run Queue)和负载(Load):

    • Run Queue: 在Linux系统中,每个CPU维护着一个run queue, 里面放着等待被执行的threads, run queue越大,在里面的线程等的时间越长
    • Load: Linux系统提供了1/5/15分钱的load, load是的值指的是当前running的threads数加上run queue中等待被执行的threads数

    4. CPU利用率(Utilization):

    • User Time(us): CPU在用户空间运行线程所花的时间的百分比
    • System Time(sy): CPU执行内核线程和中断(interrupt)所花的时间的百分比
    • Wait IO(wa): 所有进程因为等待IO完成而被阻塞,导致CPU idle所花的时间的百分比
    • Idle(id): CPU完全idle的时间的百分比
    常用工具

    1. vmstat: vmstat是linux下非常强大的工具,它的结果包含了比较全面的CPU和Memory相关的指标,这里只介绍CPU相关的.
    下图是vmstat使用时的一个截图:
    vmstat-use
    下图是vmstat CPU相关指标的介绍:
    vmstat-cpu

    2. top: top也是linux下比较常用的工具,它除了可以看系统整体的CPU/Memory使用情况,还可以单独看某个进程的每个线程的情况:
    下图是top看整体情况(top打开之后,按数字键’1′, 可以展开每个cpu的情况):
    top-use
    下图是top -p $pid -H看指定进程的(top打开之后,按字母键’c’,可以查看进程的参数详情):
    top-use2
    3. mpstat:mpstat是一个专门用来查看CPU使用情况的工具,通常用’mpstat -P ALL 2’来查看每个CPU的情况。这里最后面的数字’2’表示的是采样周期,Linux下有很多命令支持这样的参数,像sar/iostat/vmstat/mpstat等,很多资料是给的例子是用1,但在实践的过程中发现,用1的结果常常波动比较大,不稳定,所以在具体的实践中,笔者推荐用2或者更大一些的值,获得的结果相对稳定一些。

    经验之谈

    关于CPU,有下面一些经验可供参考:

    • Run Queue: 每个run queue最好不要超过3个threads在等待,转换到load, 就是load的值最好不要超过3倍的cpu核数,1倍核数是比较理想的状态,2-3倍是比较饱和的状态,再高就会影响系统正常运行了。
    • CPU Utilization: 推荐的比例是 us 60-70%, sy 30-35%, id 0-5%, 简单可以记us:sy=70:30, 这个是比较合适的比例,如果sy超过30,就会影响系统的正常运行
    • Context Switch: 上下文切换跟cpu利用率是直接相关的,如果cpu利用率符合上面说的比例,那么比较高的context switch是可以接受的

    Memory

    基本概念

    1. Memory Pages: Linux系统中内存是以页(Page)为基本来存取的,默认的页大小是4096Bytes, Linux下内存页可以分为下面几种类型:

    • Unreclaimable – locked, kernel, reserved pages
    • Swappable – anonymous memory pages
    • Syncable – pages backed by a disk file
    • Discardable – static pages, discarded pages

    2. kswapd: kswapd是用来保证系统有足够多的free memory的Linux daemon。它监控了内核的pages_high和pages_low这两个值,如果free memory的值低于pages_low, 它就会开始扫描内存并尝试free一些内存页,每次32个页,它会重复这个过程,一直到free memory的值达到pages_high这个值。kswapd在free内存页时,主要有下面几种情况:

    • 如果内存页没有被修改,它会直接放到free list
    • 如果内存页被修改了,而且该内存页是Syncable的,把该内存页的内容写回磁盘,然后把该内存页放到free list
    • 如果内存页被修改了,页且该内存页是Swappable(Anonymous)的,把该内存页写入到swap device, 然后把该内存页放到free list

    3. pdflush: pdflush是用来把内存页同步到对应的磁盘文件的Linux daemon. 比如说,一个文件在内存中被修改了,那么pdflush会把它写到磁盘上。当内存页中有10%的dirty页的话,pdflush就开始向文件系统同步这些dirty页。这个阈值可以通过vm.dirty_background_ratio这个内核参数来配置,缺省是10%.

    常用工具

    1. vmstat: 前面提到的vmstat同样也是用来查看内存使用情况的利器, 下图是vmstat中内存相关指标的介绍:
    vmstat-mem
    2. top: top同样可以用来看内存的使用情况,包括系统整体的情况,也有单独每个进程的:
    下图是系统整体的,其中total是总量,used/buffer/free跟vmstat的cache/buff/free是对应的:
    top-mem
    下图是单个进程的,其中virt是该进程使用的虚拟内存的大小(memory + disk pages),res是使用的物理内存的大小(only memory pages):
    top-per-proc

    经验之谈

    关于memory, 有下面一些经验之谈:

    • 比较低的free memory大小,表明系统有效地使用了内存;除非是在大量、持续的写swap device
    • 如果系统在持续读、写swap device, 表明系统内存不够了

    IO

    基本概念

    1. Page fault: 当应用程序要访问的数据不在正在使用的memory中的时候,就会发生page fault, 具体有下面两种类型的page faults:

    • Minor(MnPF): 数据在物理内存中,但在Fault发生的时候,还没在MMU(Memory Management Unit)登记,此时发生的Fault为Minor Page Fault.
    • Major(MPF): 数据不在物理内存中,需要从磁盘加载,此时发生的Fault为Major Page Fault.

    2. File Buffer Cache: 它是系统发生IO时,系统与磁盘之间的Cache, 主要目的就是最大化MnPF, 最小化MPF。前文中vmstat/top的截图中,buff对应的就是它的大小。
    3. Page Type: 前文中从回收的角度对memory page进行了分类,从IO的角度可以分为下面几类:

    • Read Pages:系统从磁盘加载的只读的Page, 这些Page会一直在内存中驻留,一直到系统内存紧张,内核才会将这些Page加入到free list,另做它用
    • Dirty Pages:系统从磁盘加载的Page, 并且做了修改。这些Page会被pdflush同步到磁盘。当系统内存紧张时,kswapd会将这些Page写入到磁盘
    • Anonymous Pages: 不属于某个进程的Page, 不能同步到磁盘。当系统内存紧张时,kswapd会将其swap到swap device, 以此来释放内存

    4. 磁盘IOPS计算:

    1
    
    IOPS = 1000 / {((1 / (RPM / 60)) * 1000 / 2)[rotation] + 3[seek] + 2[latency]}

    解释一下上面的公式:

    • rotation: 磁盘旋转时间,1/(RPM/60)是每转一圈所用的秒,*1000是转化为毫秒,/2是平均情况下,需要转半圈
    • seek: 寻道时间,3ms
    • latency: 数据传输时间,2ms
    • 最后用1000/(rotation + seek + latency)就是磁盘的IOPS,正常用的10000RPM的磁盘,算下来约是125 IOPS
    常用工具

    1. iostat: iostat是用来查看系统IO情况的利器, 下面介绍该工具:
    iosat -k -d -x 2的结果:
    iostat-2
    上图中,比较常用的r/w这两列分别是每秒的读/写请求数,也即IOPS;rkB/wkB是每秒读写的数据量,也即throughput; 最后三列分别是io wait时间,io请求serve的时间,也即io利用率。

    经验之谈

    关于IO,有下面一些经验之谈:

    • iowait正常情况下应该是0,如果持续非0的话,就说明对应的io设备overloaded了
    • 根据你的磁盘转数,计算它所能承受的IOPS,以此来判断当前的iops是否正常
    • 顺序读和随机读有一定的差异,这个也是要考虑的因素
    • 如果要监控磁盘的话,可以考虑监控持续一段时间的iowait和svctm, 如果这两个值持续比较大的话,对应的磁盘设备很大可能有问题
    • 监控swap和file system分区,确认虚拟内存和fs IO之间没有竞争

    Network

    基本概念

    1. 带宽: 当下比较常用的带宽用100Mbps, 1000Mbps, 10000Mbps,分别对应于我们平时提的百兆网、千兆网和万兆网。通常,我们在说带宽的时候,单位用的是bit, 但是在实际应用的时候,我们用的单位大多是Byte, 因此,上述三种网对应的Byte带宽分别约是12.5MBps, 125MBps, 1250MBps。

    常用工具

    1. sar: sar是一个全面的工具,这里介绍用它来看系统网络情况:
    sar-2
    2. iptraf: 查看指定设备实时的throughput
    下图是iptraf -d em1的结果:
    iptraf

    经验之谈

    关于Network, 有下面一些经验之谈:

      • 关于网络,最重要的就是查看的是网络带宽的使用是否符合预期,注意(bit/Byte)转换,另外也要注意上下行是独立的
  • 相关阅读:
    Linux下sed,awk,grep,cut,find学习笔记
    Python文件处理(1)
    KMP详解
    Java引用详解
    解决安卓中页脚被输入法顶起的问题
    解决swfupload上传控件文件名中文乱码问题 三种方法 flash及最新版本11.8.800.168
    null id in entry (don't flush the Session after an exception occurs)
    HQL中的Like查询需要注意的地方
    spring mvc controller间跳转 重定向 传参
    node to traverse cannot be null!
  • 原文地址:https://www.cnblogs.com/bodhitree/p/5066533.html
Copyright © 2011-2022 走看看