本文是学习极客时间《Linux性能优化实战》课程,针对课程中用到的一些命令的学习笔记。
课程信息

ps命令

不加参数执行ps
[root ~]#ps
  PID TTY          TIME CMD
 4273 pts/0    00:00:00 bash
 9507 pts/0    00:00:00 ps
[root ~]#

结果默认会显示4列信息。
PID: 运行着的命令(CMD)的进程编号
TTY: 命令所运行的位置(终端)
TIME: 运行着的该命令所占用的CPU处理时间
CMD: 该进程所运行的命令

显示所有进程

ps -ax,命令结果可能很长,可以配合less命令
ps -ax | less

根据用户过滤进程

查看用户root的进程:
ps -u root

[root ~]#ps -u root
  PID TTY          TIME CMD
    1 ?        00:00:01 systemd
    2 ?        00:00:00 kthreadd
    4 ?        00:00:00 kworker/0:0H
    6 ?        00:00:00 mm_percpu_wq
    7 ?        00:00:00 ksoftirqd/0
    8 ?        00:00:02 rcu_sched
    9 ?        00:00:00 rcu_bh
   10 ?        00:00:00 migration/0
   11 ?        00:00:00 watchdog/0
   12 ?        00:00:00 cpuhp/0
   13 ?        00:00:00 cpuhp/1
   14 ?        00:00:00 watchdog/1
   15 ?        00:00:00 migration/1
   16 ?        00:00:00 ksoftirqd/1
   18 ?        00:00:00 kworker/1:0H
   19 ?        00:00:00 kdevtmpfs
   20 ?        00:00:00 netns
   21 ?        00:00:00 rcu_tasks_kthre
   22 ?        00:00:00 kauditd
   24 ?        00:00:00 kworker/1:1
   25 ?        00:00:00 khungtaskd
   26 ?        00:00:00 oom_reaper
   27 ?        00:00:00 writeback
   28 ?        00:00:00 kcompactd0
   29 ?        00:00:00 ksmd
   30 ?        00:00:00 khugepaged
   31 ?        00:00:00 crypto
   32 ?        00:00:00 kintegrityd
   33 ?        00:00:00 kblockd
   34 ?        00:00:00 ata_sff
   35 ?        00:00:00 md
   36 ?        00:00:00 edac-poller
   37 ?        00:00:00 devfreq_wq
   38 ?        00:00:00 watchdogd
   41 ?        00:00:00 kswapd0
   42 ?        00:00:00 kworker/u65:0
   43 ?        00:00:00 ecryptfs-kthrea
   85 ?        00:00:00 kthrotld
   86 ?        00:00:00 acpi_thermal_pm
   87 ?        00:00:00 scsi_eh_0
   88 ?        00:00:00 scsi_tmf_0
   89 ?        00:00:00 scsi_eh_1
   90 ?        00:00:00 scsi_tmf_1
   99 ?        00:00:00 ipv6_addrconf
  108 ?        00:00:00 kstrp
  125 ?        00:00:00 charger_manager
使用cpu和内存使用过滤进程

真实环境下,希望按照CPU或者内存使用量来筛选,这样就可以找到哪个进程占用了你的资源。

[root ~]#ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.4 159872  9000 ?        Ss   14:56   0:01 /sbin/init splash
root         2  0.0  0.0      0     0 ?        S    14:56   0:00 [kthreadd]
root         4  0.0  0.0      0     0 ?        I<   14:56   0:00 [kworker/0:0H]
root         6  0.0  0.0      0     0 ?        I<   14:56   0:00 [mm_percpu_wq]
root         7  0.0  0.0      0     0 ?        S    14:56   0:00 [ksoftirqd/0]
root         8  0.0  0.0      0     0 ?        I    14:56   0:02 [rcu_sched]
root         9  0.0  0.0      0     0 ?        I    14:56   0:00 [rcu_bh]
root        10  0.0  0.0      0     0 ?        S    14:56   0:00 [migration/0]
root        11  0.0  0.0      0     0 ?        S    14:56   0:00 [watchdog/0]
root        12  0.0  0.0      0     0 ?        S    14:56   0:00 [cpuhp/0]
root        13  0.0  0.0      0     0 ?        S    14:56   0:00 [cpuhp/1]
root        14  0.0  0.0      0     0 ?        S    14:56   0:00 [watchdog/1]
root        15  0.0  0.0      0     0 ?        S    14:56   0:00 [migration/1]
root        16  0.0  0.0      0     0 ?        S    14:56   0:00 [ksoftirqd/1]
root        18  0.0  0.0      0     0 ?        I<   14:56   0:00 [kworker/1:0H]
root        19  0.0  0.0      0     0 ?        S    14:56   0:00 [kdevtmpfs]
root        20  0.0  0.0      0     0 ?        I<   14:56   0:00 [netns]
root        21  0.0  0.0      0     0 ?        S    14:56   0:00 [rcu_tasks_kthre]
root        22  0.0  0.0      0     0 ?        S    14:56   0:00 [kauditd]

