第 10 章 Linux 系统资源监控

作者: Brinnatt 分类: ARM64 Linux 基础精修 发布时间: 2022-01-21 12:03

Linux 操作系统实际上可以看作是一个资源管家,那么管理哪些资源呢,当然是底层硬件资源,比如 CPU、内存、硬盘、显卡、网卡以及各种扩展外设。

这些硬件设备如何被使用、使用情况如何都由 Linux 操作系统来决定,实际上这是一个非常复杂的过程。经过历史演变,Linux 内核功能越来越多,也越来越强大,我们也不得不更加努力地学习。本章节会介绍如何查看这些硬件资源,以便通过数据分析更加合理地分配资源。

10.1、伪文件系统

在 Linux 中查看各种状态,其实质是查看内核中相关进程的数据结构中的项,通过工具将其格式化后输出出来。

但是内核的数据是绝对不能随意查看或更改的,至少不能直接去修改。所以,在 linux 上出现了伪文件系统 /proc,它是内核中各属性或状态向外提供访问和修改的接口。

在 /proc 下,记录了内核自己的数据信息,各进程独立的数据信息,统计信息等。绝大多数文件都是只读不可改的,即使对 root 也一样,但 /proc/sys 除外,为何如此稍后解释。

[root@computer1 ~]# ls /proc/
1       14       210      2444     2898     3152411  3219322  365      49      916
10      140      211      2445042  29       3157718  3219761  366      49308   918
101     142      213      245      290      316      3219763  3671528  49309   92
1010    143      214      246      2901     3161233  3219965  369      49487   922
1011    144      215      247      2904     3161412  3219966  37       497     924
1012    145      2157892  2477     291      3161628  322      370      498     93
102     147      216      2479     292      3162463  3220776  3707987  499     939
1026    148      2166228  2483     293      3167151  3220973  3708052  50      95
103     1484289  2166605  249      2933337  3167349  3220974  371      500     965894
1030    149      2172873  2491     2942473  3167804  3221784  37148    501     965940
1032    15       2172952  2492920  2943058  3167994  3222825  372      502     97
104     150      2174302  2493740  2943701  3168644  3222954  373      503     977
1044    152      218      2498     295      3169031  3223256  374      504     98
1045    153      2187021  2499     296      3169645  3223259  375      505     99
1046    154      2187301  25       2964786  317      3223494  376      506     acpi
1057    155      2187350  250      297      3170504  323      37620    507     buddyinfo
106     157      22       2507     2974466  3170660  324      377      508     bus
107     158      220      2507753  2975052  3170860  326      3825     509     cgroups
108     159      2209896  2507840  2976725  3172803  327      3829     51      cmdline
109     16       221      251      2977555  3179791  328      3830     510     config.gz
11      160      2218775  2514755  298      318      329      3831     511     consoles
111     162      222      2514917  2997448  3180167  3308060  3832     516     cpuinfo
112     163      224      252      2997861  3180374  331      3833     52      crypto
113     164      2247991  2522146  3        3180601  331292   3834     54      devices
114     1643190  225      2527     30       3181420  3313620  3835     56      diskstats
11513   1643234  226      254      300      3182232  3313748  3836     57      driver
116     165      2261     255      3000087  3183478  332      383638   58      execdomains
117     167      2262     256      302      3184083  333      3837     584745  fb
118     168      2263     257      3020071  3184924  334      3838     586435  filesystems
  • 其中数字命名的目录对应的是各进程的 pid 号,其内的文件记录的都是该进程当前的数据信息,且都是只读的。

  • 例如记录命令信息的 cmdline 文件,进程使用哪颗 cpu 信息 cpuset,进程占用内存的信息 mem 文件,进程 IO 信息 io 文件等其他各种信息文件。

    [root@computer1 ~]# ls /proc/62923/
    attr             cpuset   io         mounts      oom_score_adj  setgroups     syscall
    auxv             cwd      limits     mountstats  pagemap        smaps         task
    cgroup           environ  loginuid   net         personality    smaps_rollup  timers
    clear_refs       exe      map_files  ns          projid_map     stack         timerslack_ns
    cmdline          fd       maps       numa_maps   root           stat          uid_map
    comm             fdinfo   mem        oom_adj     schedstat      statm         wchan
    coredump_filter  gid_map  mountinfo  oom_score   sessionid      status
    [root@computer1 ~]#

非数字命名的目录各有用途,例如 bus 表示总线信息,driver 表示驱动信息,fs 表示文件系统特殊信息,net 表示网络信息,tty 表示跟物理终端有关的信息,最特殊的两个是 /proc/self 和 /proc/sys。

  • 先说 /proc/self 目录,它表示的是当前正在访问 /proc 目录的进程,因为 /proc 目录是内核数据向外记录的接口,所以当前访问 /proc 目录的进程表示的就是当前 cpu 正在执行的进程。

    如果执行 cat /proc/self/cmdline,会发现其结果总是该命令本身,因为 cat 是手动敲入的命令,它是重要性进程,cpu 会立即执行该命令。

  • 再说 /proc/sys 这个目录,该目录是为管理员提供用来修改内核运行参数的,所以该目录中的文件对 root 都是可写的,例如管理数据包转发功能的 /proc/sys/net/ipv4/ip_forward 文件。

    使用 sysctl 命令修改内核运行参数,其本质也是修改 /proc/sys 目录中的文件。

10.2、查看进程信息

10.2.1、pstree 命令

pstree 命令将以树的形式显示进程信息,默认树的分支是收拢的,也不显示 pid,要显示这些信息需要指定对应的选项。

pstree [-a] [-c] [-h] [-l] [-p] [pid]

选项说明:
-a:显示进程的命令行
-c:展开分支
-h:高亮当前正在运行的进程及其父进程
-p:显示进程pid,此选项也将展开分支
-l:允许显示长格式进程。默认在显示结果中超过132个字符时将截断后面的字符。
[root@computer1 ~]# pstree -h
systemd─┬─3*[agetty]
        ├─auditd───{auditd}
        ├─chronyd
        ├─collectdmon───collectd───11*[{collectd}]
        ├─containerd─┬─containerd-shim─┬─openresty───4*[openresty]
        │            │                 └─11*[{containerd-shim}]
        │            ├─containerd-shim─┬─npm─┬─sh───node───10*[{node}]
        │            │                 │     └─10*[{npm}]
        │            │                 └─11*[{containerd-shim}]
        │            └─76*[{containerd}]
        ├─crond
        ├─dbus-daemon
        ├─2*[dnsmasq]
        ├─dockerd───74*[{dockerd}]
        ├─etcd───76*[{etcd}]
        ├─gssproxy───5*[{gssproxy}]
        ├─irqbalance───{irqbalance}
        ├─kylin-security-───{kylin-security-}
        ├─libvirtd───17*[{libvirtd}]
        ├─2*[lighttpd]
        ├─mdadm
        ......

10.2.2、ps 命令

ps 命令查看当前这一刻的进程信息,注意查看的是静态进程信息,要查看随时刷新的动态进程信息(如windows的进程管理器那样,每秒刷新一次),使用 top 或 htop 命令。

这个命令的 man 文档及其复杂,它同时支持 3 种类型的选项:GUN/BSD/UNIX,不同类型的选项其展示的信息格式不一样。有些加了 "-" 的是 SysV 风格的选项,不加 "-" 的是 BSD 选项,加不加 "-" 它们的意义是不一样的,例如 ps aux 和 ps -aux 是不同的。

