• Linux下性能调试工具运维笔记


    作为一名资深的linux运维工程师,为方便了解和追求服务器的高性能,如cpu、内存、io、网络等等使用情况,要求运维工程师必须要熟练运用一些必要的系统性能调试工具,liunx下提供了众多命令方便查看各种资源的使用情况。经常用的有ps、top、free、mpstat、iostat、vmstat、netstat。。下面简单介绍下这几个工具的使用:

    一、top
    top是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。top显示系统当前的进程和其他状况,是一个动态显示过程,即可以通过用户按键来不断刷新当前状态。如果在前台执行该命令,它将独占前台,直到用户终止该程序为止。 比较准确的说,top命令提供了实时的对系统处理器的状态监视。它将显示系统中CPU最“敏感”的任务列表,该命令可以按CPU使用,内存使用和执行时间对任务进行排序;而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定.

    命令使用
    top使用格式
    top [-] [d] [p] [q] [c] [C] [S] [s] [n]

    参数说明
    d   指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用s交互命令来改变之。
    p   通过指定监控进程ID来仅仅监控某个进程的状态。
    q   该选项将使top没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行。
    S  指定累计模式
    s  使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险。
    i   使top不显示任何闲置或者僵死进程。
    c  显示整个命令行而不只是显示命令名

    [root@jumpserver01 ~]# top -c
    top - 15:41:05 up 38 days, 14 min,  4 users,  load average: 29.03, 29.03, 29.00
    Tasks: 897 total,  30 running, 867 sleeping,   0 stopped,   0 zombie
    Cpu(s): 71.8%us,  0.8%sy,  0.0%ni, 27.4%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
    Mem:  65724264k total, 37654212k used, 28070052k free,   371320k buffers
    Swap: 32767996k total,        0k used, 32767996k free, 31845892k cached
    
       PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                               
     22107 duanjunf  20   0  360m  37m 4768 R 100.0  0.1  28162:37 python /data/jumpserver/connect.py                                    
     38740 sunyuanc  20   0  360m  36m 4768 R 100.0  0.1  24262:12 python /data/jumpserver/connect.py                                    
     38766 sunyuanc  20   0  360m  36m 4768 R 100.0  0.1  24261:54 python /data/jumpserver/connect.py                                    
     68261 xieyidan  20   0  360m  36m 4768 R 100.0  0.1  19655:44 python /data/jumpserver/connect.py                                    
     97841 sunyuanc  20   0  360m  37m 4768 R 100.0  0.1  44953:16 python /data/jumpserver/connect.py                                    
    104229 wangbinr  20   0  360m  36m 4768 R 100.0  0.1  44451:25 python /data/jumpserver/connect.py                                    
    115357 shanghai  20   0  360m  37m 4768 R 100.0  0.1  13165:59 python /data/jumpserver/connect.py                                    
    115545 shanghai  20   0  360m  36m 4768 R 100.0  0.1  13160:54 python /data/jumpserver/connect.py                                    
    115582 shanghai  20   0  360m  37m 4768 R 100.0  0.1  13160:10 python /data/jumpserver/connect.py                                    
    128364 duanjunf  20   0  360m  37m 4768 R 100.0  0.1  41810:20 python /data/jumpserver/connect.py                                    
    141827 sunyuanc  20   0  360m  36m 4768 R 100.0  0.1  40111:40 python /data/jumpserver/connect.py                                    
    170184 duanjunf  20   0  360m  36m 4768 R 100.0  0.1  34627:54 python /data/jumpserver/connect.py                                    
    180787 sunyuanc  20   0  360m  36m 4768 R 100.0  0.1  33316:45 python /data/jumpserver/connect.py                                    
     11168 xieyidan  20   0  360m  36m 4768 R 99.7  0.1  29940:19 python /data/jumpserver/connect.py                                     
     46745 wangbinr  20   0  360m  37m 4768 R 99.7  0.1  22848:20 python /data/jumpserver/connect.py                                     
     50740 wangbinr  20   0  360m  37m 4768 R 99.7  0.1  22601:23 python /data/jumpserver/connect.py                                     
     62308 xieyidan  20   0  360m  37m 4768 R 99.7  0.1  20280:22 python /data/jumpserver/connect.py                                     
     73232 xieyidan  20   0  360m  35m 4768 R 99.7  0.1  18553:01 python /data/jumpserver/connect.py                                     
     93496 chengjun  20   0  360m  36m 4768 R 99.7  0.1  14455:38 python /data/jumpserver/connect.py                                     
     93799 chengjun  20   0  360m  37m 4768 R 99.7  0.1  14417:51 python /data/jumpserver/connect.py
    
    
    以上指令信息解释:
    统计信息区前五行是系统整体的统计信息。
    1)第一行是任务队列信息,同 uptime 命令的执行结果。内容如下:
    15:41:05               当前时间
    up 38 days, 14 min     系统运行时间,格式为时:分
    4 users                当前登录用户数
    load average: 29.03, 29.03, 29.00    系统负载,即任务队列的平均长度。三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。
    
    2)第二、三行为进程和CPU的信息。当有多个CPU时,这些内容可能会超过两行。内容如下:(top命令回车后,按数字"1"就会显示cpu的核数,前提是当前屏幕足够大,能够全部显示cpu核数)
    total 进程总数
    running 正在运行的进程数
    sleeping 睡眠的进程数
    stopped 停止的进程数
    zombie 僵尸进程数
    Cpu(s): 
    71.8% us 用户空间占用CPU百分比
    0.8% sy 内核空间占用CPU百分比
    0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比
    27.4% id 空闲CPU百分比
    0.0% wa 等待输入输出的CPU时间百分比
    0.0%hi:硬件CPU中断占用百分比
    0.0%si:软中断占用百分比
    0.0%st:虚拟机占用百分比
    
    3)最后两行为内存信息。内容如下:
    Mem:
    65724264k total    物理内存总量
    37653788k used    使用的物理内存总量
    28070476k free    空闲内存总量
    371320k buffers    用作内核缓存的内存量
    Swap: 
    32767996k total    交换区总量
    0k used            使用的交换区总量
    32767996k free    空闲交换区总量
    31845892k cached    缓冲的交换区总量,内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,该数值即为这些内容已存在于内存中的交换区的大小,相应的内存再次被换出时可不必再对交换区写入。
    
    4)进程信息区统计信息区域的下方显示了各个进程的详细信息。
     列名    含义
     PID     进程id
     PPID    父进程id
     RUSER   Real user name
     UID     进程所有者的用户id
     USER    进程所有者的用户名
     GROUP   进程所有者的组名
     TTY     启动进程的终端名。不是从终端启动的进程则显示为 ?
     PR      优先级
     NI      nice值。负值表示高优先级,正值表示低优先级
     P       最后使用的CPU,仅在多CPU环境下有意义
     %CPU    上次更新到现在的CPU时间占用百分比
     TIME    进程使用的CPU时间总计,单位秒
     TIME+   进程使用的CPU时间总计,单位1/100秒
     %MEM    进程使用的物理内存百分比
     VIRT    进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
     SWAP    进程使用的虚拟内存中,被换出的大小,单位kb。
     RES     进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
     CODE    可执行代码占用的物理内存大小,单位kb
     DATA    可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
     SHR     共享内存大小,单位kb
     nFLT    页面错误次数
     nDRT    最后一次写入到现在,被修改过的页面数。
     S       进程状态(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程)
     COMMAND 命令名/命令行
     WCHAN   若该进程在睡眠,则显示睡眠中的系统函数名
     Flags   任务标志,参考 sched.h
    
    
    默认情况下仅显示比较重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。
    
    从使用角度来看,熟练的掌握这些命令比掌握选项还重要一些。这些命令都是单字母的,如果在命令行选项中使用了s选项,则可能其中一些命令会被屏蔽掉。
    ------------------------------------------------------------------------------------------------------------------------------------------
    Ctrl+L   擦除并且重写屏幕。 
    h或者?   显示帮助画面,给出一些简短的命令总结说明。 
    k        终止一个进程。系统将提示用户输入需要终止的进程PID,以及需要发送给该进程什么样的信号。一般的终止进程可以使用15信号;如果不能正常结束那就使用信号9强制结束该进程。默认值是信号15。在安全模式中此命令被屏蔽。 
    i   忽略闲置和僵死进程。这是一个开关式命令。 
    q   退出程序。 
    r   重新安排一个进程的优先级别。系统提示用户输入需要改变的进程PID以及需要设置的进程优先级值。输入一个正值将使优先级降低,反之则可以使该进程拥有更高的优先权。默认值是10。 
    S   切换到累计模式。 
    s   改变两次刷新之间的延迟时间。系统将提示用户输入新的时间,单位为s。如果有小数,就换算成m s。输入0值则系统将不断刷新,默认值是5 s。需要注意的是如果设置太小的时间,很可能会引起不断刷新,从而根本来不及看清显示的情况,而且系统负载也会大大增加。 
    l   切换显示平均负载和启动时间信息。 
    m   切换显示内存信息。 
    t   切换显示进程和CPU状态信息。 
    c   切换显示命令名称和完整命令行。 
    M   根据驻留内存大小进行排序。 
    P   根据CPU使用百分比大小进行排序。 
    T   根据时间/累计时间进行排序。 
    W   将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法。
    f或者F    从当前显示中添加或者删除项目。 按 f 键之后会显示列的列表,按 a-z 即可显示或隐藏对应的列,最后按回车键确定。
    o或者O    改变显示项目的顺序。 按小写的 a-z 可以将相应的列向右移动,而大写的 A-Z 可以将相应的列向左移动。最后按回车键确定。
    按大写的M   可以降序显示内存使用率
    按大写的P   可以降序显示CPU使用率
    
    ---------------------------------------------------------------------------------------------------------------------------------------
    常用操作命令:
    # top          //每隔5秒显式所有进程的资源占用情况
    # top -d 2         //每隔2秒显式所有进程的资源占用情况
    # top -c           //每隔5秒显式进程的资源占用情况,并显示进程的命令行参数(默认只有进程名)
    # top -p 12345 -p 6789        //每隔5秒显示pid是12345和pid是6789的两个进程的资源占用情况
    # top -d 2 -c -p 123456       //每隔2秒显示pid是12345的进程的资源使用情况,并显式该进程启动的命令行参数
    

    二、sar
    sar(System Activity Reporter系统活动情况报告)是目前Linux上最为全面的系统性能分析工具之一,它将指定的操作系统状态计数器显示到标准输出设备,可以从多方面对系统的活动进行报告,包括:文件的读写情况、 系统调用的使用情况、磁盘I/O、CPU效率、内存使用状况、进程活动及IPC有关的活动等。sar工具将对系统当前的状态进行取样,然后通过计算数据和比例来表达系统的当前运行状态。它的特点是可以连续对系统取样,获得大量的取样数据。取样数据和分析的结果都可以存入文件,使用它时消耗的系统资源很小。

    sar命令常用格式
    sar [options] [-A] [-o file] t [n]

    其中:
    t为采样间隔,n为采样次数,默认值是1;
    -o file表示将命令结果以二进制格式存放在文件中,file 是文件名。
    options 为命令行选项

    sar命令常用选项如下:

    [root@jumpserver01 ~]# sar --help
    用法: sar [ 选项 ] [ <时间间隔> [ <次数> ] ]
    Options are:
    [ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -m ] [ -p ] [ -q ] [ -r ] [ -R ]
    [ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]
    [ -I { <int> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]
    [ -j { ID | LABEL | PATH | UUID | ... } ] [ -n { <keyword> [,...] | ALL } ]
    [ -o [ <filename> ] | -f [ <filename> ] ] [ --legacy ]
    [ -i <interval> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]
    
    -A:所有报告的总和
    -u:输出CPU使用情况的统计信息
    -v:输出inode、文件和其他内核表的统计信息
    -d:输出每一个块设备的活动信息
    -r:输出内存和交换空间的统计信息
    -b:显示I/O和传送速率的统计信息
    -a:文件读写情况
    -c:输出进程统计信息,每秒创建的进程数
    -R:输出内存页面的统计信息
    -y:终端设备活动情况
    -w:输出系统交换活动信息

    使用案例:
    1)CPU资源监控
    例如,每10秒采样一次,连续采样3次,观察CPU 的使用情况,并将采样结果以二进制形式存入当前目录下的文件test中,需键入如下命令:

    [root@jumpserver01 ~]# sar -u -o test 10 3
    Linux 2.6.32-696.el6.x86_64 (centos6-vm01)  01/04/18    _x86_64_    (4 CPU)
    
    00:09:49        CPU     %user     %nice   %system   %iowait    %steal     %idle
    00:09:59        all      0.00      0.00      0.03      0.05      0.00     99.92
    00:10:09        all      0.05      0.00      0.08      0.10      0.00     99.77
    00:10:19        all      0.00      0.00      0.00      0.05      0.00     99.95
    Average:        all      0.02      0.00      0.03      0.07      0.00     99.88
    
    [root@jumpserver01 ~]# ll test
    -rw-r--r--. 1 root root 42632 Jan  4 00:10 test
    
    输出项说明:
    CPU:all 表示统计信息为所有 CPU 的平均值。
    %user:显示在用户级别(application)运行使用 CPU 总时间的百分比。
    %nice:显示在用户级别,用于nice操作,所占用 CPU 总时间的百分比。
    %system:在核心级别(kernel)运行所使用 CPU 总时间的百分比。
    %iowait:显示用于等待I/O操作占用 CPU 总时间的百分比。
    %steal:管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。
    %idle:显示 CPU 空闲时间占用 CPU 总时间的百分比。
    
    1. 若 %iowait 的值过高,表示硬盘存在I/O瓶颈
    2. 若 %idle 的值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量
    3. 若 %idle 的值持续低于1,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU 。
    
    如果要查看二进制文件test中的内容,需键入如下sar命令:
    [root@jumpserver01 ~]# sar -u -f test
    Linux 2.6.32-696.el6.x86_64 (centos6-vm01)  01/04/18    _x86_64_    (4 CPU)
    
    00:09:49        CPU     %user     %nice   %system   %iowait    %steal     %idle
    00:09:59        all      0.00      0.00      0.03      0.05      0.00     99.92
    00:10:09        all      0.05      0.00      0.08      0.10      0.00     99.77
    00:10:19        all      0.00      0.00      0.00      0.05      0.00     99.95
    Average:        all      0.02      0.00      0.03      0.07      0.00     99.88
    

    2)inode、文件和其他内核表监控
    例如,每10秒采样一次,连续采样3次,观察核心表的状态,需键入如下命令:

    [root@jumpserver01 ~]# sar -v 10 3
    Linux 2.6.32-696.el6.x86_64 (centos6-vm01)  01/04/18    _x86_64_    (4 CPU)
    
    00:13:17    dentunusd   file-nr  inode-nr    pty-nr
    00:13:27       106660       960     64780         2
    00:13:37       106660       960     64780         2
    00:13:47       106660       960     64780         2
    Average:       106660       960     64780         2
    
    输出项说明:
    dentunusd:目录高速缓存中未被使用的条目数量
    file-nr:文件句柄(file handle)的使用数量
    inode-nr:索引节点句柄(inode handle)的使用数量
    pty-nr:使用的pty数量
    

    3)内存和交换空间监控
    例如,每10秒采样一次,连续采样3次,监控内存分页

    [root@jumpserver01 ~]# sar -r 10 3
    Linux 2.6.32-696.el6.x86_64 (centos6-vm01)  01/04/18    _x86_64_    (4 CPU)
    
    00:14:42    kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit
    00:14:52       551360   5441372     90.80    142256   4907464    135520      1.12
    00:15:02       551360   5441372     90.80    142256   4907464    135520      1.12
    00:15:12       551360   5441372     90.80    142260   4907464    135520      1.12
    Average:       551360   5441372     90.80    142257   4907464    135520      1.12
    
    输出项说明:
    kbmemfree:这个值和free命令中的free值基本一致,所以它不包括buffer和cache的空间.
    kbmemused:这个值和free命令中的used值基本一致,所以它包括buffer和cache的空间.
    %memused:这个值是kbmemused和内存总量(不包括swap)的一个百分比.
    kbbuffers和kbcached:这两个值就是free命令中的buffer和cache.
    kbcommit:保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM+swap).
    %commit:这个值是kbcommit与内存总量(包括swap)的一个百分比.
    

    4)内存分页监控
    例如,每10秒采样一次,连续采样3次,监控内存分页:

    [root@jumpserver01 ~]# sar -B 10 3
    Linux 2.6.32-696.el6.x86_64 (centos6-vm01)  01/04/18    _x86_64_    (4 CPU)
    
    00:16:29     pgpgin/s pgpgout/s   fault/s  majflt/s  pgfree/s pgscank/s pgscand/s pgsteal/s    %vmeff
    00:16:39         0.00      0.40      7.21      0.00     12.61      0.00      0.00      0.00      0.00
    00:16:49         0.00      0.00      4.30      0.00     12.60      0.00      0.00      0.00      0.00
    00:16:59         0.00      0.00      3.40      0.00     12.20      0.00      0.00      0.00      0.00
    Average:         0.00      0.13      4.97      0.00     12.47      0.00      0.00      0.00      0.00
    
    输出项说明:
    pgpgin/s:表示每秒从磁盘或SWAP置换到内存的字节数(KB)
    pgpgout/s:表示每秒从内存置换到磁盘或SWAP的字节数(KB)
    fault/s:每秒钟系统产生的缺页数,即主缺页与次缺页之和(major + minor)
    majflt/s:每秒钟产生的主缺页数.
    pgfree/s:每秒被放入空闲队列中的页个数
    pgscank/s:每秒被kswapd扫描的页个数
    pgscand/s:每秒直接被扫描的页个数
    pgsteal/s:每秒钟从cache中被清除来满足内存需要的页个数
    %vmeff:每秒清除的页(pgsteal)占总扫描页(pgscank+pgscand)的百分比
    

    5)I/O和传送速率监控
    例如,每10秒采样一次,连续采样3次,报告缓冲区的使用情况,需键入如下命令:

    [root@jumpserver01 ~]# sar -b 10 3
    Linux 2.6.32-696.el6.x86_64 (centos6-vm01)  01/04/18    _x86_64_    (4 CPU)
    
    00:18:06          tps      rtps      wtps   bread/s   bwrtn/s
    00:18:16         0.00      0.00      0.00      0.00      0.00
    00:18:26         0.00      0.00      0.00      0.00      0.00
    00:18:36         0.00      0.00      0.00      0.00      0.00
    Average:         0.00      0.00      0.00      0.00      0.00
    
    输出项说明:
    tps:每秒钟物理设备的 I/O 传输总量
    rtps:每秒钟从物理设备读入的数据总量
    wtps:每秒钟向物理设备写入的数据总量
    bread/s:每秒钟从物理设备读入的数据量,单位为 块/s
    bwrtn/s:每秒钟向物理设备写入的数据量,单位为 块/s 
    

    6)进程队列长度和平均负载状态监控
    例如,每10秒采样一次,连续采样3次,监控进程队列长度和平均负载状态:

    [root@jumpserver01 ~]# sar -q 10 3
    Linux 2.6.32-696.el6.x86_64 (centos6-vm01)  01/04/18    _x86_64_    (4 CPU)
    
    00:19:25      runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15
    00:19:35            0       231      0.00      0.20      4.50
    00:19:45            0       231      0.00      0.19      4.45
    00:19:55            0       231      0.00      0.18      4.40
    Average:            0       231      0.00      0.19      4.45
    
    输出项说明:
    runq-sz:运行队列的长度(等待运行的进程数)
    plist-sz:进程列表中进程(processes)和线程(threads)的数量
    ldavg-1:最后1分钟的系统平均负载(System load average)
    ldavg-5:过去5分钟的系统平均负载
    ldavg-15:过去15分钟的系统平均负载
    

    7)系统交换活动信息监控
    例如,每10秒采样一次,连续采样3次,监控系统交换活动信息:

    [root@jumpserver01 ~]# sar -W 10 3
    Linux 2.6.32-696.el6.x86_64 (centos6-vm01)  01/04/18    _x86_64_    (4 CPU)
    
    00:21:06     pswpin/s pswpout/s
    00:21:16         0.00      0.00
    00:21:26         0.00      0.00
    00:21:36         0.00      0.00
    Average:         0.00      0.00
    
    输出项说明:
    pswpin/s:每秒系统换入的交换页面(swap page)数量
    pswpout/s:每秒系统换出的交换页面(swap page)数量
    

    8)设备使用情况监控
    例如,每10秒采样一次,连续采样3次,报告设备使用情况,需键入如下命令:

    [root@jumpserver01 ~]# sar -d 10 3 -p
    Linux 2.6.32-696.el6.x86_64 (centos6-vm01)  01/04/18    _x86_64_    (4 CPU)
    
    00:24:26          DEV                   tps       rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz  await     svctm     %util
    00:24:36          sr0                   0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
    00:24:36          vda                   0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
    00:24:36    vg_centos6vm01-lv_root      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
    00:24:36    vg_centos6vm01-lv_swap      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
    00:24:36    vg_centos6vm01-lv_home      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.0
    
    其中:
    参数-p可以打印出sda,hdc等磁盘设备名称,如果不用参数-p,设备节点则有可能是dev8-0,dev22-0
    tps:每秒从物理磁盘I/O的次数.多个逻辑请求会被合并为一个I/O磁盘请求,一次传输的大小是不确定的.
    rd_sec/s:每秒读扇区的次数.
    wr_sec/s:每秒写扇区的次数.
    avgrq-sz:平均每次设备I/O操作的数据大小(扇区).
    avgqu-sz:磁盘请求队列的平均长度.
    await:从请求磁盘操作到系统完成处理,每次请求的平均消耗时间,包括请求队列等待时间,单位是毫秒(1秒=1000毫秒).
    svctm:系统处理每次请求的平均时间,不包括在请求队列中消耗的时间.
    %util:I/O请求占CPU的百分比,比率越大,说明越饱和.
    1)avgqu-sz 的值较低时,设备的利用率较高。
    2)当%util的值接近 1% 时,表示设备带宽已经占满。
    

    要判断系统瓶颈问题,有时需几个 sar 命令选项结合起来:
    1)怀疑CPU存在瓶颈,可用 sar -u 和 sar -q 等来查看
    2)怀疑内存存在瓶颈,可用 sar -B、sar -r 和 sar -W 等来查看
    3)怀疑I/O存在瓶颈,可用 sar -b、sar -u 和 sar -d 等来查看

    三、free

    free命令用于检测物理内存和交换内存已使用量和可用量(默认单位为KB)
    [root@backup ~]# free -m           //使用-m参数表示以兆字节为单位显示内存
                 total       used       free     shared    buffers     cached
    Mem:         64181      44372      19809          3         12        216
    -/+ buffers/cache:      44143      20038
    Swap:        32767          0      32767
    
    第一部分Mem行解释:
    total:内存总数;
    used:已经使用的内存数;
    free:空闲的内存数;
    shared:当前已经废弃不用;
    buffers Buffer:缓存内存数;
    cached Page:缓存内存数。
    关系:total = used + free
    
    第二部分(-/+ buffers/cache)解释:
    (-buffers/cache) used内存数:第一部分Mem行中的 used – buffers – cached
    (+buffers/cache) free内存数: 第一部分Mem行中的 free + buffers + cached
    
    可见-buffers/cache反映的是被程序实实在在吃掉的内存,而+buffers/cache反映的是可以挪用的内存总数。
    
    第三部分是指交换分区。
    
    ---------------------------------------------------------------------------------------------
    以字节为单位显示内存
    加上-b参数的free命令,以字节为单位显示内存的大小。
    
    [root@backup ~]# free -b
                 total       used       free     shared    buffers     cached
    Mem:    67299549184 46525181952 20774367232    3272704   12820480  227033088
    -/+ buffers/cache: 46285328384 21014220800
    Swap:   34359734272          0 34359734272
    -------------------------------------------------------------------------------------------
    以千字节为单位显示内存
    加上-k参数的free命令(默认单位,所以可以不用使用它),以(KB)千字节为单位显示内存大小。
    [root@backup ~]# free -k
                 total       used       free     shared    buffers     cached
    Mem:      65722216   45435760   20286456       3196      12520     221712
    -/+ buffers/cache:   45201528   20520688
    Swap:     33554428          0   33554428
    -------------------------------------------------------------------------------------------
    以千兆字节为单位显示内存
    使用-g为参数,将会以GB(千兆字节)为单位显示内存大小。
    [root@backup ~]# free -g
                 total       used       free     shared    buffers     cached
    Mem:            62         43         19          0          0          0
    -/+ buffers/cache:         43         19
    Swap:           31          0         31
    ------------------------------------------------------------------------------------------
    定期时间间隔更新内存状态
    -s选项加上一个整数,用来在定期时间间隔内更新free命令。举个例子,下面的命令将会在每5秒更新一个free命令。
    [root@backup ~]# free -s 5
                 total       used       free     shared    buffers     cached
    Mem:      65722216   45436660   20285556       3196      12712     222096
    -/+ buffers/cache:   45201852   20520364
    Swap:     33554428          0   33554428
    
                 total       used       free     shared    buffers     cached
    Mem:      65722216   45436592   20285624       3196      12720     222096
    -/+ buffers/cache:   45201776   20520440
    Swap:     33554428          0   33554428

    四、mpstat(用于获取CPU相关统计信息)
    mpstat是 Multiprocessor Statistics的缩写,是实时系统监控工具。其报告与CPU的一些统计信息,这些信息存放在/proc/stat文件中。在多CPU系统里,其不但能查看所有CPU的平均状况信息,而且能够查看特定CPU的信息。

    mpstat的语法如下
    # mpstat [-P {cpu|ALL}] [internal [count]]
    
    其中,各参数含义如下:
    -P {cpu l ALL}     表示监控哪个CPU, cpu在[0,cpu个数-1]中取值
    internal           相邻的两次采样的间隔时间
    count              采样的次数,count只能和delay一起使用
    
    [root@kevin ~]# yum install -y sysstat"     #安装mpstat
    
    [root@kevin ~]# mpstat 
    Linux 2.6.32-696.el6.x86_64 (ceph-node1)  07/02/2018  _x86_64_  (2 CPU)
    
    02:28:57 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
    02:28:57 PM  all    0.17    0.00    0.15    0.32    0.00    0.00    0.01    0.00   99.36
    
    当mpstat不带参数时,输出为从系统启动以来的平均值。
    
    [root@kevin ~]# mpstat -P ALL 
    Linux 2.6.32-696.el6.x86_64 (ceph-node1)  07/02/2018  _x86_64_  (2 CPU)
    
    02:29:36 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
    02:29:36 PM  all    0.17    0.00    0.15    0.32    0.00    0.00    0.01    0.00   99.36
    02:29:36 PM    0    0.18    0.00    0.18    0.59    0.00    0.00    0.01    0.00   99.04
    02:29:36 PM    1    0.15    0.00    0.11    0.05    0.00    0.00    0.01    0.00   99.69
    
    每5秒产生一个报告,总共产生2个。
    [root@kevin ~]# mpstat -P ALL 5 2
    Linux 2.6.32-696.el6.x86_64 (ceph-node1)  07/02/2018  _x86_64_  (2 CPU)
    
    02:30:27 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
    02:30:32 PM  all    0.20    0.00    0.40    0.51    0.00    0.00    0.00    0.00   98.89
    02:30:32 PM    0    0.20    0.00    0.80    0.80    0.00    0.00    0.00    0.00   98.20
    02:30:32 PM    1    0.20    0.00    0.20    0.00    0.00    0.00    0.00    0.00   99.59
    
    02:30:32 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
    02:30:37 PM  all    0.20    0.00    0.40    0.40    0.00    0.00    0.00    0.00   98.99
    02:30:37 PM    0    0.20    0.00    0.40    0.80    0.00    0.00    0.00    0.00   98.59
    02:30:37 PM    1    0.20    0.00    0.20    0.00    0.00    0.00    0.00    0.00   99.59
    
    Average:     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
    Average:     all    0.20    0.00    0.40    0.45    0.00    0.00    0.00    0.00   98.94
    Average:       0    0.20    0.00    0.60    0.80    0.00    0.00    0.00    0.00   98.40
    Average:       1    0.20    0.00    0.20    0.00    0.00    0.00    0.00    0.00   99.59
    
    
    解释:
    %user         表示处理用户进程所使用 CPU 的百分比。
    %nice         表示使用 nice 命令对进程进行降级时 CPU 的百分比。nice 命令更改进程的优先级。 
    %system       表示内核进程使用的 CPU 百分比  
    %iowait       表示等待进行 I/O 所使用的 CPU 时间百分比  
    %irq          表示用于处理系统中断的 CPU 百分比  
    %soft         表示用于软件中断的 CPU 百分比  
    %idle         显示 CPU 的空闲时间

    五、iostat(查看IO性能是否存在瓶颈)
    性能评估的一个主要部分就是磁盘性能,iostat 命令提供了存储接口的性能指标,iostat是查看Linux系统io是否存在瓶颈的一个命令。

    安装iostat
    [root@kevin ~]# yum install -y sysstat
    
    iostat 主要有三个操作箱,options 操作项,interval指定统计时间间隔,count总共输出次数
    
    -------------------------------------
    -c 参数,可以用来插卡部分cpu状态信息
    [root@kevin ~]# iostat -c
    Linux 2.6.32-696.el6.x86_64 (ceph-node1)  07/02/2018  _x86_64_ (2 CPU)
    
    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
               0.17    0.00    0.15    0.32    0.01   99.36
    
    ------------------------------------
    -k 参数,某些使用block为单位的列强制使用Kilobytes为单位。如下,每1秒钟打印一次,打印2份。
    [root@kevin ~]# iostat -k 1 2
    Linux 2.6.32-696.el6.x86_64 (ceph-node1)  07/02/2018  _x86_64_ (2 CPU)
    
    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
               0.17    0.00    0.15    0.32    0.01   99.36
    
    Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
    scd0              0.00         0.00         0.00        356          0
    vda               1.08         0.45        11.45    4340748  109945327
    dm-0              2.84         0.41        11.34    3907333  108884164
    dm-1              0.04         0.04         0.11     423580    1054548
    dm-2              0.00         0.00         0.00       1701       1084
    vdb               0.00         0.00         0.00       6671      10681
    
    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
               0.50    0.00    0.00    0.00    0.00   99.50
    
    Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
    scd0              0.00         0.00         0.00          0          0
    vda               0.00         0.00         0.00          0          0
    dm-0              0.00         0.00         0.00          0          0
    dm-1              0.00         0.00         0.00          0          0
    dm-2              0.00         0.00         0.00          0          0
    vdb               0.00         0.00         0.00          0          0
    
    ---------------------------------
    -d 参数,显示设备(磁盘)使用状态
    [root@kevin ~]# iostat -d 1 2
    Linux 2.6.32-696.el6.x86_64 (ceph-node1)  07/02/2018  _x86_64_ (2 CPU)
    
    Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
    scd0              0.00         0.00         0.00        712          0
    vda               1.08         0.90        22.89    8681496  219893230
    dm-0              2.84         0.81        22.67    7814666  217770904
    dm-1              0.04         0.09         0.22     847160    2109096
    dm-2              0.00         0.00         0.00       3402       2168
    vdb               0.00         0.00         0.00      13342      21363
    
    Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
    scd0              0.00         0.00         0.00          0          0
    vda               7.00         0.00       208.00          0        208
    dm-0             26.00         0.00       208.00          0        208
    dm-1              0.00         0.00         0.00          0          0
    dm-2              0.00         0.00         0.00          0          0
    vdb               0.00         0.00         0.00          0          0
    
    ==============================================================================
    解释:
    tps        每秒的传输数量,例如,每秒的 I/O 操作数。注:这只是 I/O 操作的数量;每个操作可能非常大,也可能非常小。
    Blk_read/s 每秒从该设备读取的块数。通常,块的大小为 512 字节。这是一个磁盘利用率较好的值。
    Blk_wrtn/s 每秒写入该设备的块数
    Blk_read   到目前为止从该设备读取的块数。注意,这并不是正在发生的情况。很多块已经从该设备读取。可能现在什么也没有读取。观察一段时间,看是否有变化。
    Blk_wrtn   写入该设备的块数。
    ==============================================================================
    
    --------------------------------
    -x 参数,输出更多详细信息
    [root@kevin ~]# iostat -x 1 2
    Linux 2.6.32-696.el6.x86_64 (ceph-node1)  07/02/2018  _x86_64_ (2 CPU)
    
    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
               0.17    0.00    0.15    0.32    0.01   99.36
    
    Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
    scd0              0.00     0.00    0.00    0.00     0.00     0.00    18.26     0.00    0.23    0.23    0.00   0.23   0.00
    vda               0.01     1.79    0.01    1.07     0.90    22.89    21.98     0.04   37.78    2.15   38.14  11.05   1.20
    dm-0              0.00     0.00    0.01    2.83     0.81    22.67     8.26     0.29  100.64    2.84  101.02   4.20   1.20
    dm-1              0.00     0.00    0.01    0.03     0.09     0.22     8.00     0.01  242.26    0.70  339.63   0.56   0.00
    dm-2              0.00     0.00    0.00    0.00     0.00     0.00     7.99     0.00    9.69    1.44   22.66   2.92   0.00
    vdb               0.00     0.00    0.00    0.00     0.00     0.00    21.33     0.00    1.10    0.29   15.04   1.05   0.00
    
    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
               0.00    0.00    0.50    9.55    0.00   89.95
    
    Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
    scd0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
    vda               0.00    26.00    0.00    7.00     0.00   264.00    37.71     0.34   49.00    0.00   49.00  37.71  26.40
    dm-0              0.00     0.00    0.00   33.00     0.00   264.00     8.00     1.15   34.94    0.00   34.94   8.00  26.40
    dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
    dm-2              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
    vdb               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
    
    ==============================================================================
    解释一下 -x参数输出列意思
    rrqm/s:每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并Merge);
    wrqm/s:每秒这个设备相关的写入请求有多少被Merge了。
    
    rsec/s:每秒读取的扇区数;wsec/:每秒写入的扇区数。
    r/s:The number of read requests that were issued to the device per second;
    w/s:The number of write requests that were issued to the device per second;
    
    await:每一个IO请求的处理的平均时间(单位是毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。
    
    %util:在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度。
    一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。
    ==============================================================================
    
    -----------------------------------
    iostat的常见用法
    # iostat -d -k 1 10         #查看TPS和吞吐量信息
    # iostat -d -x -k 1 10      #查看设备使用率(%util)、响应时间(await)
    # iostat -c 1 10            #查看cpu状态
    
    使用实例
    1)查看指定磁盘吞吐量和速率
    [root@kevin ~]# iostat -d -d 1 1
    Linux 2.6.32-573.el6.x86_64 (localhost)         06/30/2017      _x86_64_        (4 CPU)
    
    Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
    sda               0.14         0.08         3.31    1939830   83482716
    dm-0              0.42         0.07         3.30    1872538   83282120
    dm-1              0.00         0.00         0.00      39840     124112
    dm-2              0.00         0.00         0.00       2002      76424
    dm-3              0.00         0.01         0.00     254810      14320
    #从结果看到平均传输次数0.14,每秒读取0.08M,每秒写3.31M
    
    2)磁盘性能统计
    [root@kevin ~]# iostat -x -k 1 1
    Linux 2.6.32-573.el6.x86_64 (localhost)         06/30/2017      _x86_64_        (4 CPU)
    
    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
               0.02    0.00    0.00    0.00    0.00   99.98
    
    Device:         rrqm/s   wrqm/s     r/s     w/s       rkB/s    wkB/s  avgrq-sz avgqu-sz   await    r_await  w_await  svctm  %util
    sda               0.00     0.27         0.00   0.14     0.04     1.65    23.78       0.00         0.31    1.51            0.29   0.16   0.00
    

    六、vmstat(主要用它来看CPU的一个负载情况)
    vmstat(VirtualMeomoryStatistics,虚拟内存统计)是Linux中监控内存的常用工具,可对操作系统的虚拟内存、进程、CPU等的整体情况进行监视。该命令可以显示关于系统各种资源之间相关性能的简要信息,这里主要用它来看CPU的一个负载情况。vmstat 命令报告关于内核线程、虚拟内存、磁盘、陷阱和 CPU 活动的统计信息。由 vmstat 命令生成的报告可以用于平衡系统负载活动。系统范围内的这些统计信息(所有的处理器中)都计算出以百分比表示的平均值。

    命令格式:
    # vmstat (选项) (参数)
    
    选项
    -a:显示活动内页;
    -f:显示启动后创建的进程总数;
    -m:显示slab信息;
    -n:头信息仅显示一次;
    -s:以表格方式显示事件计数器和内存状态;
    -d:报告磁盘状态;
    -p:显示指定的硬盘分区状态;
    -S:输出信息的单位。
    
    参数
    事件间隔:状态信息刷新的时间间隔;
    次数:显示报告的次数。
    
    实例:
    [root@kevin ~]# vmstat 
    procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
     r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
     0  0 484628 215084  75336 523748    0    0     0     6    1    0  0  0 99  0  0 
    
    [root@kevin ~]# vmstat 3
    procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
     r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
     0  0 482584 212000  75572 524464    0    0     0     6    1    0  0  0 99  0  0 
     1  0 482584 211984  75576 524468    0    0     0    31 1285 2485  0  0 99  1  0 
     0  0 482584 212124  75576 524484    0    0     0     7 1315 2586  0  0 99  0  0 
     0  0 482584 211844  75588 524496    0    0     0    56 1385 2614  2  1 96  1  0 
     0  0 482584 212108  75588 524504    0    0     0     0 1309 2556  0  0 100  0  0   
     0  0 482584 211920  75588 524512    0    0     0    92 1348 2616  1  0 98  1  0 
     0  0 482584 212124  75592 524516    0    0     0    29 1275 2483  0  0 98  2  0 
     0  0 482584 211984  75592 524528    0    0     0     4 1335 2593  1  0 99  0  0
    
     字段说明:
    
    Procs(进程)
    
    r: 运行队列中进程数量,这个值也可以判断是否需要增加CPU。(长期大于1)
    b: 等待IO的进程数量。
    Memory(内存)
    
    swpd: 使用虚拟内存大小,如果swpd的值不为0,但是SI,SO的值长期为0,这种情况不会影响系统性能。
    free: 空闲物理内存大小。
    buff: 用作缓冲的内存大小。
    cache: 用作缓存的内存大小,如果cache的值大的时候,说明cache处的文件数多,如果频繁访问到的文件都能被cache处,那么磁盘的读IO bi会非常小。
    Swap
    
    si: 每秒从交换区写到内存的大小,由磁盘调入内存。
    so: 每秒写入交换区的内存大小,由内存调入磁盘。
    注意:内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。有些朋友看到空闲内存(free)很少的或接近于0时,
    就认为内存不够用了,不能光看这一点,还要结合si和so,如果free很少,但是si和so也很少(大多时候是0),那么不用担心,系统性能这时不会受到影响的。
    
    IO(现在的Linux版本块的大小为1kb)
    
    bi: 每秒读取的块数
    bo: 每秒写入的块数
    注意:随机磁盘读写的时候,这2个值越大(如超出1024k),能看到CPU在IO等待的值也会越大。
    
    system(系统)
    
    in: 每秒中断数,包括时钟中断。
    cs: 每秒上下文切换数。
    注意:上面2个值越大,会看到由内核消耗的CPU时间会越大。
    
    CPU(以百分比表示)
    
    us: 用户进程执行时间百分比(user time)
    us的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超50%的使用,那么我们就该考虑优化程序算法或者进行加速。
    
    sy: 内核系统进程执行时间百分比(system time)
    sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因。
    
    wa: IO等待时间百分比
    wa的值高时,说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。
    
    id: 空闲时间百分比
  • 相关阅读:
    Spiral Matrix
    Merge Intervals
    Edit Distance
    Insertion Sort List
    Add Binary
    Partition List
    Binary Tree Postorder Traversal
    单向链表反转
    Facebook Hacker cup Qualification round Problem 1
    判断二叉树是否为平衡二叉树
  • 原文地址:https://www.cnblogs.com/kevingrace/p/8194413.html
Copyright © 2020-2023  润新知