当结果很长时,我们可以使用管道和less命令来筛选。默认结果是未排序的。可以通过--sort命令来排序。
根据CPU使用率降序排序:
ps -aux --sort -pcpu | less
根据内存使用率降序排序
ps -aux --sort -pmem | less

可以将他们合并到一个命令,并通过管道显示前10个结果:
ps -aux --sort -pcpu,+pmem | head -n 10

[root ~]#ps -aux --sort  -pcpu,+pmem | head -n 10
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
message+   647  0.3  0.2  50716  5112 ?        Ss   14:56   0:14 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
avahi      643  0.1  0.1  47512  3720 ?        Ss   14:56   0:04 avahi-daemon: running [parallels-Parallels-Virtual-Platform.local]
root       646  0.1  0.4 109240  9892 ?        Ss   14:56   0:07 /usr/sbin/cupsd -l
root         2  0.0  0.0      0     0 ?        S    14:56   0:00 [kthreadd]
root         4  0.0  0.0      0     0 ?        I<   14:56   0:00 [kworker/0:0H]
root         6  0.0  0.0      0     0 ?        I<   14:56   0:00 [mm_percpu_wq]
root         7  0.0  0.0      0     0 ?        S    14:56   0:00 [ksoftirqd/0]
root         8  0.0  0.0      0     0 ?        I    14:56   0:02 [rcu_sched]
root         9  0.0  0.0      0     0 ?        I    14:56   0:00 [rcu_bh]
通过进程名

根据CMD过滤ps显示
ps -C rcu_sched

[root ~]#ps -C rcu_sched
  PID TTY          TIME CMD
    8 ?        00:00:02 rcu_sched

如果要显示更多细节,可以使用-f参数来查看格式化的信息列表:

[root ~]#ps -f -C rcu_sched
UID        PID  PPID  C STIME TTY          TIME CMD
root         8     2  0 14:56 ?        00:00:02 [rcu_sched]
过滤特定进程的线程

ps -L 进程pid

[root ~]#ps -L 856
  PID   LWP TTY      STAT   TIME COMMAND
  856   856 ?        Ssl    0:00 /usr/lib/policykit-1/polkitd --no-debug
  856   901 ?        Ssl    0:00 /usr/lib/policykit-1/polkitd --no-debug
  856   906 ?        Ssl    0:01 /usr/lib/policykit-1/polkitd --no-debug
树形显示进程

ps -axjf

[root ~]#ps -axjf
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
    0     2     0     0 ?           -1 S        0   0:00 [kthreadd]
    2     4     0     0 ?           -1 I<       0   0:00  \_ [kworker/0:0H]
    2     6     0     0 ?           -1 I<       0   0:00  \_ [mm_percpu_wq]
    2     7     0     0 ?           -1 S        0   0:00  \_ [ksoftirqd/0]
    2     8     0     0 ?           -1 I        0   0:13  \_ [rcu_sched]
    2     9     0     0 ?           -1 I        0   0:00  \_ [rcu_bh]
    2    10     0     0 ?           -1 S        0   0:00  \_ [migration/0]
    2    11     0     0 ?           -1 S        0   0:00  \_ [watchdog/0]
    2    12     0     0 ?           -1 S        0   0:00  \_ [cpuhp/0]
    2    13     0     0 ?           -1 S        0   0:00  \_ [cpuhp/1]
    2    14     0     0 ?           -1 S        0   0:00  \_ [watchdog/1]

pstree显示更直观,日常开发中更倾向使用pstree。