其实只需掌握少数几个选项即可,关键的是要了解 ps 显示出的进程信息中每一列代表什么属性。

对于 BSD 风格的选项,只需知道一个用法 ps aux 足以:

  • 选项 "a" 表示列出依赖于终端的进程
  • 选项 "x" 表示列出不依赖于终端的进程,所以两者结合就表示列出所有进程
  • 选项 "u" 表示展现的进程信息是以用户为导向的,不用管它什么是以用户为导向,用 ps aux 就没错。
[root@computer1 ~]# ps aux | tail
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root     3819329  0.0  0.0      0     0 ?        I    20:35   0:00 [kworker/25:3-cgroup_destroy]
root     3819915  0.0  0.0      0     0 ?        I    20:35   0:00 [kworker/0:2]
root     3820740  0.0  0.0      0     0 ?        I    20:36   0:00 [kworker/24:1-cgroup_pidlist_destroy]
root     3820741  0.0  0.0      0     0 ?        I    20:36   0:00 [kworker/24:2-cgroup_pidlist_destroy]
root     3822389  0.0  0.0      0     0 ?        I    20:37   0:00 [kworker/27:0-cgroup_pidlist_destroy]
root     3822390  0.0  0.0      0     0 ?        I    20:37   0:00 [kworker/27:3-cgroup_destroy]
root     3822812  0.0  0.0      0     0 ?        I    20:37   0:00 [kworker/14:0-mm_percpu_wq]
root     3822878  0.0  0.0 218816  6272 pts/16   R+   20:37   0:00 ps aux
root     3822879  0.0  0.0 213056   960 pts/16   S+   20:37   0:00 tail
nobody   4119590  0.0  0.0   5312  1536 ?        S    7月12   0:00 /usr/local/zstack/dnsmasq --conf-file=/var/lib/zstack/dnsmasq/br_bond2_4002_533d732ae8fa49e89b24b384cb869a71/dnsmasq.conf
[root@computer1 ~]#
  • %CPU:表示 CPU 占用百分比,注意,CPU 的衡量方式是占用时间,所以百分比的计算方式是 "进程占用 cpu 时间 / cpu 总时间",而不是 cpu 工作强度的状态。

  • %MEM:表示各进程所占物理内存百分比。

  • VSZ:表示各进程占用的虚拟内存,也就是其在线性地址空间中实际占用的内存。单位为 kb。

  • RSS:表示各进程占用的实际物理内存。单位为 Kb。

  • TTY:表示属于哪个终端的进程,"?" 表示不依赖于终端的进程。

  • STAT:进程所处的状态。

    • D:不可中断睡眠
    • R:运行中或等待队列中的进程(running/runnable)
    • S:可中断睡眠
    • T:进程处于 stopped 状态
    • Z:僵尸进程

    对于 BSD 风格的 ps 选项,进程的状态还会显示下面几个组合信息。

    • <:高优先级进程
    • N:低优先级进程
    • L:该进程在内存中有被锁定的页
    • s:表示该进程是 session leader,即进程组的首进程。例如管道左边的进程,shell 脚本中的 shell 进程
    • l:表示该进程是一个线程
    • +:表示是前端进程。前端进程一般来说都是依赖于终端的
  • START:表示进程是何时被创建的

  • TIME:表示各进程占用的 CPU 时间

  • COMMAND:表示进程的命令行。如果是内核线程,则使用方括号 "[]" 包围

注意到了没,ps aux 没有显示出 ppid

另外常用的 ps 选项是 ps -elf。其中 "-e" 表示输出全部进程信息,"-f" 和 "-l" 分别表示全格式输出和长格式输出。全格式会输出 cmd 的全部参数。

[root@computer1 ~]# ps -elf | tail
F S UID          PID    PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
1 I root     3850806       2  0  80   0 -     0 worker 20:48 ?        00:00:00 [kworker/48:0-cgroup_destroy]
1 I root     3852226       2  0  80   0 -     0 worker 20:49 ?        00:00:00 [kworker/51:2-cgroup_destroy]
1 I root     3854390       2  0  80   0 -     0 worker 20:50 ?        00:00:00 [kworker/0:0]
1 I root     3855361       2  0  80   0 -     0 worker 20:50 ?        00:00:00 [kworker/53:0]
1 I root     3855430       2  0  80   0 -     0 worker 20:50 ?        00:00:00 [kworker/u128:0-bond1]
1 I root     3857251       2  0  80   0 -     0 worker 20:51 ?        00:00:00 [kworker/54:1]
0 S root     3857779  339964  0  80   0 -    78 do_wai 20:51 ?        00:00:00 /bin/bash
0 R root     3857782 3809064  0  80   0 -  3419 -      20:51 pts/16   00:00:00 ps -elf
0 S root     3857783 3809064  0  80   0 -  3329 pipe_w 20:51 pts/16   00:00:00 tail
5 S nobody   4119590       1  0  80   0 -    83 do_sys 7月12 ?       00:00:00 /usr/local/zstack/dnsmasq --conf-file=/var/lib/zstack/dnsmasq/br_bond2_4002_533d732ae8fa49e89b24b384cb869a71/dnsmasq.conf
[root@computer1 ~]#
  • F:程序的标志位。0 表示该程序只有普通权限,4 表示具有 root 超级管理员权限,1 表示该进程被创建的时候只进行了 fork,没有进行 exec
  • S:进程的状态位,注意 ps 选项加了 "-" 的是非 BSD 风格选项,不会有 "s" "<" "N" "+" 等的状态标识位
  • C:CPU 的百分比,注意衡量方式是时间
  • PRI:进程的优先级,值越小,优先级越高,越早被调度类选中运行
  • NI:进程的 NICE 值,值为 -20 到 19,影响优先级的方式是 PRI(new)=PRI(old)+NI,所以 NI 为负数的时候,越小将导致进程优先级越高。
    • 但要注意,NICE 值只能影响非实时进程。
  • ADDR:进程在物理内存中哪个地方。
  • SZ:进程占用的实际物理内存
  • WCHAN:若进程处于睡眠状态,将显示其对应内核线程的名称,若进程为 R 状态,则显示 "-"

10.2.3、ps 后 grep 问题

在 ps 后加上 grep 筛选目标进程时,总会发现 grep 自身进程也被显示出来。

[root@computer1 ~]# ps aux | grep "crond"
root        2483  0.0  0.0 216128  4544 ?        Ss   4月27   0:12 /usr/sbin/crond -n
root     3894948  0.0  0.0 214080  1536 pts/16   S+   21:07   0:00 grep crond
[root@computer1 ~]# 

先解释下为何会如此。

  • 管道是 bash 创建的,bash 创建管道后 fork 两个子进程,然后两子进程各自 exec 加载 ps 程序和 grep 程序,exec 之后这两个子进程就称为 ps 进程和 grep 进程,所以 ps 和 grep 进程几乎可以认为是同时出现的。
  • 尽管 ps 进程作为管道的首进程(进程组首进程)它是先出现的,但是在 ps 出现之前确实两个进程都已经 fork 完成了。也就是说,管道左右两端的进程是同时被创建的(不考虑父进程创建进程消耗的那点时间),但数据传输是有先后顺序的,左边先传,右边后收。

要将 grep 自身进程排除在结果之外也简单:

[root@computer1 ~]# ps aux | grep "crond" | grep -v "grep"
root        2483  0.0  0.0 216128  4544 ?        Ss   4月27   0:12 /usr/sbin/crond -n
[root@computer1 ~]#

10.2.4、uptime 命令

[root@computer1 ~]# uptime 
 21:11:52 up 90 days,  5:40,  1 user,  load average: 9.48, 7.70, 7.06
[root@computer1 ~]#
  • 显示当前时间,已开机运行多少时间,当前有多少用户已登录系统,以及 3 个平均负载值。

所谓负载率(load),即特定时间长度内,cpu 运行队列中的平均进程数(包括线程),一般平均每分钟每核的进程数小于 3 都认为正常,大于 5 时负载已经非常高。

在 UNIX 系统中,运行队列包括 cpu 正在执行的进程和等待 cpu 的进程(即所谓的可运行 runable)。

在 Linux 系统中,还包括不可中断睡眠态(IO等待)的进程。运行队列中每出现一个进程,load 就加 1,进程每退出运行队列,Load 就减 1。如果是多核 cpu,则还要除以核数。

举个例子:单核 cpu 上的负载值为 "1.73 0.60 7.98" 时

  • 最近 1 分钟:1.73 表示平均可运行的进程数,这一分钟要一直不断地执行这 1.73 个进程。0.73个进程等待该核 cpu。
  • 最近 5 分钟:平均进程数还不足 1,表示该核 cpu 在过去 5 分钟空闲了 40% 的时间。
  • 最近 15 分钟:7.98 表示平均可运行的进程数,这 15 分钟要一直不断地执行这 7.98 个进程。
  • 结合前 5 分钟的结果,说明前15 - 前10分钟时间间隔内,该核 cpu 的负载非常高。

如果是多核 cpu,则还要将结果除以核数。例如 4 核时,某个最近一分钟的负载值为 3.73,则意味着有 3.73 个进程在运行队列中,这些进程可被调度至 4 核中的任何一个核上运行。最近 1 分钟的负载值为 1.6,表示这一分钟内每核 cpu 都空闲 (1-1.6/4) = 60% 的时间。

所以,load 的理想值是正好等于 CPU 的核数,小于核数的时候表示 cpu 有空闲,超出核数的时候表示有进程在等待 cpu,即系统资源不足。

10.2.5、top、htop 和 iftop 命令

top 命令查看动态进程状态,默认每 5 秒刷新一次。

top选项说明:
-d:指定top刷新的时间间隔,默认是5 秒
-b:批处理模式,每次刷新分批显示
-n:指定top刷新几次就退出,可以配合-b使用
-p:指定监控的pid,指定方式为-pN1 -pN2 ...或-pN1, N2 [,...]
-u:指定要监控的用户的进程,可以是uid也可以是user_name

在 top 动态模式下,按下各种键可以进行不同操作。使用 "h" 或 "?" 可以查看相关键的说明。

  • 1 :(数字一)表示是否要在 top 的头部显示出多个 cpu 信息
  • H :表示是否要显示线程,默认不显示
  • c,S : c 表示是否要展开进程的命令行,S 表示显示的 cpu 时间是否是累积模式,cpu 累积模式下已死去的子进程 cpu 时间会累积到父进程中
  • x,y :x 高亮排序的列,y 表示高亮 running 进程
  • u :仅显示指定用户的进程
  • n or #:设置要显示最大的进程数量
  • k :杀进程
  • q :退出 top
  • P :以 CPU 的使用资源排序显示
  • M :以 Memory 的使用资源排序显示
  • N :以 PID 来排序

以下是 top 的一次结果

top - 22:14:25 up 90 days,  6:42,  1 user,  load average: 8.03, 7.75, 7.47
Tasks: 684 total,   1 running, 683 sleeping,   0 stopped,   0 zombie
%Cpu(s):  7.1 us,  3.0 sy,  0.4 ni, 89.1 id,  0.0 wa,  0.3 hi,  0.2 si,  0.0 st
MiB Mem : 258904.8 total,  27806.9 free, 212285.7 used,  18812.2 buff/cache
MiB Swap:   4095.9 total,    843.4 free,   3252.6 used.  40057.7 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND              
2741972 root      20   0   35.9g  28.2g  67264 S 106.9  11.1   6878:55 qemu-kvm             
 965894 root      20   0   18.4g  15.4g  49152 S 100.7   6.1 144804:03 qemu-kvm             
 411643 root      29   9   35.2g  32.3g  48384 S  75.2  12.8 115823:39 qemu-kvm             
 410344 root      20   0   10.4g   8.3g  46208 S  66.0   3.3  56623:49 qemu-kvm             
2507753 root      21   1   19.4g   8.5g  66688 S  53.1   3.4   3674:36 qemu-kvm             
 411734 root      20   0   35.2g  31.9g  49664 S  46.9  12.6  66581:37 qemu-kvm             
 759742 root      20   0   20.5g  14.6g  59392 S  43.2   5.8  31980:38 qemu-kvm
  • 第 1 行:和 w 命令的第一行一样,也和 uptime 命令的结果一样。此行各列分别表示 "当前时间"、"已开机时长"、"当前在线用户"、"前 1、5、15 分钟平均负载率"。
  • 第 2 行:分别表示总进程数、running 状态的进程数、睡眠状态的进程数、停止状态进程数、僵尸进程数。
  • 第 3 行:cpu 的状况。按数字 1 可以显示所有 CPU 的情况
    • us = user mode
    • sy = system mode
    • ni = low priority user mode (nice)(用户空间中低优先级进程的cpu占用百分比)
    • id = idle task
    • wa = I/O waiting
    • hi = servicing IRQs(不可中断睡眠,hard interruptible)
    • si = servicing soft IRQs(可中断睡眠,soft interruptible)
    • st = steal (time given to other DomU instances)(被偷走的cpu时间,一般被虚拟化软件偷走)
  • 第 4 - 5 行:从字面意思理解即可。
  • VIRT:虚拟内存总量
  • RES:实际内存总量
  • SHR:共享内存量
  • TIME:进程占用的 cpu 时间(若开启了时间累积模式,则此处显示的是累积时间)

top 命令虽然非常强大,但是太老了。所以有了新生代的 top 命令 htop。htop 默认没有安装,需要手动安装。

注意:我的实验环境是 arm64 架构服务器,使用的也是国产化操作系统,rpm 源没有 htop 包,可以手动下载一个 aarch64 架构的 htop 包。

[root@computer1 ~]# wget https://download-ib01.fedoraproject.org/pub/epel/7/aarch64/Packages/h/htop-2.2.0-3.el7.aarch64.rpm
--2021-07-26 22:23:16--  https://download-ib01.fedoraproject.org/pub/epel/7/aarch64/Packages/h/htop-2.2.0-3.el7.aarch64.rpm
正在解析主机 download-ib01.fedoraproject.org (download-ib01.fedoraproject.org)... 152.19.134.145, 2610:28:3090:3001:dead:beef:cafe:fed6
正在连接 download-ib01.fedoraproject.org (download-ib01.fedoraproject.org)|152.19.134.145|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:103092 (101K) [application/x-rpm]
正在保存至: “htop-2.2.0-3.el7.aarch64.rpm”

htop-2.2.0-3.el7.aarch6 100%[============================>] 100.68K   129KB/s  用时 0.8s    

2021-07-26 22:23:18 (129 KB/s) - 已保存 “htop-2.2.0-3.el7.aarch64.rpm” [103092/103092])

