Linux系统提供了很多小工具,让我们能方便地查看系统的性能,下面介绍日常工作中经常用到的这些命令。
vmstat命令
vmstat 可以定时显示系统的KPI指标,包括:进程、内存、交换文件、IO、系统、CPU 等。
它可以通过跟一个参数设定显示间隔。
例如下面的命令每2秒显示一次系统的信息
vmsta 2
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 138148 180708 1127556 0 0 5 15 3 8 0 0 99 0 0
0 0 0 138140 180708 1127592 0 0 0 2 22 294 0 0 100 0 0
0 0 0 138140 180708 1127592 0 0 0 18 27 344 1 0 99 0 0
0 0 0 137888 180708 1127592 0 0 0 0 35 320 1 0 99 0 0
0 0 0 137888 180708 1127592 0 0 0 18 30 323 0 0 99 0 0
0 0 0 137888 180708 1127592 0 0 0 18 36 347 1 0 99 0 0
0 0 0 137880 180708 1127592 0 0 0 0 20 288 0 0 100 0 0
0 0 0 137880 180708 1127592 0 0 0 18 296 885 0 1 99 0 0
0 0 0 137880 180708 1127592 0 0 0 18 36 338 0 1 99 0 0
procs 进程相关指标
- r:处于运行状态或者正在等待运行时间的进程数量。
- b:处于睡眠状态的进数量。
memory 内存相关指标,缺省单位是KB
- swpd:已经使用的交换区。
- free:未分配的内存。
- buff:用于缓冲区的内存,
- cache:用于缓存的内存,
swap 交换文件相关指标,缺省单位是KB
- si: 从内存交换到磁盘的总量
- so:从磁盘交换到内存的总量
io 相关指标
- bi: 每秒输入的block的数量
- bo:每秒输出的block的数量
系统相关指标
- in:每秒发生的系统中断次数
- cs:每秒发生的上下文切换次数
cpu 处理器相关指标
- us(user time):处理用户级任务的时间占比
- sy(system time):处理内核任务的时间占比
- id(idle):空闲时间占比
- wa(wait I/O):等待处理任务的时间占比
- st(steal time):虚拟化环境下
top命令
top 命令显示Linux系统各运行的进程性能数据,缺省按使用的CPU时间排序,并且每5秒更新一次。在界面的顶部,会显示系统系统运行时间,CPU,内存 等指标,管理员能对系统情况一目了然。
例如执行下面的命令
top
系统输出的信息样例如下:
top - 11:27:00 up 28 days, 21:37, 1 user, load average: 0.01, 0.03, 0.00
Tasks: 141 total, 1 running, 89 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.7 us, 0.2 sy, 0.0 ni, 99.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3993892 total, 139468 free, 2545968 used, 1308456 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 1119228 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 10 root 20 0 0 0 0 I 0.3 0.0 31:57.85 rcu_sched
1446 redis 20 0 51660 8340 2328 S 0.3 0.2 39:18.12 redis-server
1603 root 20 0 241736 29608 7792 S 0.3 0.7 291:20.98 python3
115338 yonglun 20 0 44540 3920 3280 R 0.3 0.1 0:00.01 top 241258 tomcat 20 0 3657844 318112 11884 S 0.3 8.0 20:02.73 java
1 root 20 0 225660 6608 3888 S 0.0 0.2 0:35.64 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.34 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp
6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H-kb
8 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq
9 root 20 0 0 0 0 S 0.0 0.0 0:35.88 ksoftirqd/0
11 root rt 0 0 0 0 S 0.0 0.0 0:06.03 migration/0
13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/0
14 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/1
15 root rt 0 0 0 0 S 0.0 0.0 0:06.76 migration/1
16 root 20 0 0 0 0 S 0.0 0.0 0:36.99 ksoftirqd/1
18 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/1:0H-kb
19 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
20 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 netns
ps命令
ps 命令能够查看系统当前运行的进程信息。
例如执行下面命令
$ ps -ef
将会列出系统当前正在运行的进程的详细信息,
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Feb06 ? 00:00:35 /sbin/init
root 2 0 0 Feb06 ? 00:00:00 [kthreadd]
root 3 2 0 Feb06 ? 00:00:00 [rcu_gp]
root 4 2 0 Feb06 ? 00:00:00 [rcu_par_gp]
root 6 2 0 Feb06 ? 00:00:00 [kworker/0:0H-kb]
root 8 2 0 Feb06 ? 00:00:00 [mm_percpu_wq]
root 9 2 0 Feb06 ? 00:00:35 [ksoftirqd/0]
root 10 2 0 Feb06 ? 00:31:56 [rcu_sched]
root 11 2 0 Feb06 ? 00:00:06 [migration/0]
root 13 2 0 Feb06 ? 00:00:00 [cpuhp/0]
root 14 2 0 Feb06 ? 00:00:00 [cpuhp/1]
root 15 2 0 Feb06 ? 00:00:06 [migration/1]
root 16 2 0 Feb06 ? 00:00:36 [ksoftirqd/1]
root 18 2 0 Feb06 ? 00:00:00 [kworker/1:0H-kb]
root 19 2 0 Feb06 ? 00:00:00 [kdevtmpfs]
root 20 2 0 Feb06 ? 00:00:00 [netns]
还可以配合grep 命令 过滤你需要查看的进程。
比如想查看系统中nginx 进程的信息,可执行下面的命令
$ ps -ef|grep nginx
会过滤ps-ef 输出的信息中包含nginx关键字的信息行
root 99324 1 0 07:04 ? 00:00:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data 99328 99324 0 07:04 ? 00:00:00 nginx: worker process
www-data 99329 99324 0 07:04 ? 00:00:00 nginx: worker process
yonglun 113181 111407 0 10:50 pts/0 00:00:00 grep --color=auto nginx
iostat命令
该命令可以显示Linux 系统的输入/输出统计信息。
例如执行命令
$ iostat
输出的信息样例如下:
Linux 5.0.0-1029-azure (VT-PD-03) 03/06/20 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.43 0.00 0.35 0.13 0.00 99.09
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
loop0 0.00 0.00 0.00 4 0
sda 1.97 9.58 29.38 23900366 73302156
sdb 0.00 0.01 0.08 13577 201264
该命令还有两个参数可以控制定时显示间隔以及显示次数。例如下面命令将每秒输出一次统计信息,共执行10次。
$ iostat 1 10
netstat命令
netstat; 用于显示网络连接状态及其相关信息。
下面命令显示所有的网络连接信息
$ netstat -a
输出的信息样例如下:
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:http 0.0.0.0:* LISTEN
tcp 0 0 localhost:domain 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN
tcp 0 0 localhost:postgresql 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:https 0.0.0.0:* LISTEN
tcp 0 0 localhost:2368 0.0.0.0:* LISTEN
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ] DGRAM 29150351 /run/user/1000/systemd/notify
unix 2 [ ACC ] SEQPACKET LISTENING 31327 /run/udev/control
unix 2 [ ACC ] STREAM LISTENING 29150354 /run/user/1000/systemd/private
unix 2 [ ACC ] STREAM LISTENING 29150358 /run/user/1000/gnupg/S.gpg-agent.browser
unix 2 [ ACC ] STREAM LISTENING 29150359 /run/user/1000/gnupg/S.gpg-agent.extra
下面命令显示所有的监听中的连接以及对应进程
$ netstat -l -p
输出的信息样例如下:
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:http 0.0.0.0:* LISTEN -
tcp 0 0 localhost:domain 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN -
tcp 0 0 localhost:postgresql 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:https 0.0.0.0:* LISTEN -
tcp 0 0 localhost:2368 0.0.0.0:* LISTEN -
tcp 0 0 localhost:2369 0.0.0.0:* LISTEN -
tcp 0 0 localhost:2370 0.0.0.0:* LISTEN -
tcp 0 0 localhost:2371 0.0.0.0:* LISTEN -
tcp 0 0 localhost:2372 0.0.0.0:* LISTEN -
tcp 0 0 localhost:2373 0.0.0.0:* LISTEN -
tcp 0 0 localhost:8101 0.0.0.0:* LISTEN -
tcp 0 0 localhost:mysql 0.0.0.0:* LISTEN -
tcp 0 0 localhost:6379 0.0.0.0:* LISTEN -
tcp6 0 0 [::]:http [::]:* LISTEN -
tcp6 0 0 [::]:http-alt [::]:* LISTEN -
tcp6 0 0 [::]:ssh [::]:* LISTEN -
tcp6 0 0 [::]:https [::]:* LISTEN -
tcp6 0 0 [::]:9090 [::]:* LISTEN -
tcp6 0 0 localhost:8005 [::]:* LISTEN -
tcp6 0 0 ip6-localhost:6379 [::]:* LISTEN -
udp 0 0 localhost:domain 0.0.0.0:* -
udp 0 0 VT-PD-03:bootpc 0.0.0.0:* -
raw6 0 0 [::]:ipv6-icmp [::]:* 7 -
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 2 [ ACC ] SEQPACKET LISTENING 31327 - /run/udev/control
unix 2 [ ACC ] STREAM LISTENING 29150354 124792/systemd /run/user/1000/systemd/private
unix 2 [ ACC ] STREAM LISTENING 29150358 124792/systemd /run/user/1000/gnupg/S.gpg-agent.browser
unix 2 [ ACC ] STREAM LISTENING 29150359 124792/systemd /run/user/1000/gnupg/S.gpg-agent.extra
unix 2 [ ACC ] STREAM LISTENING 29150360 124792/systemd /run/user/1000/gnupg/S.gpg-agent
unix 2 [ ACC ] STREAM LISTENING 29150361 124792/systemd /run/user/1000/gnupg/S.gpg-agent.ssh
unix 2 [ ACC ] STREAM LISTENING 29150362 124792/systemd /run/user/1000/gnupg/S.dirmngr
unix 2 [ ACC ] STREAM LISTENING 29150363 124792/systemd /run/user/1000/snapd-session-agent.socket
unix 2 [ ACC ] STREAM LISTENING 37228 - /run/uuidd/request
unix 2 [ ACC ] STREAM LISTENING 37231 - /run/acpid.socket
unix 2 [ ACC ] STREAM LISTENING 37234 - /var/run/dbus/system_bus_socket
unix 2 [ ACC ] STREAM LISTENING 44024 - /var/run/mysqld/mysqld.sock
unix 2 [ ACC ] STREAM LISTENING 38903 - @irqbalance1312.sock
unix 2 [ ACC ] STREAM LISTENING 31314 - /run/systemd/private
unix 2 [ ACC ] STREAM LISTENING 31325 - /run/lvm/lvmpolld.socket
unix 2 [ ACC ] STREAM LISTENING 31329 - /run/systemd/journal/stdout
unix 2 [ ACC ] STREAM LISTENING 37194 - /run/snapd.socket
unix 2 [ ACC ] STREAM LISTENING 32069 - /run/systemd/fsck.progress
unix 2 [ ACC ] STREAM LISTENING 32074 - /run/lvm/lvmetad.socket
unix 2 [ ACC ] STREAM LISTENING 37186 - /var/lib/lxd/unix.socket
unix 2 [ ACC ] STREAM LISTENING 14808098 - /var/run/postgresql/.s.PGSQL.5432
unix 2 [ ACC ] STREAM LISTENING 37233 - @ISCSIADM_ABSTRACT_NAMESPACE
unix 2 [ ACC ] STREAM LISTENING 37196 - /run/snapd-snap.socket
ss命令
ss 命令用于获取socket统计信息
在终端上执行下面命令
$ ss
输出的信息样例如下:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
u_str ESTAB 0 0 /var/run/dbus/system_bus_socket 37464 * 37421
u_str ESTAB 0 0 * 41134 * 41135
udp ESTAB 0 0 127.0.0.1:41188 127.0.0.1:41188
tcp ESTAB 0 0 127.0.0.1:33980 127.0.0.1:mysql
tcp ESTAB 0 0 127.0.0.1:mysql 127.0.0.1:33980
tcp ESTAB 0 0 127.0.0.1:43956 127.0.0.1:mysql
tcp ESTAB 0 0 127.0.0.1:mysql 127.0.0.1:32796
tcp ESTAB 0 0 127.0.0.1:57016 127.0.0.1:mysql
tcp ESTAB 0 0 127.0.0.1:32796 127.0.0.1:mysql
tcp ESTAB 0 36 10.0.0.5:ssh 119.130.230.74:13568
tcp ESTAB 0 0 127.0.0.1:mysql 127.0.0.1:56432
tcp ESTAB 0 0 127.0.0.1:mysql 127.0.0.1:57016
tcp ESTAB 0 0 127.0.0.1:42076 127.0.0.1:mysql
tcp ESTAB 0 0 127.0.0.1:42928 127.0.0.1:mysql
tcp ESTAB 0 0 127.0.0.1:56432 127.0.0.1:mysql
tcp ESTAB 0 0 127.0.0.1:mysql 127.0.0.1:42076
tcp ESTAB 0 0 127.0.0.1:mysql 127.0.0.1:42928
tcp ESTAB 0 0 127.0.0.1:mysql 127.0.0.1:43956
uptime命令
uptime命令显示系统已经运行的时间。
在终端上执行下面命令
$ uptime
输出的信息样例如下:
11:05:01 up 28 days, 21:15, 1 user, load average: 0.00, 0.01, 0.00
free命令
free 命令显示系统的内存及交换文件的使用情况
在终端上执行下面命令
$ free
输出的信息样例如下:
total used free shared buff/cache available
Mem: 3993892 2543260 142376 38644 1308256 1121936
Swap: 0 0 0
w命令
w命令可以显示当前登陆系统的用户的信息
在终端上执行下面命令
$ w
输出的信息样例如下:
11:19:52 up 28 days, 21:30, 1 user, load average: 0.06, 0.06, 0.02
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
yonglun pts/0 119.130.230.74 10:21 0.00s 0.05s 0.00s w