[root ~]#pstree
systemd─┬─ModemManager───2*[{ModemManager}]
        ├─NetworkManager─┬─dhclient
        │                └─2*[{NetworkManager}]
        ├─acpid
        ├─avahi-daemon───avahi-daemon
        ├─colord───2*[{colord}]
        ├─containerd───12*[{containerd}]
        ├─cron
        ├─cups-browsed───2*[{cups-browsed}]
        ├─cupsd───dbus
        ├─dbus-daemon
        ├─irqbalance───{irqbalance}
        ├─2*[kerneloops]
        ├─login───bash
        ├─networkd-dispat───{networkd-dispat}
        ├─packagekitd───2*[{packagekitd}]
        ├─polkitd───2*[{polkitd}]
        ├─prltoolsd─┬─prlshprint───2*[{prlshprint}]
        │           ├─prltimesync
        │           ├─prltoolsd
        │           └─6*[{prltoolsd}]
        ├─rsyslogd───3*[{rsyslogd}]
        ├─snapd───11*[{snapd}]
        ├─sshd───sshd───bash───pstree
        ├─systemd───(sd-pam)
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-resolve
        ├─systemd-timesyn───{systemd-timesyn}
        ├─systemd-udevd
        ├─thermald───{thermald}
        ├─unattended-upgr───{unattended-upgr}
        ├─whoopsie───2*[{whoopsie}]
        └─wpa_supplicant
[root ~]#
显示安全信息

ps -eo pid,user,args

[root ~]#ps -eo pid,user,args
  PID USER     COMMAND
    1 root     /sbin/init splash
    2 root     [kthreadd]
    4 root     [kworker/0:0H]
    6 root     [mm_percpu_wq]
    7 root     [ksoftirqd/0]
    8 root     [rcu_sched]
    9 root     [rcu_bh]
   10 root     [migration/0]
   11 root     [watchdog/0]
   12 root     [cpuhp/0]
   13 root     [cpuhp/1]
   14 root     [watchdog/1]
   15 root     [migration/1]
   16 root     [ksoftirqd/1]
   18 root     [kworker/1:0H]
   19 root     [kdevtmpfs]
   20 root     [netns]

参数-e显示所有进程信息,-o参数控制输出。pid user args分别显示pid 运行应用的用户和应用本身。
能够与-e参数一起使用的关键字有:
args, cmd, comm, command, fname, ucmd, ucomm, lstart, bsdstart 和 start

格式化输出root用户(真实的或有效的UID)创建的进程

系统管理员想要查看由root用户运行的进程和这个进程的其他相关信息时可以使用如下命令:
ps -U root -u root u

[root ~]#ps -U root -u root u
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.4 159872  9000 ?        Ss   14:56   0:02 /sbin/init splash
root         2  0.0  0.0      0     0 ?        S    14:56   0:00 [kthreadd]
root         4  0.0  0.0      0     0 ?        I<   14:56   0:00 [kworker/0:0H]
root         6  0.0  0.0      0     0 ?        I<   14:56   0:00 [mm_percpu_wq]
root         7  0.0  0.0      0     0 ?        S    14:56   0:00 [ksoftirqd/0]
root         8  0.0  0.0      0     0 ?        I    14:56   0:14 [rcu_sched]
root         9  0.0  0.0      0     0 ?        I    14:56   0:00 [rcu_bh]
root        10  0.0  0.0      0     0 ?        S    14:56   0:00 [migration/0]
root        11  0.0  0.0      0     0 ?        S    14:56   0:00 [watchdog/0]
root        12  0.0  0.0      0     0 ?        S    14:56   0:00 [cpuhp/0]
root        13  0.0  0.0      0     0 ?        S    14:56   0:00 [cpuhp/1]
root        14  0.0  0.0      0     0 ?        S    14:56   0:00 [watchdog/1]
root        15  0.0  0.0      0     0 ?        S    14:56   0:00 [migration/1]
root        16  0.0  0.0      0     0 ?        S    14:56   0:00 [ksoftirqd/1]
root        18  0.0  0.0      0     0 ?        I<   14:56   0:00 [kworker/1:0H]
root        19  0.0  0.0      0     0 ?        S    14:56   0:00 [kdevtmpfs]
root        20  0.0  0.0      0     0 ?        I<   14:56   0:00 [netns]
root        21  0.0  0.0      0     0 ?        S    14:56   0:00 [rcu_tasks_kthre]
root        22  0.0  0.0      0     0 ?        S    14:56   0:00 [kauditd]
root        25  0.0  0.0      0     0 ?        S    14:56   0:00 [khungtaskd]
root        26  0.0  0.0      0     0 ?        S    14:56   0:00 [oom_reaper]
root        27  0.0  0.0      0     0 ?        I<   14:56   0:00 [writeback]
root        28  0.0  0.0      0     0 ?        S    14:56   0:00 [kcompactd0]
root        29  0.0  0.0      0     0 ?        SN   14:56   0:00 [ksmd]
root        30  0.0  0.0      0     0 ?        SN   14:56   0:00 [khugepaged]
root        31  0.0  0.0      0     0 ?        I<   14:56   0:00 [crypto]
root        32  0.0  0.0      0     0 ?        I<   14:56   0:00 [kintegrityd]