[root@computer1 ~]# rpm -ivh htop-2.2.0-3.el7.aarch64.rpm 
警告:htop-2.2.0-3.el7.aarch64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID 352c64e5: NOKEY
Verifying...                          ################################# [100%]
准备中...                          ################################# [100%]
    软件包 htop-2.2.0-3.el7.aarch64 已经安装
[root@computer1 ~]#
[root@computer1 ~]# htop

htop 可以使用鼠标完成点击选中。其他使用方法和 top 类似,使用 h 查看各按键意义即可。

iftop 用于动态显示网络接口的数据流量。用法也很简单,按下 h 键即可获取帮助。

[root@computer1 ~]# wget https://download-ib01.fedoraproject.org/pub/epel/7/aarch64/Packages/i/iftop-1.0-0.21.pre4.el7.aarch64.rpm
--2021-07-26 22:26:27--  https://download-ib01.fedoraproject.org/pub/epel/7/aarch64/Packages/i/iftop-1.0-0.21.pre4.el7.aarch64.rpm
正在解析主机 download-ib01.fedoraproject.org (download-ib01.fedoraproject.org)... 152.19.134.145, 2610:28:3090:3001:dead:beef:cafe:fed6
正在连接 download-ib01.fedoraproject.org (download-ib01.fedoraproject.org)|152.19.134.145|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:58521 (57K) [application/x-rpm]
正在保存至: “iftop-1.0-0.21.pre4.el7.aarch64.rpm”

iftop-1.0-0.21.pre4.el7 100%[============================>]  57.15K   113KB/s  用时 0.5s    

2021-07-26 22:26:29 (113 KB/s) - 已保存 “iftop-1.0-0.21.pre4.el7.aarch64.rpm” [58521/58521])

[root@computer1 ~]# rpm -ivh iftop-1.0-0.21.pre4.el7.aarch64.rpm 
警告:iftop-1.0-0.21.pre4.el7.aarch64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID 352c64e5: NOKEY
Verifying...                          ################################# [100%]
准备中...                          ################################# [100%]
正在升级/安装...
   1:iftop-1.0-0.21.pre4.el7          ################################# [100%]
[root@computer1 ~]#
[root@computer1 ~]# iftop

10.2.6、分析系统负载

根据前文 uptime 中对系统负载(system load)的描述,分析一下这个 top 的结果。

top - 22:43:43 up 90 days,  7:11,  1 user,  load average: 224.02, 215.13, 115.86
Tasks: 676 total,   1 running, 675 sleeping,   0 stopped,   0 zombie
%Cpu(s):  6.6 us,  2.3 sy,  0.2 ni, 90.5 id,  0.0 wa,  0.3 hi,  0.1 si,  0.0 st
MiB Mem : 258904.8 total,  27779.5 free, 212293.6 used,  18831.8 buff/cache
MiB Swap:   4095.9 total,    843.4 free,   3252.6 used.  40048.4 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND              
 965894 root      20   0   18.4g  15.4g  49152 S  99.3   6.1 144842:23 qemu-kvm             
2741972 root      20   0   35.9g  28.2g  67264 S  94.4  11.1   6910:46 qemu-kvm             
2507753 root      21   1   19.4g   8.5g  66688 S  73.8   3.4   3691:52 qemu-kvm             
 411643 root      29   9   35.2g  32.3g  48384 S  70.5  12.8 115845:21 qemu-kvm             
 411734 root      20   0   35.2g  31.9g  48000 S  60.3  12.6  66597:18 qemu-kvm             
 410344 root      20   0   10.4g   8.3g  46208 S  51.3   3.3  56637:55 qemu-kvm             
3313620 root      20   0   19.6g  10.8g  54784 S  42.1   4.3  65953:40 qemu-kvm             
 759742 root      20   0   20.5g  14.6g  59392 S  40.7   5.8  31990:35 qemu-kvm             
2187301 root      20   0   10.2g   5.8g  54144 S  14.6   2.3  82:58.59 qemu-kvm             
3707987 root      20   0   10.7g   7.3g  50432 S   7.0   2.9   3687:12 qemu-kvm        

根据 top 数据显示,load average 系统负载非常之高,最近一分钟的负载量高达 224.02,这表示这一分钟有 224.02 个进程正在运行或等待调度,如果是单核 CPU,表示这一分钟要毫不停留地执行这么多进程,如果是 8 核 CPU,表示这一分钟内平均每核心 CPU 要执行大概 30 个进程。

从 load average 上看,确实是非常繁忙的场景。但是看 CPU 的 idle 值为 90.5,说明 CPU 非常闲。为什么系统负载如此高,CPU 却如此闲?

前面解释 system load average 的时候,已经说明过可运行的(就绪态,即就绪队列的长度)、正在运行的(运行态)和不可中断睡眠(如IO等待)的进程任务都会计算到负载中。现在负载高、CPU 空闲,说明当前正在执行的任务基本不消耗 CPU 资源,大量的负载进程都在 IO 等待中

可以从 ps 的进程状态中获取哪些进程是正在运行或运行队列中的(状态为 R),哪些进程是在不可中断睡眠中的(状态为 D)。

[root@computer1 ~]# ps -eo stat,pid,ppid,comm --no-header | grep -E "^(D|R)"
R    4141039  130875 du
R+   4141085 3809064 ps
[root@computer1 ~]# 

10.3、vmstat 命令

注意 vmstat 的第一次统计是自开机起的平均值信息,从第二次开始的统计才是指定刷新时间间隔内的资源利用信息,若不指定刷新时间间隔,则默认只显示一次统计信息。

vmstat [-d] [delay [ count]]
vmstat [-f]

选项说明:
-f:统计自开机起fork的次数。包括fork、clone、vfork的次数。但不包括exec次数。
-d:显示磁盘统计信息。
delay:刷新时间间隔,若不指定,则只统计一次信息就退出vmstat。
count:总共要统计的次数。

例如,只统计一次信息。

[root@computer1 ~]# vmstat 
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
15  1 3328960 28476288 1216320 18014592    0    0     0     6    0    0  9  2 88  0  0
[root@computer1 ~]#
  • procs
    • r: 等待队列中的进程数
    • b: 不可中断睡眠的进程数
  • Memory
    • swpd: 虚拟内存使用总量
    • free: 空闲内存量
    • buff: buffer占用的内存量(buffer 用于缓冲)
    • cache: cache 占用的内存量(cache 用于缓存)
  • Swap
    • si: 从磁盘加载到swap分区的数据流量,单位为 "kb/s"
    • so: 从 swap 分区写到磁盘的数据流量,单位为"kb/s"
  • IO
    • bi: 从块设备接受到数据的速率,单位为 blocks/s
    • bo: 发送数据到块设备的速率,单位为 blocks/s
  • System
    • in: 每秒中断数,包括时钟中断数量
    • cs: 每秒上下文切换次数
  • CPU:统计的是 cpu 时间百分比,具体信息和 top 的 cpu 统计列一样
    • us: Time spent running non-kernel code. (user time, including nice time)
    • sy: Time spent running kernel code. (system time)
    • id: Time spent idle. Prior to Linux 2.5.41, this includes IO-wait time.
    • wa: Time spent waiting for IO. Prior to Linux 2.5.41, included in idle.
    • st: Time stolen from a virtual machine. Prior to Linux 2.6.11, unknown.

10.4、iostat 命令

