# 综合测试

# top

:一个命令行工具,能实时监控各进程的 CPU、内存等状态。

  • 用法:

    top           # 打开一个监控窗口
        -n <int>  # 在监控窗口刷新 n 次之后就退出
    
  • 打开 top 窗口之后可以输入以下命令:

    # 控制显示颜色
    x     # 加亮显示被排序的那一列
    y     # 加亮显示 Running 状态的每行进程
    b     # 将用 x、y 加亮显示的行和列填充底色
    z     # 将部分显示内容标上颜色
    
    # 控制显示内容
    i     # 隐藏 idle 或 Zombie 状态的进程
    H     # 切换第二行显示所有线程(Thread)的统计信息
    E/e   # 切换顶部或进程表中内存的显示单位
    c     # 切换显示完整的 Command
    V     # 切换显示 Command 的树状视图
    u     # 筛选显示的用户
    f     # 增加显示的字段比如 TTY(启动进程的终端名,不是从终端启动则显示 ?)、SWAP、nMaj(主缺页异常数)
    W     # 保存 top 的显示设置,下次启动 top 时自动重用
    
    # 控制显示效果
    s     # 改变显示内容的刷新间隔(默认为 3 秒刷新一次,按回车或空格可以手动刷新)
    Shift + <> # 左右切换按某列排序
    R     # 切换升序或降序排列
    L     # 搜索字符串默认显示第一个搜索结果的位置,按 & 则会查找下一个
    h/?   # 显示帮助页面
    
    # 控制进程
    k     # 根据 PID 选择一个进程,向它发送一个信号(默认发送 15)
    r     # 根据 PID 选择一个进程,设置它的优先级 NI
    
  • 例:

    [[email protected] ~]# top
    top - 09:42:39 up 19 days, 6:36,  1 user,  load average: 0.11, 0.15, 0.11
    Tasks:  7 total,   1 running,  6 sleeping,   0 stopped,   0 zombie
    %Cpu(s):  3.3 us,  1.7 sy,  0.0 ni, 95.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    KiB Mem :  1014740 total,   163768 free,   270932 used,   580040 buff/cache
    KiB Swap:        0 total,        0 free,        0 used.   538612 avail Mem
    
      PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
        1 root      20   0  125200   3680   2404 S   0.0  0.0   0:01.09 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
        2 root      20   0       0      0      0 S   0.0  0.0   0:00.00 [kthreadd]
        3 root      20   0       0      0      0 S   0.0  0.0   0:00.06 [ksoftirqd/0]
        4 root      20   0       0      0      0 S   0.0  0.0   0:00.52 [kworker/0:0]
        7 root      rt   0       0      0      0 S   0.0  0.0   0:00.00 [migration/0]
        8 root      20   0       0      0      0 S   0.0  0.0   0:00.00 [rcu_bh]
        9 root      20   0       0      0      0 S   0.0  0.0   0:01.71 [rcu_sched]
      10 root      rt   0       0      0      0 S   0.0  0.0   0:00.02 [watchdog/0]
      11 root      rt   0       0      0      0 S   0.0  0.0   0:00.02 [watchdog/1]
      12 root      rt   0       0      0      0 S   0.0  0.0   0:00.00 [migration/1]
    
    • 第一行与 uptime 命令的显示内容相同。
    • 第二行是所有进程(Task)的统计信息。
    • 第三行是 CPU 使用率的统计信息。
      • 这里显示的是 CPU 多个核的平均使用率,按 1 会分别显示各个核的使用率。
    • 第四行、第五行与 free 命令的显示信息相同。
    • 第六行是各进程的统计信息。
      • PR :进程的 Priority 优先级。
        • 取值为 rt 时表示 Real Time 类型的进程,省略其 Priority 值。
      • NI :进程的 NICE 优先级。
      • VIRT :Virtual Memory ,虚拟内存。
      • RES :Resident Memory ,常驻内存。
      • SHR :Shared Memory ,共享内存。
      • S :Status ,进程的运行状态。
      • %CPU :进程的 CPU 使用率,每次刷新显示时会重新计算。
        • 这里显示的是进程在 CPU 单个核上的使用率,即使达到 100%,可能 CPU 的其它核还是空闲的。
      • %MEM :进程的内存使用率,等于 RES 占内存总量的百分比。
      • TIME+ :进程占用的 CPU 时长(是用户态、内核态两种情况的总和),精确到百分之一秒。
        • Real Time :进程从启动时刻开始计算的运行时长(不管有没有占用 CPU )。
        • User CPU Time :进程在用户态占用的 CPU 时长。
        • System CPU Time :进程在内核态占用的 CPU 时长。
      • COMMAND :进程的启动命令。

# iotop