-U 参数按真实用户ID(RUID)筛选进程,它会从用户列表中选择真实用户名或 ID。真实用户即实际创建该进程的用户。
-u 参数用来筛选有效用户ID(EUID)。
最后的u参数用来决定以针对用户的格式输出,由User, PID, %CPU, %MEM, VSZ, RSS, TTY, STAT, START, TIME 和 COMMAND这几列组成。

使用ps实时监控进程状态

ps命令会显示你系统当前的进程状态,但这个结果是静态的。
如果我们希望每隔几秒就刷新一次,可以和watch命令结合起来。

watch -n 1 'ps -aux --sort -pmem,-pcpu '

执行结果:

Every 1.0s: ps -aux --sort -pmem,-pcpu                                         parallels-Parallels-Virtual-Platform: Sun Sep 15 23:17:00 2019

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root       255  0.0  2.6 149580 53236 ?        S<s  14:56   0:00 /lib/systemd/systemd-journald
root      1194  0.0  1.8 953120 37196 ?        Ssl  14:56   0:12 /usr/bin/containerd
root       748  0.0  1.2 860760 25640 ?        Ssl  14:56   0:03 /usr/lib/snapd/snapd
root      1163  0.0  0.9 194344 20128 ?        Ssl  14:56   0:00 /usr/bin/python3 /usr/share/unattended-upgrades/unattended-upgrade-shutdown
root       752  0.0  0.8 177636 17256 ?        Ssl  14:56   0:00 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
root       746  0.0  0.8 567832 16720 ?        Ssl  14:56   0:01 /usr/sbin/NetworkManager --no-daemon
colord     928  0.0  0.6 398720 13976 ?        Ssl  14:56   0:00 /usr/lib/colord/colord
root      2511  0.0  0.6 373700 13656 ?        Ssl  14:57   0:00 /usr/lib/packagekit/packagekitd
whoopsie  1488  0.0  0.6 464304 12636 ?        Ssl  14:56   0:00 /usr/bin/whoopsie -f
root       761  0.0  0.5 303664 10948 ?        Ssl  14:56   0:05 /usr/sbin/cups-browsed
root       646  0.1  0.4 109240  9892 ?        Ss   14:56   0:51 /usr/sbin/cupsd -l
root       693  0.0  0.4 434312  9452 ?        Ssl  14:56   0:00 /usr/sbin/ModemManager --filter-policy=strict
root       644  0.0  0.4 186940  9340 ?        Ssl  14:56   0:08 /usr/sbin/thermald --no-daemon --dbus-enable
root         1  0.0  0.4 159872  9000 ?        Ss   14:56   0:02 /sbin/init splash
root      3024  0.0  0.3  76884  7824 ?        Ss   14:58   0:00 /lib/systemd/systemd --user
root      4182  0.0  0.3 110076  7280 ?        Ss   15:05   0:00 sshd: root@pts/0
root       856  0.0  0.3 288880  6568 ?        Ssl  14:56   0:13 /usr/lib/policykit-1/polkitd --no-debug
root      1357  0.0  0.3  25992  6144 ?        S    14:56   0:00 /sbin/dhclient -d -q -sf /usr/lib/NetworkManager/nm-dhcp-helper -pf /run/dhc
systemd+   525  0.0  0.3  70752  6140 ?        Ss   14:56   0:00 /lib/systemd/systemd-resolved
root       642  0.0  0.2  70680  6024 ?        Ss   14:56   0:00 /lib/systemd/systemd-logind
lp        1623  0.0  0.2  86412  5876 ?        S    14:56   0:00 /usr/lib/cups/notifier/dbus dbus://
root      1286  0.0  0.2  72296  5796 ?        Ss   14:56   0:00 /usr/sbin/sshd -D
root       269  0.0  0.2  47488  5772 ?        Ss   14:56   0:02 /lib/systemd/systemd-udevd
root       707  0.0  0.2  45228  5440 ?        Ss   14:56   0:00 /sbin/wpa_supplicant -u -s -O /run/wpa_supplicant
root      4273  0.0  0.2  29880  5392 pts/0    Ss   15:05   0:00 -bash
root      3037  0.0  0.2  29884  5144 tty1     S+   14:58   0:00 -bash
message+   647  0.3  0.2  50716  5112 ?        Ss   14:56   1:51 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --syst
syslog     711  0.0  0.2 263036  4396 ?        Ssl  14:56   0:00 /usr/sbin/rsyslogd -n