iostat 主要统计磁盘或分区的整体使用情况。也可以输出 cpu 信息,甚至是 NFS 网络文件系统的信息。同 vmstat/sar 一样,第一次统计的都是自系统开机起的平均统计信息

linux_observability_tools

iostat [选项] [ device  [...]| ALL ] [ interval [ count ] ]

选项:
    -c:                 显示 CPU 利用率报告
    -d:                 显示 device 利用率报告
    --dec={ 0|1|2 }:    指定要使用的小数位数(0 到 2,默认值是 2)。
    -h/--human:         用人类可读的格式打印大小(例如 1.0k、1.2M 等)
    -k:                 以 Kb/s 显示
    -m:                 以 mb/s 显示
    -N:                 显示已注册的 device mapper 名称,对于查看 LVM2 报告特别有用
    -o JSON:            用 JSON 格式显示报告
    -p [device|ALL]:    显示系统所有块设备及块设备分区的报告,如果指定device,则只显示device和其分区报告。
    -t:                 为每次报告显示增加时间戳,时间戳的格式依赖于 S_TIME_FORMAT 环境变量的值
    -V:                 打印版本号然后退出
    -x:                 显示扩展报告
    -y:                 如果给了interval显示多次报告,该选项可以忽略第一次报告(系统启动至今的统计)。
    -z:                 如果相同的期间设备没有活动的数据,iostat 会不显示设备相同的输出数据。

环境变量:iostat 会把下面的环境变量考虑进去用来增强特殊功能
    POSIXLY_CORRECT:    设置这个变量传输速率将以512字节块展示而不是默认的1K块展示
    S_COLORS:           设置这个变量可以使显示报告中的数据带颜色
    S_COLORS_SGR:       指定颜色和其它属性用来显示报告,它的值是一个冒号分隔的功能列表,默认值为 H=31;1:I=32;22:M=35;1:N=34;1:Z=34;22.
                        支持的能力有:
                        H= SGR (Select Graphic Rendition)子字符串用于大于或等于75%的百分比值。  
                        I= SGR子字符串用于设备名称。  
                        M= SGR子字符串,用于百分比值在50%到75%之间。  
                        N= SGR子串用于非零统计值。  
                        Z= SGR子串为零值。
    S_TIME_FORMAT:      如果这个变量存在并且它的值是ISO,那么当在报告标题中打印日期时,当前区域设置将被忽略。
                        iostat命令将使用ISO 8601格式(YYYY-MM-DD)。 选项-t显示的时间戳也符合ISO 8601格式。

举例:

# iostat                    为所有的CPU和设备显示系统启动至今的历史报告
# iostat -d 2               每隔2秒钟连续显示设备报告
# iostat -d 2 6             每隔2秒钟连续显示设备报告,共显示6次
# iostat -x sda sdb 2 6     为设备 sda sdb 每隔2秒钟连续显示6次扩展报告
# iostat -p sda 2 6         每隔2秒连续显示6次sda和其分区的报告
[root@computer1 ~]# iostat -c
Linux 4.19.90-17.ky10.aarch64 (computer1)   2021年07月27日     _aarch64_   (64 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           9.21    0.00    2.37    0.02    0.00   88.41
  • %user
    • 显示用户空间 CPU 使用率百分比。
  • %nice
    • 显示拥有 nice 值用户空间 CPU 使用率百分比。
  • %system
    • 显示内核空间 CPU 使用率百分比。
  • %iowait
    • 发生 IO 请求时,CPU 空闲等待百分比。
  • %steal
    • 物理 CPU 为虚拟机服务的时间所占的百分比。
  • %idle
    • 不算 IO 等待,CPU 完全空闲时间百分比。

注意:如果是多核 CPU,这里显示的是全局多核平均值。

[root@computer1 ~]# iostat -d -x
Linux 4.19.90-17.ky10.aarch64 (computer1)   2021年07月27日     _aarch64_   (64 CPU)

Device            r/s     rkB/s   rrqm/s  %rrqm r_await rareq-sz     w/s     wkB/s   wrqm/s  %wrqm w_await wareq-sz     d/s     dkB/s   drqm/s  %drqm d_await dareq-sz  aqu-sz  %util
sda              0.01      0.34     0.00  24.08    5.27    51.90    5.37    411.65     3.45  39.09   34.68    76.64    0.00      0.00     0.00   0.00    0.00     0.00    0.17   2.09

[root@computer1 ~]#
  • Device
    • 这一列给出了 /dev 目录中列出的设备(或分区)名称。
  • r/s
    • 设备每秒完成的读请求数(合并后)
  • rkB/s
    • 每秒从设备读取的 KB 大小
  • rrqm/s
    • 每秒设备队列中读取请求的合并数量
  • %rrqm
    • 发送到设备前的读请求合并数所占百分比
  • r_await
    • 向提供服务的设备发起读请求的平均时间(以毫秒为单位),这包括在请求队列中花费的时间和服务它们的时间
  • rareq-sz
    • 向设备发起读请求的平均大小,以 kb 为单位
  • w/s
    • 设备每秒完成的写请求数(合并后)
  • wkB/s
    • 每秒向设备写入的 KB 大小
  • wrqm/s
    • 每秒设备队列中写入请求的合并数量
  • %wrqm
    • 发送到设备前的写请求合并数所占百分比
  • w_await
    • 向提供服务的设备发起写请求的平均时间(以毫秒为单位),这包括在请求队列中花费的时间和服务它们的时间
  • wareq-sz
    • 向设备发起写请求的平均大小,以 kb 为单位
  • d/s
    • 设备每秒完成的丢弃请求数(合并后)
  • dkB/s
    • 每秒为设备丢弃的 KB 大小
  • drqm/s
    • 每秒设备队列中丢弃请求的合并数量
  • %drqm
    • 发送到设备前的丢弃请求合并数所占百分比
  • d_await
    • 向提供服务的设备发起丢弃请求的平均时间(以毫秒为单位),这包括在请求队列中花费的时间和服务它们的时间
  • dareq-sz
    • 向设备发起丢弃请求的平均大小,以 kb 为单位
  • aqu-sz
    • 向设备发起请求的平均队列长度(老版本叫 avgqu-sz)
  • %util
    • 设备带宽百分比,串行服务的设备此百分比接近 100% 时会达到饱和;但是对于并行设备,比如 RAID 和现代 SSD,这个值还不能反映它们的性能瓶颈。
[root@computer1 ~]# iostat -d
Linux 4.19.90-17.ky10.aarch64 (computer1)   2021年07月27日     _aarch64_   (64 CPU)

Device             tps    kB_read/s    kB_wrtn/s    kB_dscd/s    kB_read    kB_wrtn    kB_dscd
sda               5.38         0.34       411.62         0.00    2694156 3237630625          0

[root@computer1 ~]#
  • Device
    • 这一列给出了 /dev 目录中列出的设备(或分区)名称。
  • tps
    • 每秒向设备发起的传输数量,一次传输是一次向设备发起的 IO 请求,多个逻辑请求可以合并成一个到设备的 IO 请求;传输的大小是不确定的。
  • kB_read/s
    • 每秒从设备读多少 KB 数据
  • kB_wrtn/s
    • 每秒向设备写多少 KB 数据
  • kB_dscd/s
    • 每秒为设备丢弃多少 KB 数据
  • kB_read
    • 读的总 KB 大小
  • kB_wrtn
    • 写的总 KB 大小
  • kB_dscd
    • 丢弃的总 KB 大小

10.5、sar 命令

sar 命令很强大,是分析系统性能的重要工具之一,通过该命令可以全面地获取系统的 CPU、运行队列、磁盘读写(I/O)、分区(交换区)、内存、CPU 中断和网络等性能数据。

linux_observability_sar

sar 命令的基本格式如下:

sar [options] [-o filename] interval [count]

此命令格式中,各个参数的含义如下:
-o filename:    其中,filename 为文件名,此选项表示将命令结果以二进制格式存放在文件中;
interval:       表示采样间隔时间,该参数必须手动设置;
count:          表示采样次数,是可选参数,其默认值为 1;
options:        为命令行选项,由于 sar 命令提供的选项很多,这里不再一一介绍,仅列举出常用的一些选项及对应的功能,如表 1 所示。

表 1 sar 命令行选项及功能

sar命令选项 功能
-A 显示所有的报告信息
-b 显示I/O速率
-B 显示换页状态
-c 显示进程创建活动
-d 显示每个块设备的状态
-e 设置显示报告的结束时间
-f 从指定文件提取报告
-i 设状态信息刷新的间隔时间
-P 报告每个CPU的状态
-R 显示内存状态
-u 显示CPU利用率
-v 显示索引节点,文件和其他内核表的状态
-w 显示交换分区状态
-x 显示给定进程的状态

10.5.1、CPU 资源监控

每 5s 采样一次,连续采样 3 次,观察 cpu 使用情况,并将采样结果以二进制形式存入 sar.bin 中:

[root@computer1 ~]# sar -u -o sar.bin 5 3
Linux 4.19.90-17.ky10.aarch64 (computer1)   2021年07月27日     _aarch64_   (64 CPU)

20时11分56秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
20时12分01秒     all      6.79      0.27      3.15      0.02      0.00     89.76
20时12分06秒     all      7.37      0.23      3.01      0.01      0.00     89.37
20时12分11秒     all      5.58      0.23      2.96      0.04      0.00     91.19
平均时间:     all      6.58      0.24      3.04      0.02      0.00     90.11
[root@computer1 ~]#

查看二进制文件 sar.bin 中的内容:

[root@computer1 ~]# sar -u -f sar.bin 
Linux 4.19.90-17.ky10.aarch64 (computer1)   2021年07月27日     _aarch64_   (64 CPU)

20时11分56秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
20时12分01秒     all      6.79      0.27      3.15      0.02      0.00     89.76
20时12分06秒     all      7.37      0.23      3.01      0.01      0.00     89.37
20时12分11秒     all      5.58      0.23      2.96      0.04      0.00     91.19
平均时间:   all      6.58      0.24      3.04      0.02      0.00     90.11
[root@computer1 ~]#

输出项说明:

CPU:        all 表示统计信息为所有 CPU 的平均值。

%user:      显示在用户空间使用 CPU 时间占总 CPU 时间的百分比。

%nice:      显示在用户空间,用于 nice 操作,所占用 CPU 总时间的百分比。

%system:    显示在内核空间使用 CPU 时间占总 CPU 时间的百分比。

%iowait:    显示用于等待 I/O 时间占 CPU 总时间的百分比。

%steal:     监控程序(hypervisor)为另一个虚拟进程提供服务所用时间占总 CPU 时间的百分比。

%idle:      显示 CPU 空闲时间占用 CPU 总时间的百分比。

分析:

1.若 %iowait的值过高,表示硬盘存在I/O瓶颈

2.若 %idle 的值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量

3.若 %idle 的值持续低于 1,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU。

10.5.2、inode、文件和其他内核表监控

每 5 秒采样一次,连续采样 10 次,观察核心表的状态

[root@computer1 ~]# sar -v 5 10
Linux 4.19.90-17.ky10.aarch64 (computer1)   2021年07月27日     _aarch64_   (64 CPU)

20时26分13秒 dentunusd   file-nr  inode-nr    pty-nr
20时26分18秒    376931      7552    386492        17
20时26分23秒    376936      7552    386503        17
20时26分28秒    376934      7424    386493        17
20时26分33秒    376935      7296    386489        17
20时26分38秒    376939      7424    386507        17
20时26分43秒    376935      7296    386494        17
20时26分48秒    376931      7296    386506        17
20时26分53秒    376926      7296    386486        17
20时26分58秒    376923      7168    386485        17
20时27分03秒    376919      7168    386473        17
平均时间:    376931      7347    386493        17
[root@computer1 ~]#

输出项说明:

dentunusd:  目录高速缓存中未被使用的条目数量

file-nr:    文件句柄(filehandle)的使用数量

inode-nr:   索引节点句柄(inodehandle)的使用数量

pty-nr:     使用的pty数量

10.5.3、内存和交换空间监控

每 5s 采样一次,连续采样 10 次,监控内存分页

[root@computer1 ~]# sar -r 5 10
Linux 4.19.90-17.ky10.aarch64 (computer1)   2021年07月27日     _aarch64_   (64 CPU)

20时35分36秒 kbmemfree   kbavail kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
20时35分41秒  28258816  40953856 216293952     81.58   1226816  17106240 277867072    103.18 204313216  20613184     13504
20时35分46秒  28269184  40964160 216283584     81.58   1226816  17106240 278041472    103.24 204328896  20613440     13632
20时35分51秒  28290112  40985152 216262656     81.57   1226816  17106240 277853056    103.17 204317056  20613568     16384
20时35分56秒  28286400  40981440 216266496     81.57   1226816  17106240 277877632    103.18 204314368  20613568     16832
20时36分01秒  28298368  40993408 216254592     81.57   1226816  17106240 277867392    103.18 204322240  20613568     17728
20时36分06秒  28308352  41003392 216244608     81.57   1226816  17106240 277841728    103.17 204317376  20613568     16512
20时36分11秒  28296512  40991552 216256960     81.57   1226816  17106240 277781888    103.14 204318528  20613568      6208
20时36分16秒  28291520  40986560 216262400     81.57   1226816  17106240 277813696    103.16 204330688  20613568     12160
20时36分21秒  28245952  40940928 216307264     81.59   1226816  17106368 278131072    103.27 204335936  20613568     16704
20时36分26秒  28267776  40962816 216285376     81.58   1226816  17106368 277897152    103.19 204326144  20613504     16512
平均时间:  28281299  40976326 216271789     81.58   1226816  17106266 277897216    103.19 204322445  20613510     14618
[root@computer1 ~]#

输出项说明:

kbmemfree:              这个值和free命令中的free值基本一致,所以它不包括buffer和cache的空间.

kbmemused:              这个值和free命令中的used值基本一致,所以它包括buffer和cache的空间.

%memused:               这个值是kbmemused和内存总量(不包括swap)的一个百分比.

kbbuffers   kbcached:   这两个值就是free命令中的buffer和cache.

kbcommit:               保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM+swap).

%commit:                这个值是kbcommit与内存总量(包括swap)的一个百分比.

kbactive:               活动内存的 Kb 数量(最近使用的内存,除非绝对必要,否则通常不会回收)。  

kbinact:                不活动内存的 Kb 数量(它更适合被回收作其他用途)。  

kbdirty:                等待写回磁盘的 Kb 内存量

10.5.4、内存分页监控

每 10s 采样一次,连续采样 3 次,监控内存分页

[root@computer1 ~]# sar -B 10 3
Linux 4.19.90-17.ky10.aarch64 (computer1)   2021年07月27日     _aarch64_   (64 CPU)

