本文是学习极客时间《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 - 任务写入磁盘2coder!被取消的速率(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