如果输出太长,我们也可以限制它,比如前20条,我们可以使用head命令来做到。

watch -n 1 ‘ps -aux --sort -pmem, -pcpu | head 20’

如果只想看root用户的信息,可以使用如下命令:

watch -n 1 ‘ps -aux -U pungki u --sort -pmem, -pcpu | head 20’

pidstat命令

pidstat监控并统计Linux进程的数据

pidstat命令用来监控被Linux内核管理的独立任务(进程)。它输出每个受内核管理的任务的相关信息。pidstat命令也可以用来监控特定进程的子进程。间隔参数用于指定每次报告间的时间间隔。它的值为0(或者没有参数)说明进程的统计数据的时间是从系统启动开始计算的。

The  pidstat  command  is used for monitoring individual tasks currently being managed by the Linux kernel.  It writes to standard output activities for every task selected with option -p or for every task managed by the Linux kernel if option -p ALL  has  been used.  Not  selecting  any  tasks is equivalent to specifying -p ALL but only active tasks (tasks with non-zero statistics values) will appear in the report.
[root ~]#pidstat
Linux 4.15.0-62-generic (parallels-Parallels-Virtual-Platform)  09/18/2019  _x86_64_    (2 CPU)

11:26:17 PM   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
11:26:17 PM     0         1    0.01    0.04    0.00    0.01    0.05     1  systemd
11:26:17 PM     0         7    0.00    0.00    0.00    0.00    0.00     0  ksoftirqd/0
11:26:17 PM     0         8    0.00    0.06    0.00    0.02    0.06     0  rcu_sched
11:26:17 PM     0        10    0.00    0.00    0.00    0.00    0.00     0  migration/0
11:26:17 PM     0        11    0.00    0.00    0.00    0.00    0.00     0  watchdog/0
11:26:17 PM     0        14    0.00    0.00    0.00    0.00    0.00     1  watchdog/1
11:26:17 PM     0        15    0.00    0.00    0.00    0.00    0.00     1  migration/1
11:26:17 PM     0        16    0.00    0.01    0.00    0.00    0.01     1  ksoftirqd/1
11:26:17 PM     0        23    0.00    0.01    0.00    0.01    0.01     1  kworker/1:1
11:26:17 PM     0        92    0.00    0.03    0.00    0.01    0.03     1  kworker/u64:3
11:26:17 PM     0        93    0.00    0.01    0.00    0.00    0.01     0  kworker/u64:4
11:26:17 PM     0       202    0.00    0.00    0.00    0.01    0.00     0  kworker/0:1H
11:26:17 PM     0       224    0.00    0.00    0.00    0.00    0.00     0  jbd2/sda1-8
11:26:17 PM     0       263    0.00    0.01    0.00    0.01    0.01     0  systemd-journal
11:26:17 PM     0       265    0.00    0.01    0.00    0.00    0.01     1  kworker/1:1H
11:26:17 PM     0       286    0.02    0.02    0.00    0.08    0.03     0  systemd-udevd
11:26:17 PM     0       521    0.00    0.00    0.00    0.00    0.00     0  loop2
11:26:17 PM   101       526    0.00    0.00    0.00    0.00    0.00     1  systemd-resolve
11:26:17 PM 62583       527    0.00    0.00    0.00    0.00    0.00     1  systemd-timesyn
11:26:17 PM     0       532    0.00    0.00    0.00    0.00    0.00     0  loop6
11:26:17 PM     0       649    0.00    0.00    0.00    0.00    0.00     1  cron
11:26:17 PM   116       650    0.06    0.07    0.00    0.03    0.13     0  avahi-daemon
11:26:17 PM   103       651    0.24    0.14    0.00    0.12    0.38     0  dbus-daemon
11:26:17 PM   102       694    0.00    0.00    0.00    0.00    0.00     0  rsyslogd
11:26:17 PM     0       695    0.00    0.00    0.00    0.00    0.00     1  ModemManager
11:26:17 PM     0       723    0.01    0.00    0.00    0.00    0.01     1  NetworkManager
11:26:17 PM     0       734    0.00    0.00    0.00    0.00    0.00     0  systemd-logind
11:26:17 PM     0       759    0.03    0.02    0.00    0.02    0.05     0  snapd
11:26:17 PM     0       762    0.00    0.00    0.00    0.00    0.00     0  networkd-dispat
11:26:17 PM     0       796    0.00    0.00    0.00    0.00    0.00     0  wpa_supplicant

