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

---The End ---