:一个命令行工具,能实时监控各进程的磁盘 IO 状态。

  • 安装:yum install iotop
  • 用法:
    iotop         # 打开一个监控窗口
        -P        # 显示进程级别。默认显示线程级别
        -p <pid>  # 只显示指定 PID 的进程。默认显示所有进程
        -u <uid>  # 只显示指定用户的进程
        -n <int>  # 在监控窗口刷新 n 次之后就退出
        -d 1.5    # 每隔多少秒刷新一次监控窗口。默认为 1
    
  • 打开 iotop 窗口之后可以输入以下命令:
    a     # 显示开始执行 iotop 至今,每个进程的磁盘 IO 总量。默认显示每秒 IO 量
    p     # 切换显示进程、线程
    o     # 只显示当前磁盘 IO 量大于 0 的进程
    
  • 例:
    [[email protected] ~]# iotop -P
    Total DISK READ :     123.64 K/s | Total DISK WRITE :       5.39 M/s
    Actual DISK READ:     123.64 K/s | Actual DISK WRITE:       3.72 M/s
      PID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND
    13428 be/4 root        0.00 B/s  837.77 K/s  0.00 %  0.00 % filebeat
    15649 be/4 1001        0.00 B/s  810.15 K/s  0.00 %  0.01 % mysqld
      514 be/4 root        0.00 B/s  162.68 K/s  0.00 %  0.00 % systemd-journald
    
    • Total DISK 表示内核线程读写磁盘的量,不一定等于所有进程的总和。
    • Actual DISK 表示实际读写磁盘设备的量。
    • PRIO 列表示 IO 优先级。
    • DISK READ 列表示最近一秒的读取磁盘量。
    • SWAPIN 列表示占用 Swap 分区的百分比。
    • IO 列表示 iowait 类型的 CPU 使用率。

# iftop

:一个命令行工具,能实时监控各 Socket 的每秒网络流量。

  • 安装:yum install iftop

  • 用法:

    iftop         # 打开一个监控窗口
        -i eth0   # 指定要监控的网卡。默认监控第一个网卡
        -B        # 相当于 -u bytes
        -u bits|bytes|packets # 显示流量的单位。默认为 bits
        -m 1G     # 设置流量刻度的最大值。默认会自动设置
        -n        # 取消将 IP 显示成主机名、域名
        -N        # 取消将端口号显示成服务名
        -P        # 显示端口。默认只显示网络流量的收、发 IP ,不显示端口
    
        # 设置过滤器
        -f <filter>
          host 10.0.    # 只显示与指定 IP 相关的流量
          src 10.0.0.1  # 只显示指定源 IP 的流量
          dst port 22   # 只显示指定目标端口的流量
    
  • 打开 iftop 窗口之后可以输入以下命令:

    b     # 切换是否显示顶部的流量刻度
    j/k   # 下上滚动
    l     # 编辑 filter
    L     # 切换是否显示一个横向的柱状图,方便比较每行的流量大小
    n     # 切换是否将 IP 显示成主机名、域名
    p     # 切换是否显示端口号
    P     # 暂停窗口的显示
    t     # 切换每行的显示模式:只显示发流量、只显示收流量、同时显示两种流量、合并成一行流量
    T     # 增加显示一列,表示每行从建立 Socket 连接以来的总流量
    h/?   # 显示帮助页面
    
  • 例:

    [[email protected] ~]# iftop -B
                          205MB                  410MB                  614MB                  819MB                 1.00GB
    └──────────────────────┴──────────────────────┴──────────────────────┴──────────────────────┴───────────────────────────
    10.0.0.1                                          => baidu.com                                  146Kb   110Kb   804Kb
                                                      <=                                            269Kb   204Kb   241Kb
    10.0.0.1                                          => 10.0.0.2                                   12.5Kb  10.2Kb  10.8Kb
                                                      <=                                            75.3Kb  60.5Kb  64.8Kb
    10.0.0.1                                          => 10.0.0.3                                   12.3Kb  9.86Kb  13.5Kb
                                                      <=                                            75.2Kb  60.4Kb  86.0Kb
    
    ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
    TX:             cum:   1.44MB   peak:   4.91Mb                                          rates:    187Kb   143Kb   842Kb
    RX:                     693KB            614Kb                                                    420Kb   328Kb   396Kb
    TOTAL:                 2.12MB           5.51Mb                                                    608Kb   471Kb  1.21Mb
    
    • 顶部一行表示流量刻度,按 L 启用柱状图时比较有用。
    • 每行的 =>、<= 表示网卡发送、接收的流量,在底部又汇总为 TX、RX、TOTAL 三行(汇总行不受 filter 影响)。
    • cum 列表示开始执行 iftop 至今的总流量,peak 列表示这期间的每秒流量峰值。
    • 右侧的 rates 三列表示最近 2s、10s、40s 的平均每秒流量。

# vmstat

:一个命令行工具,能以表格形式显示 CPU、内存、磁盘 IO 等监控指标。