PID - 被监控的任务的进程号
%usr - 当在用户层执行(应用程序)时这个任务的cpu使用率,和 nice 优先级无关。注意这个字段计算的cpu时间不包括在虚拟处理器中花去的时间。
%system - 这个任务在系统层使用时的cpu使用率。
%guest - 任务花费在虚拟机上的cpu使用率(运行在虚拟处理器)。
%CPU - 任务总的cpu使用率。在SMP环境(多处理器)中,如果在命令行中输入-I参数的话,cpu使用率会除以你的cpu数量。
CPU - 正在运行这个任务的处理器编号。
Command - 这个任务的命令名称。

IO数据统计

pidstat -d -p pid

执行结果:
kB_rd/s - 任务从硬盘上的读取速度(kb)
kB_wr/s - 任务向硬盘中的写入速度(kb)
kB_ccwr/s - 任务写入磁盘被取消的速率(kb)

[root ~]#pidstat -d -p 830
Linux 4.15.0-62-generic (parallels-Parallels-Virtual-Platform)  09/18/2019  _x86_64_    (2 CPU)

11:30:46 PM   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s iodelay  Command
11:30:46 PM     0       830      0.24      0.00      0.00      52  polkitd
页面失败和内存使用

使用-r标记你能够得到内存使用情况的数据。

[root ~]#pidstat -r -p 830
Linux 4.15.0-62-generic (parallels-Parallels-Virtual-Platform)  09/18/2019  _x86_64_    (2 CPU)

11:33:16 PM   UID       PID  minflt/s  majflt/s     VSZ     RSS   %MEM  Command
11:33:16 PM     0       830      0.12      0.00  288880    6580   0.32  polkitd

minflt/s - 从内存中加载数据时每秒出现的小的错误的数目,这些不要求从磁盘载入内存页面。
majflt/s - 从内存中加载数据时每秒出现的较大错误的数目,这些要求从磁盘载入内存页面。
VSZ - 虚拟容量:整个进程的虚拟内存使用(kb)
RSS - 长期内存使用:任务的不可交换物理内存的使用量(kb)

使用范例:

pidstat -r 2 5

每隔2s生成页面失败和内存使用数据,间隔2s。这将会更容易的定位出现问题的进程。

显示所有kworker的子进程

[root ~]#pidstat -T CHILD -C kworker
Linux 4.15.0-62-generic (parallels-Parallels-Virtual-Platform)  09/18/2019  _x86_64_    (2 CPU)

11:43:45 PM   UID       PID    usr-ms system-ms  guest-ms  Command
11:43:45 PM     0        23         0       340         0  kworker/1:1
11:43:45 PM     0        93         0       700         0  kworker/u64:4
11:43:45 PM     0       202         0       170         0  kworker/0:1H
11:43:45 PM     0       265         0       240         0  kworker/1:1H
11:43:45 PM     0      9277         0       210         0  kworker/0:1
11:43:45 PM     0     12480         0       570         0  kworker/u64:0
11:43:45 PM     0     16122        30         0         0  kworker/0:0
11:43:45 PM     0     17432        10         0         0  kworker/u64:1

将所有的统计数据统计到一起显示:
pidstat -urd -h

vmstat命令

vmstat 是一个标准的工具,它会报告 Linux 系统的虚拟内存统计。vmstat 会报告有关进程、内存、分页、块 IO、陷阱(中断)和 cpu 活动的信息。它可以帮助 Linux 管理员在解决问题时识别系统瓶颈。
安装命令

[在 CentOS/RHEL 中安装 vmstat]
$ sudo yum install sysstat
[在 Fedora 中安装 vmstat]
$ sudo dnf install sysstat
[在 Debian/Ubuntu 中安装 vmstat]
$ sudo apt-get install sysstat
[在 Arch Linux 中安装 vmstat]
$ sudo pacman -S sysstat
[在 Mageia 中安装 vmstat]
$ sudo urpmi sysstat
[在 openSUSE 中安装 vmstat]
$ sudo zypper install sysstat

不带参数运行vmstat

# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 2  0  79496 1614120 139240 787928   0    0    23    10    0    0 11  1 88  0