21时13分20秒  pgpgin/s pgpgout/s   fault/s  majflt/s  pgfree/s pgscank/s pgscand/s pgsteal/s    %vmeff
21时13分30秒      0.00   1645.60   1915.10      0.00   1257.10      0.00      0.00      0.00      0.00
21时13分40秒      0.00     16.00   3075.40      0.00   1614.90      0.00      0.00      0.00      0.00
21时13分50秒      0.00     30.00   1549.10      0.00   1056.40      0.00      0.00      0.00      0.00
平均时间:      0.00    563.87   2179.87      0.00   1309.47      0.00      0.00      0.00      0.00
[root@computer1 ~]#

输出项说明:

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)的百分比

10.5.5、I/O 和传送速率监控

每 5s 采样一次,连续采样 10 次,报告缓冲区的使用情况

[root@computer1 ~]# sar -b 5 10
Linux 4.19.90-17.ky10.aarch64 (computer1)   2021年07月27日     _aarch64_   (64 CPU)

21时30分27秒       tps      rtps      wtps      dtps   bread/s   bwrtn/s   bdscd/s
21时30分32秒     35.00      0.00     35.00      0.00      0.00   6604.80      0.00
21时30分37秒      0.60      0.00      0.60      0.00      0.00     46.40      0.00
21时30分42秒      0.60      0.00      0.60      0.00      0.00     41.60      0.00
21时30分47秒      6.80      0.00      6.80      0.00      0.00     88.00      0.00
21时30分52秒      0.60      0.00      0.60      0.00      0.00     25.60      0.00
21时30分57秒      0.40      0.00      0.40      0.00      0.00     40.00      0.00
21时31分02秒      0.40      0.00      0.40      0.00      0.00     17.60      0.00
21时31分07秒     41.20      0.00     41.20      0.00      0.00   7300.80      0.00
21时31分12秒      0.60      0.00      0.60      0.00      0.00     32.00      0.00
21时31分17秒      0.60      0.00      0.60      0.00      0.00     40.00      0.00
平均时间:      8.68      0.00      8.68      0.00      0.00   1423.68      0.00
[root@computer1 ~]#

输出项说明:

tps:        每秒钟物理设备的 I/O传输总量

rtps:       每秒钟从物理设备读入的数据总量

wtps:       每秒钟向物理设备写入的数据总量

bread/s:    每秒钟从物理设备读入的数据量,单位为块/s

bwrtn/s:    每秒钟向物理设备写入的数据量,单位为块/s

10.5.6、进程队列长度和平均负载状态监控

每 5s 采样一次,连续采样 10 次,监控进程队列长度和平均负载状态

[root@computer1 ~]# sar -q 5 10
Linux 4.19.90-17.ky10.aarch64 (computer1)   2021年07月27日     _aarch64_   (64 CPU)

21时36分13秒   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15   blocked
21时36分18秒         4      2469      6.88      6.89      6.92         0
21时36分23秒         5      2462      6.65      6.84      6.91         0
21时36分28秒         6      2462      6.68      6.84      6.91         0
21时36分33秒         2      2462      6.30      6.76      6.88         0
21时36分38秒         6      2471      5.96      6.68      6.85         0
21时36分43秒         4      2488      6.12      6.70      6.86         0
21时36分48秒         2      2462      5.79      6.63      6.83         0
21时36分53秒         7      2462      5.41      6.53      6.80         0
21时36分58秒         4      2471      6.18      6.67      6.85         0
21时37分03秒        14      2464      6.48      6.73      6.86         0
平均时间:         5      2467      6.25      6.73      6.87         0
[root@computer1 ~]#

输出项说明:

runq-sz:    运行队列的长度(等待运行的进程数)

plist-sz:   进程列表中进程(processes)和线程(threads)的数量

ldavg-1:    最后1分钟的系统平均负载(Systemload average)

ldavg-5:    过去5分钟的系统平均负载

ldavg-15:   过去15分钟的系统平均负载

blocked:    当前等待I/O完成而阻塞的任务数

10.5.7、系统交换活动信息监控

每 5s 采样一次,连续采样 10 次,监控系统交换活动信息

[root@computer1 ~]# sar -W 5 10
Linux 4.19.90-17.ky10.aarch64 (computer1)   2021年07月27日     _aarch64_   (64 CPU)

21时43分30秒  pswpin/s pswpout/s
21时43分35秒      0.00      0.00
21时43分40秒      0.00      0.00
21时43分45秒      0.00      0.00
21时43分50秒      0.00      0.00
21时43分55秒      0.00      0.00
21时44分00秒      0.00      0.00
21时44分05秒      0.00      0.00
21时44分10秒      0.00      0.00
21时44分15秒      0.00      0.00
21时44分20秒      0.00      0.00
平均时间:      0.00      0.00
[root@computer1 ~]#

输出项说明:

pswpin/s:每秒系统换入的交换页面(swap page)数量

pswpout/s:每秒系统换出的交换页面(swap page)数量

10.5.8、统计网络信息

sar 命令统计网络信息比较细致,语法是:

sar -n { keyword [,...] | ALL }

keyword: DEV, EDEV, FC, ICMP, EICMP, ICMP6,  EICMP6,  IP,  EIP, IP6, EIP6, NFS, NFSD, SOCK, SOCK6, SOFT, TCP, ETCP, UDP and UDP6.
  • DEV 显示网络接口信息
  • EDEV 显示关于网络错误的统计数据
  • NFS 统计活动的 NFS 客户端的信息
  • NFSD 统计 NFS 服务器的信息
  • SOCK 显示套接字信息
  • ALL 表示所有 keyword
  • 它们可以单独或者一起使用

10.5.8.1、sar -n DEV 1 3

每间隔 1 秒统计一次,总计统计 3 次,下面的 average 是在多次统计后的平均值

[root@controller1 ~]# sar -n DEV 1 1
Linux 4.19.90-17.ky10.aarch64 (controller1)     07/27/2021  _aarch64_   (64 CPU)

10:15:52 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
10:15:53 PM  enp2s0f0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
10:15:53 PM   rename3      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
10:15:53 PM      ens1     73.00     45.00     47.98      5.14      0.00      0.00      0.00      0.04
10:15:53 PM  enp2s0f1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
10:15:53 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

Average:        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
Average:     enp2s0f0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:      rename3      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:         ens1     73.00     45.00     47.98      5.14      0.00      0.00      0.00      0.04
Average:     enp2s0f1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:           lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
[root@controller1 ~]#

# 如果接口太多,可以使用 --iface 指定接口
[root@controller1 ~]# sar -n DEV --iface=enp2s0f0 1 1
Linux 4.19.90-17.ky10.aarch64 (controller1)     07/27/2021  _aarch64_   (64 CPU)

10:16:29 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
10:16:30 PM  enp2s0f0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

Average:        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
Average:     enp2s0f0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
[root@controller1 ~]#

输出项说明:

IFACE       本地网卡接口的名称

rxpck/s     每秒钟接受的数据包

txpck/s     每秒钟发送的数据库

rxKB/S      每秒钟接受的数据包大小,单位为KB

txKB/S      每秒钟发送的数据包大小,单位为KB

rxcmp/s     每秒钟接受的压缩数据包

txcmp/s     每秒钟发送的压缩包

rxmcst/s    每秒钟接收的多播数据包

10.5.8.2、sar -n EDEV 1 1

统计网络设备通信失败信息