vmstat                  # 在一行内显示 CPU、内存、磁盘 IO 等监控指标
      [delay [count]]   # 每隔 delay 秒显示一次,如果省略 delay 则只显示一次。最多显示 count 次,如果省略 count 则为无限次
      -w                # 按宽排版显示
      -t                # 增加显示时间戳
  • 例:
    [[email protected] ~]# vmstat -wt 1
    procs -----------------------memory---------------------- ---swap-- -----io---- -system-- --------cpu-------- -----timestamp-----
    r  b         swpd         free         buff        cache   si   so    bi    bo   in   cs  us  sy  id  wa  st                 CST
    2  0            0       163228       101368      1073712    0    0    20    17    3    5   3   2  95   0   0 2019-12-05 11:40:20
    0  0            0       163080       101368      1073712    0    0     0     0  217  264   5   4  91   0   0 2019-12-05 11:40:21
    0  0            0       163064       101368      1073720    0    0     0     0  244  313   4   4  92   0   0 2019-12-05 11:40:22
    
    • process 状态
      • r :等待 CPU 运行的进程数。最好为 0 ,表示 CPU 没有过载。
      • b :等待磁盘 IO 的进程数。最好为 0 ,表示磁盘 IO 没有过载。
    • swap 状态
      • si :每秒从虚拟内存读取的数据量,单位 KByte 。最好为 0 ,表示内存够用。
      • so :每秒写出到虚拟内存的数据量,单位 KByte 。最好为 0 ,表示内存够用。
    • io 状态
      • bi :每秒从磁盘读取的数据块数。
      • bo :每秒写入磁盘的数据块数。
    • system 状态
      • in :每秒的中断数。
      • cs :CPU 每秒的上下文切换数(context switches)。

# sysstat

:一个工具包,提供了一些查看系统各方面统计信息(statistics)的工具。

  • 安装:yum install sysstat

其中的常用命令如下:

# mpstat

mpstat      # 查看 CPU 的详细统计信息

# iostat

iostat      # 显示 CPU 使用情况和磁盘读写 tps、读写速率、读写总量等
      -x    # 增加显示读写等待时间等

# sar

sar [options]    # 显示某些指标的历史记录
    -n DEV       # 显示本机网络接口的收发速率
    -u           # 显示 CPU 的使用情况
    -r           # 显示内存的使用情况
    -b           # 显示磁盘 IO 的 tps
    -B           # 显示磁盘每秒读写的 page 数

sar [options] [interval [count]]  # 实时显示某些指标
    -u 1 10        # 显示 CPU 的使用情况,每秒显示一次,总共显示 10 次
  • sar 可以查看系统指标的历史记录,也可以实时查看。
  • sar 会每隔十分钟收集一次系统的状态信息,并将它们保存到目录 /var/log/sa 下,每天保存一个文件。
  • 例:
    [[email protected] ~]# sar -n DEV 1
    Linux 3.10.0-957.5.1.el7.x86_64 (centos)        12/05/2019      _x86_64_        (1 CPU)
    11:58:32 AM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
    11:58:33 AM      eth0     10.00     10.00      0.77      1.24      0.00      0.00      0.00
    11:58:33 AM        lo      2.00      2.00      0.16      0.16      0.00      0.00      0.00
    
    • IFACE :网络接口。
    • rxpck/s、txpck/s 分别表示每秒接收、发送的包数。
    • kB/s 是每秒的千字节数,cmp/s 是每秒的压缩包数,mcst/s 是每秒的多播数据包数。
    • txkB/s :每秒钟发送的千字节数。

# pidstat

pidstat
        -u    # 显示各个进程的 CPU 使用率
        -r    # 显示各个进程的内存使用率
        -d    # 显示各个进程的磁盘 IO 速率
        -w    # 显示各个进程的上下文切换情况
        -l    # 显示完整的 Command
  • 例:
    [[email protected] ~]# pidstat -ul
    Linux 3.10.0-957.5.1.el7.x86_64 (centos)        12/05/2019      _x86_64_        (1 CPU)
    11:56:47 AM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
    11:56:47 AM     0         1    0.00    0.00    0.00    0.00     0  /usr/lib/systemd/systemd --system --deserialize 20
    11:56:47 AM     0         2    0.00    0.00    0.00    0.00     0  kthreadd
    11:56:47 AM     0         3    0.00    0.01    0.00    0.01     0  ksoftirqd/0
    11:56:47 AM     0         9    0.00    0.01    0.00    0.01     0  rcu_sched
    
    • %usr :进程在用户空间中的 CPU 使用率。
    • %guest :进程在虚拟机中的 CPU 使用率。

# stress

:一个压力测试工具,可以消耗 CPU、内存、磁盘资源。但不会生成测试报告,需要同时运行 top 等命令进行监控。

  • 安装:yum install stress
  • 用法:
    stress
          --cpu 2         # 产生 2 个测试 CPU 的进程,不停调用 sqrt()函数
    
          --vm 2          # 产生 2 个测试内存分配的进程,不停调用 malloc()和 free()函数(占用用户态 cpu )
          --vm-bytes 256M # 每个进程分配多少字节(默认为 256M ,单位可以是 B、K、M、G)
          --vm-hang 10    # 每次分配的内存隔 10 秒后才释放
    
          --io 2          # 产生 2 个测试磁盘 IO 的进程,不停调用 sync()函数,将内存中的数据写到磁盘上
    
          --hdd 2         # 产生 2 个测试磁盘写入的进程,不停调用 write()和 unlink()函数
          --hdd-bytes 1G  # 每个进程创建一个多大的磁盘块(默认为 1G)
    
          -t 10s          # 持续测试的时长(默认一直测试,单位可以是 s、m、h、d、y)