procs:procs 中有 r 和 b 列,它报告进程统计信息。在上面的输出中,在运行队列(r)中有两个进程在等待 CPU 并有零个休眠进程(b)。通常,它不应该超过处理器(或核心)的数量,如果你发现异常,最好使用 top 命令进一步地排除故障。
r:等待运行的进程数。
b:休眠状态下的进程数。

memory: memory 下有报告内存统计的 swpd、free、buff 和 cache 列。你可以用 free -m 命令看到同样的信息。在上面的内存统计中,统计数据以千字节表示,这有点难以理解,最好添加 M 参数来看到以兆字节为单位的统计数据。

swpd:使用的虚拟内存量。
free:空闲内存量。
buff:用作缓冲区的内存量。
cache:用作高速缓存的内存量。
inact:非活动内存的数量。
active:活动内存量。

swap:swap 有 si 和 so 列,用于报告交换内存统计信息。你可以用 free -m 命令看到相同的信息。
si:从磁盘交换的内存量(换入,从 swap 移到实际内存的内存)。
so:交换到磁盘的内存量(换出,从实际内存移动到 swap 的内存)。

I/O:I/O 有 bi 和 bo 列,它以“块读取”和“块写入”的单位来报告每秒磁盘读取和写入的块的统计信息。如果你发现有巨大的 I/O 读写,最好使用 iotop 和 iostat 命令来查看。
bi:从块设备接收的块数。
bo:发送到块设备的块数。

system:system 有 in 和 cs 列,它报告每秒的系统操作。
in:每秒的系统中断数,包括时钟中断。
cs:系统为了处理所以任务而上下文切换的数量。

CPU:CPU 有 us、sy、id 和 wa 列,报告(所用的) CPU 资源占总 CPU 时间的百分比。如果你发现异常,最好使用 top 和 free 命令。
us:处理器在非内核程序消耗的时间。
sy:处理器在内核相关任务上消耗的时间。
id:处理器的空闲时间。
wa:处理器在等待IO操作完成以继续处理任务上的时间。

以MB方式输出

默认情况下,vmstat以千字节为单位显示内存统计,不能直观显示,可以添加-S m参数来获取以兆字节为单位的统计。

[root ~]#vmstat -S M
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0   1447     41    323    0    0    83     5   78  153  1  1 98  0  0
每M秒统计一次,统计N次
[root ~]#vmstat 2 10
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 1183600 178644 495864    0    0   136    10   87  169  1  1 97  0  0
 0  0      0 1183428 178652 495864    0    0     0    24  131  241  1  1 99  0  0
 0  0      0 1183468 178652 495864    0    0     0     0  138  242  1  1 99  0  0
 0  0      0 1182616 178652 495864    0    0     0    60  113  202  1  1 99  0  0
 0  0      0 1183384 178652 495864    0    0     0     0  107  186  0  0 99  0  0
 0  0      0 1183508 178652 495864    0    0     0     0  123  226  1  1 99  0  0
 0  0      0 1183384 178656 495864    0    0     0     2  133  234  1  1 98  0  0
 0  0      0 1183340 178656 495864    0    0     0     0  125  229  0  1 99  0  0
 0  0      0 1183508 178656 495864    0    0     0     0  131  239  1  1 99  0  0
 0  0      0 1183368 178656 495864    0    0     0     0  120  222  1  1 99  0  0
[root ~]#
显示活动和非活动内存

默认情况下,vmstat 会显示除活动和非活动内存之外的内存统计信息。如果要查看活动和非活动内存统计信息,请在 vmstat 后添加 -a 参数。

# vmstat -a
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free  inact active   si   so    bi    bo   in   cs us sy id wa
 1  0 105500 2387592 415148 584112   0    0    40    15    0    1 11  1 87  0
打印磁盘统计
[root ~]#vmstat -d
disk- ------------reads------------ ------------writes----------- -----IO------
       total merged sectors      ms  total merged sectors      ms    cur    sec
