第2章 程序性能分析

2023年 9月 16日 65.7k 0

2.1 理解性能优化

1. 性能优化基本意识

  • 确保优化方向正确,产品特性和阶段决定优化方向,这是优化的首要条件,优化方向决定了优化的效率和收益。
  • 确定优化带来的收益,无收益不优化,只有明确收益才启动优化。
  • 在投入和产出上做取舍,合理的设定优化目标和资源投入,做高性价比的性能优化。
  • 功能与性能的平衡,产品功能优化是最低成本、高性价比的优化之一,并且立竿见影。
  • 防止过早和过渡优化,过早和过渡直接导致人力成本升高以及资源浪费。
  • 2. 优化的方向、思路

  • 整理网络、系统、前端、后端,移动等 5 大方向性能优化最佳实践,针对各个技术细节进行深度调研并在产品线中抓重点问题实践。
  • 提升工程师在性能优化方面的知识,汇总各个部分的成果,积极组织交流、培训。
  • 可持续的开发性能优化的工具、库,并集成到基础平台中,提供给产品线使用。
  • 推广性能优化方法、工具和性能分析指南在产品线中的推广,并指导工程师解决性能问题。
  • 做优化首先要知道从哪里入手,也就是要知道系统的瓶颈在哪里。一个请求会消耗很多资源: CPU、内存、网络、磁盘等,这些资源中总会有一个先到达瓶颈,只有优化最先到达瓶颈的资源才会产生实际效果。

    如何发现瓶颈 ? 从代码执行部分来看,就是看哪里消耗了最多的 CPU 时间,从消耗 CPU 最多的地方做优化效果更明显。所以首先要掌握一些工具, 例如压测工具、发现代码热点的工具。

    2.2 基本监控系统方法

    在 Linux操作系统中,我们可以使用一些分析系统性能的命令去分析服务器的性能。现在介绍这些命令的使用方法。

    2.2.1 ps 命令 ps 命令主要用来获取对于某个进程的一些信息。ps命令的常用参数如下所示

    • A: 显示所有进程。
    • a: 显示一个终端的所有进程, 除了会话引线。
    • N: 忽略选择。
    • d: 显示所有进程,但省略所有的会话引线。
    • e: 列出程序时, 显示每个程序所使用的环境变量。
    • X: 显示没有控制终端的进程,同时显示各个命令的具体路径。dx 不可合用。
    • p pid: 进程使用 cpu 的时间。
    • u uid or username: 选择有效的用户id或者是用户名。
    • g gid or groupname: 显示组的所有进程。
    • f: 全部列出,通常和其他选项联用。
    • l: 长格式 (有F, wchan,C等字段)。
    • j: 作业格式。
    • e: 命令之后显示环境。

    例:

    # 查看所有进程的信息
    ps -aux
    ​
    # 查询所有进程及其环境变量信息
    ps -ef
    ​
    # 通常查看了进程信息后,如果需要终止某个进程,可以使用 kill命令,如下。
    kill -KILL [pid]
    ​
    # 如果需要强行终止某个进程的话,可以使用kill -9 [pid]命令,如下。
    kill -9 [pid]
    ​
    

    2.2.3 top 命令

    top 命令是 Linux 操作系统下最常用的性能分析工具,能够实时地显示操作系统中各个进程消耗资源的情况。该命令可以显示 CUP 使用、内存使用和执行时间,下面执行 top 命令看下执行的情况,如下所示。

    [root@VM-0-13-centos ~]# top
    top - 15:13:50 up 25 days,  1:58,  1 user,  load average: 0.11, 0.05, 0.08
    Tasks: 116 total,   2 running, 113 sleeping,   0 stopped,   1 zombie
    %Cpu(s):  0.7 us,  0.7 sy,  0.0 ni, 98.3 id,  0.3 wa,  0.0 hi,  0.0 si,  0.0 st
    KiB Mem :  1881996 total,    80140 free,   502064 used,  1299792 buff/cache
    KiB Swap:  1049596 total,   957928 free,    91668 used.  1172928 avail Mem 
    ​
      PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                
    30946 root      20   0  988160  35816   9708 S  0.7  1.9 108:27.91 YDService                                                  
     1909 redis     20   0  195612   7004    716 S  0.3  0.4 124:09.23 redis-server                                                            
    13957 mysql     20   0 1054568 166436   4264 S  0.3  8.8   1:21.40 mysqld                                                                  
    20361 root      20   0  162112   2256   1560 R  0.3  0.1   0:00.47 top                                                                     
        1 root      20   0   51912   3768   2388 S  0.0  0.2   6:52.50 systemd                                                            
        2 root      20   0       0      0      0 S  0.0  0.0   0:00.82 kthreadd               ...
    

    我们来分析一下 top 命令的统计信息的含义。

    top - 15:13:50 up 25 days,  1:58,  1 user,  load average: 0.11, 0.05, 0.08
    

    先来分析 top 命令第 1 行信息,该行信息的具体含义如下。

    • 15:13:50 表示系统运行的当前时间。
    • up 25 days 表示系统运行时间。
    • 1 user 表示登录用户的数量。
    • load average: 0.11, 0.05, 0.08 表示系统负载。即任务队列的平均长度三个数值分别为 1 分钟、5 分钟、15 分钟到现在的平均值。(它们的数字是越小越好。数字越高,说明服务器的负载越大)

    接着分析 top 命令的第 2 行和第 3 行的具体含义,这两行分别表示进程和 CPU 的性能的一些信息。

    Tasks: 116 total,   2 running, 113 sleeping,   0 stopped,   1 zombie
    %Cpu(s):  0.7 us,  0.7 sy,  0.0 ni, 98.3 id,  0.3 wa,  0.0 hi,  0.0 si,  0.0 st
    

    下面我们具体分析一下各个统计信息的含义,如下所示。

    • 116 total 表示进程的总数。
    • 2 running 表示正在运行的进程数量。
    • 113 sleeping 表示睡眠的进程数量。
    • 0 stopped 表示停止的进程数量。
    • 1 zombie 表示僵尸进程数。
    • 0.7 us 表示用户空间占用 CPU 的百分比。
    • 0.7 sy 表示内核空间占用 CPU 的百分比。
    • 0.0 ni 表示用户进程空间内改变过优先级的进程占用 CPU 的百分比。
    • 98.3 id 表示空闲 CPU 的百分比。
    • 0.3 wa 表示等待输入输出的 CPU 的百分比。

    接着分析 top 命令的第 4 行和第 5 行的具体含义,这两行分别表示内存的性能分析信息, 如下。

    KiB Mem :  1881996 total,    80140 free,   502064 used,  1299792 buff/cache
    
    • 1881996 total 表示物理内存的总的大小。
    • 502064 used 表示使用的物理内存的大小。
    • 80140 free 表示空闲的物理内存的大小。
    • 1299792 buff/cache 表示内核缓存内存空间的大小。
    KiB Swap:  1049596 total,   957928 free,    91668 used.  1172928 avail Mem 
    

    下面具体分析一下 Swap 各个统计信息的含义,如下所示。

    • 524280k total 表示交换区的总量。
    • 91668 used 表示使用的交换区总量。
    • 957928 free 表示空闲交换区总量。
    • 1172928 avail Mem 表示可用内存空间 。

    2.2.4 vmstat 命令

    vmstat 命令可以用来显示 Linux 性能指标,该命令分别输出进程、内存、交互区、IO、系统和 CPU 的情况。下面直接输出该命令, 如下所示。

    [root@VM-0-13-centos ~]# vmstat
    procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
     r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
     5  0  91668  85520 148944 1130440    0    0    27    62   15   19  4  2 94  0  0
    

    首先,分析下进程 (procs) 的两列信息,如下所示。

    • r 列表示可运行进程的数量。
    • b 列表示阻塞进程的数量。

    内存性能有 4 个报告虚拟内存如何使用的字段,具体意义如下。

    • swpd 表示已经使用的交换空间的数量。
    • free 表示自由 RAM 数量。
    • buff 表示缓存使用的 RAM 的数量。
    • cache 表示文件系统缓存使用的 RAM 数量。

    swap 交换字段进行详细说明,如下所示。

    • si 表示从磁盘分页到内存的数量。
    • so 表示从内存分页到磁盘的数量。

    io字段进行详细说明,如下所示。

    • bi 表示从磁盘读入的块。
    • bo 表示写入磁盘的块。

    下面,对系统字段和 CPU 字段进行说明,CPU 状态使用总 CPU 时间的百分比来表示,具体含义如下。

    • in 表示系统中断。
    • cs 表示进程上下文开关。
    • us 表示用户模式。
    • sy 表示内核模式。
    • wa 表示等待 I/O。
    • id 表示空闲状态。

    例 :

    [root@VM-0-13-centos ~]# vmstat 3 10
    procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
     r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
     5  0  91668  87496 149688 1134760    0    0    27    62   15   19  4  2 94  0  0
     0  0  91668  87232 149696 1134760    0    0     0    35  450  973  1  1 98  0  0
     0  0  91668  87072 149696 1134764    0    0     0     0  449  973  1  1 98  0  0
     0  0  91668  87304 149700 1134584    0    0     0    19  446  987  1  1 98  0  0
     0  0  91668  87304 149700 1134584    0    0     0     0  440  953  1  0 99  0  0
     0  0  91668  87252 149700 1134584    0    0     0    17  464 1007  1  1 98  0  0
     0  0  91668  87256 149700 1134592    0    0     0    24  461 1009  1  1 98  0  0
     0  0  91668  87304 149700 1134592    0    0     0     7  432  934  1  0 99  0  0
     0  0  91668  85256 149700 1134600    0    0     0     0  471 1011  1  1 97  0  0
     0  0  91668  85424 149708 1134612    0    0     0   356  986 2108  2  2 96  0  0
    ​
    

    3 表示每个两秒采集一次服务器状态,10 表示采集 10 次。

    显示从系统启动至今的 fork 数量

    vmstat -f (linux 下创建进程的系统调用是 fork)

    [root@VM-0-13-centos ~]# vmstat -f
          9337640 forks
    

    查看内存使用的详细信息

    vmstat -s (显示内存相关统计信息及多种系统活动数量)

    [root@VM-0-13-centos ~]# vmstat -s
          1881996 K total memory
           495924 K used memory
           731944 K active memory
           788832 K inactive memory
           119936 K free memory
           148936 K buffer memory
          1117200 K swap cache
          1049596 K total swap
            91668 K used swap
           957928 K free swap
          8981030 non-nice user cpu ticks
             1641 nice user cpu ticks
          3630611 system cpu ticks
        203464511 idle cpu ticks
           317867 IO-wait cpu ticks
                0 IRQ cpu ticks
            23647 softirq cpu ticks
                0 stolen cpu ticks
         57989204 pages paged in
        133580669 pages paged out
            33755 pages swapped in
           113806 pages swapped out
       1149638321 interrupts
       2319032091 CPU context switches
       1623993315 boot time
          9338328 forks
    

    查看磁盘的读/写

    vmstat -d (查看磁盘的读写)

    [root@VM-0-13-centos ~]# vmstat -d
    disk- ------------reads------------ ------------writes----------- -----IO------
           total merged sectors      ms  total merged sectors      ms    cur    sec
    vda   879001  32113 115977781 4230083 19061718 9521458 267278066 149614744      0   8955
    sr0       88      0     628      57      0      0       0       0      0      0
    

    2.3 定时监控系统状况

    2.3.1 sysstat工具

    sysstat 工具包含检测系统性能及效率的一组工具。例如 CPU 的使用率、硬盘和网络吞吐数据,这些数据的收集和分析,有利于判断系统是否正常运行。源码包 github 地址为github.com/sysstat/sys…。

    Sysstat 软件包集成如下工具 :

    • iostat 工具: 提供 CPU 使用率及硬盘吞吐效率的数据。
    • mpstat 工具: 提供单个处理器或多个处理器相关数据。
    • sar 工具: 负责收集、报告并存储系统活跃的信息。
    • sal 工具: 负责收集并存储每天系统动态信息到一个二进制的文件中。
    • sa2 工具: 负责把每天的系统活跃信息写入总结性的报告中。
    • sadc 工具: 系统动态数据收集工具,收集的数据被写进一个二进制的文件中。
    • sadf 工具: 显示被 sar 工具通过多种格式收集的数据。

    下面开始安装 sysstat 工具包, 如下所示。

    # 一.源码编译安装
    [root@localhost ~]# tar zxvf sysstat-12.5.4.tar.gz
    [root@localhost sysstat-10.0.0]# ./configure
    [root@localhost sysstat-10.0.0]# make
    [root(localhost sysstat-10.0.0]# make install
    ​
     
    # 二.使用yum安装
    yum install sysstat -y
    

    1. Iostat 工具 Iostat 工具用于输出 CPU 和磁盘 IO 相关的统计信息,具体的语法格式如下:

    iostat   [-c|-d]   [-k]   [-t]   [-V]   [-x]   [-p device|ALL]   [间隔描述]   [检测次数]
    

    上述参数的含义如下 :

    • -c: 表示仅显示CPU 的状态。
    • -d: 仅显示存储设备的状态, 不可以和 -c 一起使用。
    • -k: 默认显示的是读入读出的块信息。
    • -t: 显示搜集数据的时间。
    • -V: 显示版本号和帮助信息。
    • -x: 显示扩展信息。
    • -p dev-p device|ALL: device 为某个设备或者某个分区,如果使用 ALL,就表示要显示所有分区和设备的信息。

    直接运行 Iostat 命令,结果如下所示。

    [root@VM-0-13-centos ~]# iostat
    Linux 3.10.0-1160.31.1.el7.x86_64 (VM-0-13-centos)  07/19/2021  _x86_64_    (1 CPU)
    ​
    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
               4.23    0.00    1.73    0.15    0.00   93.89
    ​
    Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
    vda               9.14        23.74        61.46   63565898  164589173
    scd0              0.00         0.00         0.00        314          0
    

    结果中关于 CPU 性能参数的含义如下 :

    • %user: 在用户级别运行所使用的 CPU 的百分比。
    • %nice: nice 操作所使用的 CPU 的百分比。
    • %system: 在系统级别 ( kernel) 运行所使用 CPU 的百分比。
    • %iowait: CPU 等待硬件 IO时,所占用 CPU 的百分比。
    • %idle: 表示 CPU 空闲时间所占比例。

    结果中关于磁盘 IO 性能参数的含义如下 :

    • Device: 表示设备块的名字。
    • tps: 表示每秒钟发送到的 IO 请求数。
    • kB_read/s: 表示从该设备每秒读取的数据块数量。
    • kB_wrtn/s: 表示从该设备每秒写入的数据块数量。
    • kB_read: 表示从该设备读取的数据块总数。
    • kB_wrtn: 表示从该设备写入的数据块总数。

    使用 -x 参数可以获得更多的统计信息, 如下所示。

    [root@VM-0-13-centos ~]# iostat -d -x -k 1 10
    Linux 3.10.0-1160.31.1.el7.x86_64 (VM-0-13-centos)  07/19/2021  _x86_64_    (1 CPU)
    ​
    Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
    vda               0.01     4.40    0.38    8.76    23.75    61.47    18.64     0.07    7.77    4.54    7.91   0.45   0.41
    scd0              0.00     0.00    0.00    0.00     0.00     0.00     7.14     0.00    0.65    0.65    0.00   0.65   0.00
    ​
    Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
    vda               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
    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
    ​
    Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
    vda               0.00     3.96    0.00   24.75     0.00   142.57    11.52     0.11    4.36    0.00    4.36   0.52   1.29
    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
    ​
    Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
    vda               0.00    25.25    0.00    3.03     0.00   113.13    74.67     0.01    2.33    0.00    2.33   2.00   0.61
    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
    ​
    Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
    vda               0.00     0.00    0.00    1.01     0.00     4.04     8.00     0.00    2.00    0.00    2.00   3.00   0.30
    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
    ​
    Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
    vda               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
    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
    ​
    Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
    vda               0.00     0.00    0.00    1.01     0.00     4.04     8.00     0.00    1.00    0.00    1.00   2.00   0.20
    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
    ​
    Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
    vda               0.00     1.00    0.00  176.00     0.00   828.00     9.41     1.21    6.85    0.00    6.85   0.07   1.30
    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
    ​
    Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
    vda               0.00    18.00    0.00    3.00     0.00    84.00    56.00     0.01    3.00    0.00    3.00   3.67   1.10
    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
    ​
    Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
    vda               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
    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
    

    结果中主要的参数的含义如下:

    • rrqm/s:表示每秒这个设备相关的读取请求有多少被合并。
    • wrqm/s:表示每秒这个设备相关的写入请求有多少被合并。
    • r/s:表示每秒请求读该设备的数量。
    • w/s:表示每秒请求写该设备的数量。
    • rkB/s:每秒读数据量 (单位:kB)。
    • wkB/s:每秒写数据量 (单位:kB)。
    • avgrq-sz:平均每次 IO 操作的数据量 (单位:扇区数)。
    • avgqu-sz:平均等待处理的 IO 请求队列长度。
    • await:每一个IO请求的处理的平均时间(单位:毫秒)。这里可以理解为 IO 的响应时间,一般地系统IO响应时间, 应该低于 5ms,如果大于 10ms 就比较大了。
    • r_await读取请求的平均时间(单位:毫秒)。
    • w_await:写入请求的平均时间(单位:毫秒)。
    • svctm:平均每次IO请求的处理时间 (单位:毫秒)。
    • %util:在统计时间内所有处理 IO 时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有 0.8 秒在处理 IO ,而 0.2 秒闲置,那么该设备的 %util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使 %util 是 100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。

    此外可以通过如下命令查询 CPU 的部分信息,如下所示。

    [root@VM-0-13-centos ~]# iostat -c 1 10
    Linux 3.10.0-1160.31.1.el7.x86_64 (VM-0-13-centos)  07/19/2021  _x86_64_    (1 CPU)
    ​
    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
               4.23    0.00    1.73    0.15    0.00   93.89
    ​
    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
               2.00    0.00    1.00    1.00    0.00   96.00
    ​
    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
              11.22    0.00    3.06    0.00    0.00   85.71
    ​
    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
               2.02    0.00    1.01    0.00    0.00   96.97
    ​
    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
               8.00    0.00    2.00    0.00    0.00   90.00
    ​
    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
               2.02    0.00    1.01    0.00    0.00   96.97
    ​
    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
               1.00    0.00    1.00    1.00    0.00   97.00
    ​
    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
               7.07    0.00    2.02    0.00    0.00   90.91
    ​
    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
               1.01    0.00    0.00    0.00    0.00   98.99
    ​
    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
               6.06    0.00    2.02    0.00    0.00   91.92
    

    也可以通过以下命令查询某个具体的设备块的信息,如下所示。

    [root@VM-0-13-centos ~]# iostat -d -k 1 | grep vda
    vda               9.14        23.75        61.47   63565798  164537921
    vda              28.00       100.00       240.00        100        240
    vda              52.53         0.00       315.15          0        312
    vda               1.00         0.00         4.00          0          4
    vda               0.00         0.00         0.00          0          0
    vda               1.01         0.00         4.04          0          4
    vda               0.00         0.00         0.00          0          0
    vda             219.00         0.00      1064.00          0       1064
    ​
    

    2. Mpstat工具

    Mpstat是系统实时监控工具,主要报告 CPU 的一些信息,先了解下该命令的语法 :

    mpstat [-P  {|ALL}]  [internal  {cpunt}]
    

    下面分析具体参数的含义 :

    • -P {ALL}: 表示需要监控哪个 CPU
    • Internal: 表示相邻的两次采样的时间间隔。
    • Count: 表示采样的次数。

    下面通过案例来理解一下该命令的具体用法。

    (1)显示所有 CPU 的信息,每秒钟执行一次。

    [root@VM-0-13-centos ~]# mpstat -P ALL 1
    Linux 3.10.0-1160.31.1.el7.x86_64 (VM-0-13-centos)  07/19/2021  _x86_64_    (1 CPU)
    ​
    06:46:21 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
    06:46:22 PM  all    7.00    0.00    2.00    0.00    0.00    0.00    0.00    0.00    0.00   91.00
    06:46:22 PM    0    7.00    0.00    2.00    0.00    0.00    0.00    0.00    0.00    0.00   91.00
    ​
    06:46:22 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
    06:46:23 PM  all    2.04    0.00    1.02    0.00    0.00    0.00    0.00    0.00    0.00   96.94
    06:46:23 PM    0    2.04    0.00    1.02    0.00    0.00    0.00    0.00    0.00    0.00   96.94
    ​
    06:46:23 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
    06:46:24 PM  all   10.00    0.00    3.00    0.00    0.00    0.00    0.00    0.00    0.00   87.00
    06:46:24 PM    0   10.00    0.00    3.00    0.00    0.00    0.00    0.00    0.00    0.00   87.00
    ​
    ...
    ​
    Average:     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
    Average:     all    4.50    0.00    1.61    0.07    0.00    0.00    0.00    0.00    0.00   93.82
    Average:       0    4.50    0.00    1.61    0.07    0.00    0.00    0.00    0.00    0.00   93.82
    ​
    

    (2)显示 ID 为 0 的 CPU 的信息, 每秒钟执行一次。

    [root@VM-0-13-centos ~]# mpstat -P 0 1
    Linux 3.10.0-1160.31.1.el7.x86_64 (VM-0-13-centos)  07/19/2021  _x86_64_    (1 CPU)
    ​
    05:19:29 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
    05:19:30 PM    0    1.01    0.00    1.01    1.01    0.00    0.00    0.00    0.00    0.00   96.97
    05:19:31 PM    0    8.00    0.00    3.00    0.00    0.00    0.00    0.00    0.00    0.00   89.00
    05:19:32 PM    0    1.01    0.00    1.01    0.00    0.00    0.00    0.00    0.00    0.00   97.98
    05:19:33 PM    0    8.16    0.00    3.06    0.00    0.00    0.00    0.00    0.00    0.00   88.78
    05:19:34 PM    0    1.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   98.00
    05:19:35 PM    0    7.07    0.00    2.02    0.00    0.00    0.00    0.00    0.00    0.00   90.91
    ...
    Average:       0    5.05    0.00    2.02    0.14    0.00    0.00    0.00    0.00    0.00   92.79
    ​
    

    该结果的具体参数项的含义如下所示。

    • %usr: 表示处理用户进程所使用 CPU 的百分比。
    • %nice: 表示使用nice命令对进程进行降级时 CPU 的百分比。
    • %sys: 表示内核进程使用的 CPU 百分比。
    • %iowait: 表示等待进行IO所使用的 CPU 时间百分比。
    • %irq: 表示用于处理系统中断的 CPU 百分比。
    • %soft: 表示用于软件中断的 CPU 百分比。
    • %idle: 显示 CPU 的空闲时间。
    • %gues: 显示运行虚拟处理器时CPU花费时间的百分比。
    • %steal: 显示虚拟机管理器在服务另一个虚拟处理器时虚拟CPU处在非自愿等待下花费时间的百分比。

    3. sar 工具 sar 是目前 Linux 最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括: 文件的读写情况、系统调用的使用情况、磁盘 I/O、CPU 效率、内存使用状况、进程活动及IPC有关的活动等。 sar 的语法格式如下:

    sar [options] [-A] [-o file] t [n]
    

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

    • -A: 所有报告的总和。
    • -u: 输出 CPU 使用情况的统计信息。
    • -v: 输出 inode、文件和其他内核表的统计信息。
    • -d: 输出每一个块设备的活动信息。
    • -r: 输出内存和交换空间的统计信息。
    • -b: 显示 I/O 和传送速率的统计信息。
    • -a: 文件读写情况。
    • -c: 输出进程统计信息,每秒创建的进程数。
    • -R: 输出内存页面的统计信息。
    • -y: 终端设备活动情况。
    • -w: 输出系统交换活动信息。

    下面通过一个案例来理解 sar 工具的使用方法,如下所示。

    [root@VM-0-13-centos ~]# sar -u 1 5
    Linux 3.10.0-1160.31.1.el7.x86_64 (VM-0-13-centos)  07/19/2021  _x86_64_    (1 CPU)
    ​
    05:14:57 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
    05:14:58 PM     all      8.08      0.00      2.02      2.02      0.00     87.88
    05:14:59 PM     all      0.00      0.00      1.01      0.00      0.00     98.99
    05:15:00 PM     all      8.00      0.00      3.00      0.00      0.00     89.00
    05:15:01 PM     all      4.04      0.00      4.04      0.00      0.00     91.92
    05:15:02 PM     all     10.00      0.00      3.00      0.00      0.00     87.00
    Average:        all      6.04      0.00      2.62      0.40      0.00     90.95
    

    结果中具体参数的含义如下所示。

    • CPU: all 表示统计信息为所有CPU的平均值。
    • %user : 显示在用户级别 ( application) 运行使用 CPU 总时间的百分比。
    • %nice: 显示在用户级别,用于 nice 操作所占用 CPU 总时间的百分比。
    • %system: 在核心级别 ( kernel) 运行所使用 CPU 总时间的百分比。
    • %iowait: 显示用于等待 IO 操作占用 CPU 总时间的百分比。
    • %steal: 管理程序( hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。
    • %idle: 显示 CPU 空闲时间占用 CPU 总时间的百分比。

    注意 : 如果 %iowait 的值过高,表示硬盘存在 I/O 瓶颈;如果 %idle 的值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量; 若 %idle 的值持续低于 10,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是CPU。

    相关文章

    服务器端口转发,带你了解服务器端口转发
    服务器开放端口,服务器开放端口的步骤
    产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
    如何使用 WinGet 下载 Microsoft Store 应用
    百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
    百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

    发布评论