[root@controller1 ~]# sar -n EDEV 1 1
Linux 4.19.90-17.ky10.aarch64 (controller1)     07/27/2021  _aarch64_   (64 CPU)

10:20:07 PM     IFACE   rxerr/s   txerr/s    coll/s  rxdrop/s  txdrop/s  txcarr/s  rxfram/s  rxfifo/s  txfifo/s
10:20:08 PM  enp2s0f0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
10:20:08 PM   rename3      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
10:20:08 PM      ens1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
10:20:08 PM  enp2s0f1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
10:20:08 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

Average:        IFACE   rxerr/s   txerr/s    coll/s  rxdrop/s  txdrop/s  txcarr/s  rxfram/s  rxfifo/s  txfifo/s
Average:     enp2s0f0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:      rename3      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:         ens1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:     enp2s0f1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:           lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
[root@controller1 ~]#

输出项说明:

IFACE       网卡名称

rxerr/s     每秒钟接收到的损坏的数据包

txerr/s     每秒钟发送的数据包错误数

coll/s      当发送数据包时候,每秒钟发生的冲撞(collisions)数,这个是在半双工模式下才有

rxdrop/s    当由于缓冲区满的时候,网卡设备接收端每秒钟丢掉的网络包的数目

txdrop/s    当由于缓冲区满的时候,网络设备发送端每秒钟丢掉的网络包的数目

txcarr/s    当发送数据包的时候,每秒钟载波错误发生的次数

rxfram      在接收数据包的时候,每秒钟发生的帧对其错误的次数

rxfifo      在接收数据包的时候,每秒钟缓冲区溢出的错误发生的次数

txfifo      在发生数据包的时候,每秒钟缓冲区溢出的错误发生的次数

10.5.8.3、sar -n SOCK 1 1

统计 socket 连接信息

[root@controller1 ~]# sar -n SOCK 1 1
Linux 4.19.90-17.ky10.aarch64 (controller1)     07/27/2021  _aarch64_   (64 CPU)

10:23:12 PM    totsck    tcpsck    udpsck    rawsck   ip-frag    tcp-tw
10:23:13 PM       271        65         2         2         0        64
Average:          271        65         2         2         0        64
[root@controller1 ~]#

输出项说明:

totsck      当前被使用的socket总数

tcpsck      当前正在被使用的TCP的socket总数

udpsck      当前正在被使用的UDP的socket总数

rawsck      当前正在被使用于RAW的skcket总数

if-frag     当前的IP分片的数目

tcp-twTCP   套接字中处于TIME-WAIT状态的连接数量

如果你使用 FULL 关键字,相当于上述 DEV、EDEV 和 SOCK 三者的综合

10.5.8.4、sar -n TCP 1 3

TCP连接的统计

[root@controller1 ~]# sar -n TCP 1 3
Linux 4.19.90-17.ky10.aarch64 (controller1)     07/27/2021  _aarch64_   (64 CPU)

10:25:18 PM  active/s passive/s    iseg/s    oseg/s
10:25:19 PM      5.00      5.00     82.00     82.00
10:25:20 PM      0.00      0.00     11.00     10.00
10:25:21 PM      1.00      0.00      3.00      4.00
Average:         2.00      1.67     32.00     32.00
[root@controller1 ~]#

输出项说明:

active/s    新的主动连接

passive/s   新的被动连接

iseg/s      接受的段

oseg/s      输出的段

10.5.9、设备使用情况监控

每 5s 采样一次,连续采样 10 次,报告设备使用情况

[root@controller1 ~]# sar -d 5 5 -p
Linux 4.19.90-17.ky10.aarch64 (controller1)     07/27/2021  _aarch64_   (64 CPU)

10:30:02 PM       DEV       tps     rkB/s     wkB/s     dkB/s   areq-sz    aqu-sz     await     %util
10:30:07 PM       sda      7.40      0.00     84.00      0.00     11.35      0.00      0.11      0.00
10:30:07 PM     loop0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

10:30:07 PM       DEV       tps     rkB/s     wkB/s     dkB/s   areq-sz    aqu-sz     await     %util
10:30:12 PM       sda     39.60      0.00   3297.60      0.00     83.27      0.67     19.43      1.00
10:30:12 PM     loop0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

10:30:12 PM       DEV       tps     rkB/s     wkB/s     dkB/s   areq-sz    aqu-sz     await     %util
10:30:17 PM       sda      7.00      0.00     75.20      0.00     10.74      0.00      0.09      0.00
10:30:17 PM     loop0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

10:30:17 PM       DEV       tps     rkB/s     wkB/s     dkB/s   areq-sz    aqu-sz     await     %util
10:30:22 PM       sda     14.20      0.00    132.80      0.00      9.35      0.00      0.21      0.00
10:30:22 PM     loop0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

10:30:22 PM       DEV       tps     rkB/s     wkB/s     dkB/s   areq-sz    aqu-sz     await     %util
10:30:27 PM       sda      6.80      0.00     74.40      0.00     10.94      0.00      0.09      0.00
10:30:27 PM     loop0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

Average:          DEV       tps     rkB/s     wkB/s     dkB/s   areq-sz    aqu-sz     await     %util
Average:          sda     15.00      0.00    732.80      0.00     48.85      0.13     10.33      0.20
Average:        loop0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
[root@controller1 ~]# 

参数

-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的百分比,比率越大,说明越饱和.

10.6、free 命令

free 用于查看内存使用情况。

free [options]
选项说明:
-h:人类可读方式显式单位
-m:以MB为显示单位
-w:将buffers和cache分开单独显示。只对CentOS 7上有效
-s:动态查看内存信息时的刷新时间间隔
-c:一共要刷新多少次退出free
[root@computer1 ~]# free -mh
              total        used        free      shared  buff/cache   available
Mem:          252Gi       209Gi        24Gi       320Mi        18Gi        36Gi
Swap:         4.0Gi       4.0Gi          0B
[root@computer1 ~]#

Mem 和 Swap 分别表示物理内存和交换分区的使用情况。

  • total:总内存空间
  • used:已使用的内存空间。该值是 total - free - buffers - cache的结果
  • free:未使用的内存空间
  • shared:多数情况下 /tmpfs 用的内存空间。对内核版本有要求,若版本不够,则显示为 0。
  • buff/cache:buffers 和 cache 的总占用空间
  • available:可用的内存空间。即程序启动时,将认为可用空间有这么多。可用的内存空间为free + buffers + cache。

所以 available 才是真正需要关注的可使用内存空间量。

使用 -w 可以将 buffers/cache 分开显示。

[root@computer1 ~]# free -wh
              total        used        free      shared     buffers       cache   available
Mem:          252Gi       209Gi        24Gi       320Mi       1.2Gi        17Gi        36Gi
Swap:         4.0Gi       4.0Gi          0B
[root@computer1 ~]#

还可以动态统计内存信息,例如每秒统计一次,统计 2 次。

[root@computer1 ~]# free -w -m -h -s 1 -c 2
              total        used        free      shared     buffers       cache   available
Mem:          252Gi       209Gi        24Gi       316Mi       1.2Gi        17Gi        36Gi
Swap:         4.0Gi       4.0Gi          0B

              total        used        free      shared     buffers       cache   available
Mem:          252Gi       209Gi        24Gi       320Mi       1.2Gi        17Gi        36Gi
Swap:         4.0Gi       4.0Gi          0B
[root@computer1 ~]#
标签云