loop0     53      0     696      44      0      0       0       0      0      0
loop1     51      0     252      24      0      0       0       0      0      0
loop2    204      0     998     116      0      0       0       0      0      0
loop3    108      0    2234      44      0      0       0       0      0      0
loop4     40      0     230     112      0      0       0       0      0      0
loop5     20      0      94     404      0      0       0       0      0      0
loop6    492      0    1574     100      0      0       0       0      0      0
loop7     53      0     256      12      0      0       0       0      0      0
sda    36743   8930 1001514   76948   2318   1072   75040   29040      0     20
sr0        0      0       0       0      0      0       0       0      0      0
loop8   8760      0   19352   88832      0      0       0       0      0      2
loop9    202      0     994     304      0      0       0       0      0      0
loop10    383      0    1350     336      0      0       0       0      0      0
loop11    118      0    2260     292      0      0       0       0      0      0
loop12    181      0    2396     216      0      0       0       0      0      0
loop13     38      0     660     348      0      0       0       0      0      0
loop14    120      0    2264     228      0      0       0       0      0      0
loop15     53      0     696     192      0      0       0       0      0      0
loop16     40      0     230     208      0      0       0       0      0      0
loop17     41      0     232     140      0      0       0       0      0      0
loop18     20      0      94     112      0      0       0       0      0      0
loop19      4      0       8       8      0      0       0       0      0      0
总结磁盘统计

在 vmstat 后面添加 -D 会显示全局统计(包括全部的磁盘、分区、全部读、合并的读、读取的扇区、写、合并的写、写入的扇区和 IO)。

# vmstat -D
           27 disks
            3 partitions
    275754028 total reads
      1388030 merged reads
   5751195976 read sectors
    638710116 milli reading
     38795040 writes
     29520659 merged writes
   2209820333 written sectors
    130210652 milli writing
            0 inprogress IO
       224704 milli spent IO
打印指定分区

vmstat 添加 -p 参数后面跟上设备名会显示指定分区统计(包括读、读取的扇区、写以及请求的写)。

# vmstat -p /dev/sdb1
sdb1          reads   read sectors  writes    requested writes
                3115      27890     839453  206728016
vmstat 统计信息带上时间戳

当你想在特定时间区间内找到内存尖峰时,用 vmstat 命令添加 -t 参数,后跟延迟和计数。
注意:此组合不适用于基于 Debian 的系统(ubuntu etc)。

# vmstat -t 1 5
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ ---timestamp---
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 6981416 181324 24588604    0    0     0     1    0    0  0  0 100  0  0    2017-01-11 15:42:15 MST
 2  0      0 6981276 181324 24588604    0    0     0     0   91   40  0  0 100  0  0    2017-01-11 15:42:16 MST
 0  0      0 6982016 181324 24588604    0    0     0     0   75  116  0  0 100  0  0    2017-01-11 15:42:17 MST
 0  0      0 6982016 181324 24588604    0    0     0     0   43   39  0  0 100  0  0    2017-01-11 15:42:18 MST
 0  0      0 6982280 181324 24588604    0    0     0     0  113  185  0  0 100  0  0    2017-01-11 15:42:19 MST
打印更多统计

vmstat 后面跟上 -s 参数会显示不同统计的总结。

[root ~]#vmstat -s
      2035600 K total memory
       176924 K used memory
       365128 K active memory
       273148 K inactive memory
      1182968 K free memory
       178680 K buffer memory
       497028 K swap cache
      2097148 K total swap
            0 K used swap
      2097148 K free swap
         4673 non-nice user cpu ticks
            0 nice user cpu ticks
         4746 system cpu ticks
       435692 idle cpu ticks
          982 IO-wait cpu ticks
            0 IRQ cpu ticks
          185 softirq cpu ticks
            0 stolen cpu ticks
       519192 pages paged in
        37540 pages paged out
            0 pages swapped in
            0 pages swapped out
       372913 interrupts
       716922 CPU context switches
   1570293430 boot time
         8254 forks
[root ~]#
打印slab统计

vmstat 后面跟上 -m 参数会显示 slab 信息。

# vmstat -m
Cache                       Num  Total   Size  Pages
nf_conntrack_expect           0      0    240     16
nf_conntrack_ffffffff81b2a920     18     60    312     12
fib6_nodes                   24     59     64     59
ip6_dst_cache                16     30    384     10
ndisc_cache                   7     30    256     15
ip6_mrt_cache                 0      0    128     30
RAWv6                        35     35   1088      7
UDPLITEv6                     0      0   1024      4
UDPv6                         4     12   1024      4
tw_sock_TCPv6                 0      0    320     12
request_sock_TCPv6            0      0    192     20
TCPv6                         4      6   1920      2
fat_inode_cache               5      6    672      6
fat_cache                     0      0     32    112
ioat2                      4096   4140    128     30
ext4_inode_cache          34322  34364   1000      4
ext4_xattr                    0      0     88     44