如果你的Linux服务器突然负载暴增,告警短信快发爆你的手机,如何在最短时间内找出Linux性能问题所在?通过以下命令或者工具可以快速定位


  • top

  • vmstat

  • lsof

  • tcpdump

  • netstat

  • htop

  • iotop

  • iostat

  • uptime

  • dmesg | tail

  • mpstat -P ALL 1

  • pidstat 1

  • free -m

  • sar -n DEV 1

  • sar -n TCP,ETCP 1

  • IPTraf

  • psacct 或者 acct

  • Monit

  • NetHogs

  • iftop

  • Monitorix

  • Arpwatch

  • Suricata

  • VnStat PHP

  • Nagios 

  • Zabbix


1:Top-Linux进程监控

Linux下的Top命令是一个性能监控程序,许多系统管理员常常用它来监控Linux性能,在许多Linux或者类Unix操作系统里都有这个命令。Top命令用于按一定的顺序显示所有正在运行而且处于活动状态的实时进程,而且会定期更新显示结果。这条命令显示了CPU的使用率、内存使用率、交换内存使用大小、高速缓存使用大小、缓冲区使用大小,进程PID、所使用命令以及其他。它还可以显示正在运行进程的内存和CPU占用多的情况。对系统管理员来说,top命令式是一个非常有用的,它可用于监控系统并在需要的时候采取正确的处理动作。让我们看看实际中的top命令

$ top

top.jpg

有关Top命令更多的例子,请阅读 :Linux下12个使用Top命令的例子


2:VmStat – 虚拟内存统计

Linux 的 VmStat 命令用于显示虚拟内存、内核线程、磁盘、系统进程、I/O 块、中断、CPU 活动 等的统计信息。缺省情况下, vmstat 命令在 Linux 系统下不可用,你需要安装一个包含了 vmstat 程序的 sysstat 软件包。命令格式的常见用法是:

$ vmstat
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 159728  44988   6864 106772    1    1     2     2   18   30  0  0 99  0  0


更多的 vmstat 例子,请阅读 : 6 Linux 下的 Vmstat 命令实例


3:Lsof-列出打开的文件

在许多Linux或者类Unix系统里都有lsof命令,它常用于以列表的形式显示所有打开的文件和进程。打开的文件包括磁盘文件、网络套接字、管道、设备和进程。使用这条命令的主要情形之一就是在无法挂载磁盘和显示正在使用或者打开某个文件的错误信息的时候。使用这条命令,你可以很容易地看到正在使用哪个文件。这条命令最常用的格式如下:

$ lsof
COMMAND     PID  TID       USER   FD      TYPE DEVICE SIZE/OFF       NODE NAME
init          1            root  cwd   unknown                            /proc/1/cwd (readlink: Permission denied)
init          1            root  rtd   unknown                            /proc/1/root (readlink: Permission denied)
init          1            root  txt   unknown                            /proc/1/exe (readlink: Permission denied)
init          1            root NOFD                                      /proc/1/fd (opendir: Permission denied)
kthreadd      2            root  cwd   unknown                            /proc/2/cwd (readlink: Permission denied)
kthreadd      2            root  rtd   unknown                            /proc/2/root (readlink: Permission denied)
kthreadd      2            root  txt   unknown                            /proc/2/exe (readlink: Permission denied)
kthreadd      2            root NOFD                                      /proc/2/fd (opendir: Permission denied)
ksoftirqd     3            root  cwd   unknown                            /proc/3/cwd (readlink: Permission denied)
ksoftirqd     3            root  rtd   unknown                            /proc/3/root (readlink: Permission denied)
ksoftirqd     3            root  txt   unknown                            /proc/3/exe (readlink: Permission denied)
ksoftirqd     3            root NOFD                                      /proc/3/fd (opendir: Permission denied)
kworker/0     5            root  cwd   unknown                            /proc/5/cwd (readlink: Permission denied)
kworker/0     5            root  rtd   unknown                            /proc/5/root (readlink: Permission denied)
kworker/0     5            root  txt   unknown                            /proc/5/exe (readlink: Permission denied)
kworker/0     5            root NOFD                                      /proc/5/fd (opendir: Permission denied)
rcu_sched     7            root  cwd   unknown                            /proc/7/cwd (readlink: Permission denied)
rcu_sched     7            root  rtd   unknown                            /proc/7/root (readlink: Permission denied)

有关lsof命令的用法和例子的更多信息,请参考: Linux下10个使用lsof命令的例子


4:Tcpdump-网络包分析器

Tcpdump是最广泛使用的网络包分析器或者包监控程序之一,它用于捕捉或者过滤网络上指定接口上接收或者传输的TCP/IP包。它还有一个选项用于把捕捉到的包保存到文件里,以便以后进行分析。在几乎所有主要的Linux发布里,tcpdump都可以使用。

$tcpdump -i eth0tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
22:08:59.617628 IP tecmint.com.ssh > 115.113.134.3.static-mumbai.vsnl.net.in.28472: P 2532133365:2532133481(116) ack 3561562349 win 9648
22:09:07.653466 IP tecmint.com.ssh > 115.113.134.3.static-mumbai.vsnl.net.in.28472: P 116:232(116) ack 1 win 9648
22:08:59.617916 IP 115.113.134.3.static-mumbai.vsnl.net.in.28472 > tecmint.com.ssh: . ack 116 win 64347

要想获得更多有关tcpdump用法的信息,请参阅: Linux下12个使用Tcpdump命令的例子


5:Netstat-网络状态统计

Netstat是一个用于监控进出网络的包和网络接口统计的命令行工具。它是一个非常有用的工具,系统管理员可以用来监控网络性能,定位并解决网络相关问题。

$ netstat -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 *:sunrpc                *:*                     LISTEN
tcp        0      0 *:http-alt              *:*                     LISTEN
tcp        0      0 *:http                  *:*                     LISTEN
tcp        0      0 *:ssh                   *:*                     LISTEN
tcp        0      0 *:51684                 *:*                     LISTEN
tcp        0      0 localhost:9000          *:*                     LISTEN
tcp        0      0 *:56296                 *:*                     LISTEN
tcp        0      0 *:mysql                 *:*                     LISTEN
tcp        0      0 *:6379                  *:*                     LISTEN
tcp        0      0 192.168.22.21:mysql     192.168.22.1:62601      ESTABLISHED
tcp        0      0 192.168.22.21:mysql     192.168.22.1:62600      ESTABLISHED
tcp        0      0 10.0.2.15:ssh           10.0.2.2:65494          ESTABLISHED
tcp        0      0 10.0.2.15:ssh           10.0.2.2:59869          ESTABLISHED
tcp6       0      0 [::]:sunrpc             [::]:*                  LISTEN
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN
tcp6       0      0 [::]:56477              [::]:*                  LISTEN
tcp6       0      0 [::]:6379               [::]:*                  LISTEN
tcp6       0      0 [::]:53963              [::]:*                  LISTEN
udp        0      0 *:857                   *:*
udp        0      0 *:sunrpc                *:*
udp        0      0 192.168.22.21:ntp       *:*
udp        0      0 10.0.2.15:ntp           *:*
udp        0      0 localhost:ntp           *:*
udp        0      0 *:ntp                   *:*
udp        0      0 *:905                   *:*
udp        0      0 localhost:907           *:*
udp        0      0 *:39063                 *:*
udp        0      0 *:7660                  *:*
udp        0      0 *:30719                 *:*
udp        0      0 *:53277                 *:*


有关Netstat更多的例子,请参阅: Linux下20个使用Netstat命令的例子


6:Htop – Linux进程监控

Htop 是一个非常高级的交互式的实时linux进程监控工具。 它和top命令十分相似,但是它具有更丰富的特性,例如用户可以友好地管理进程,快捷键,垂直和水平方式显示进程等等。 Htop是一个第三方工具,它不包含在linux系统中,你需要使用YUM包管理工具去安装它。 关于安装的更多信息,请阅读下文

htop.jpg

$ sudo apt-get install htop


7:Iotop-监控Linux磁盘I/O

Iotop命令同样也非常类似于top命令和Htop程序,不过它具有监控并显示实时磁盘I/O和进程的统计功能。在查找具体进程和大量使用磁盘读写进程的时候,这个工具就非常有用。

$ sudo apt-get install iotop
$ sudo iotop

iotop.jpg


8:Iostat-输入/输出统计

Iostat是一个用于收集显示系统存储设备输入和输出状态统计的简单工具。这个工具常常用来追踪存储设备的性能问题,其中存储设备包括设备、本地磁盘,以及诸如使用NFS等的远端磁盘。

$ sudo apt-get install sysstat
$ iostat
Linux 3.13.0-75-generic (lnmp) 	06/25/2016 	_x86_64_	(2 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.16    0.00    0.32    0.04    0.00   99.48

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               0.41         4.46         4.68    3129872    3282398
dm-0              0.56         2.96         2.72    2077225    1911152
dm-1              0.86         1.47         1.96    1029392    1371232


8:uptime -- 查看机器的负载情况

这个命令可以快速查看机器的负载情况。在Linux系统中,这些数据表示等待CPU资源的进程和阻塞在不可中断IO进程(进程状态为D)的数量。这些数据可以让我们对系统资源使用有一个宏观的了解。


命令的输出分别表示1分钟、5分钟、15分钟的平均负载情况。通过这三个数据,可以了解服务器负载是在趋于紧张还是区域缓解。如果1分钟平均负载很高,而15分钟平均负载很低,说明服务器正在命令高负载情况,需要进一步排查CPU资源都消耗在了哪里。反之,如果15分钟平均负载很高,1分钟平均负载较低,则有可能是CPU资源紧张时刻已经过去。可以结合下文将会介绍的vmstat、mpstat等命令进一步排查。

$ uptime
 14:19:46 up 8 days,  2:51,  2 users,  load average: 0.01, 0.04, 0.05


9:dmesg -- 输出系统日志的最后10行

该命令会输出系统日志的最后10行。示例中的输出,可以看见一次内核的oom kill和一次TCP丢包。这些日志可以帮助排查性能问题。千万不要忘了这一步

$ dmesg | tail
[675516.616897] type=1702 audit(1466769981.090:9867): op=linkat ppid=19637 pid=19641 auid=1000 uid=1000 gid=1000 euid=1000 suid=1000 fsuid=1000 egid=1000 sgid=1000 fsgid=1000 tty=pts0 ses=22 comm="git" exe="/usr/lib/git-core/git" res=0
[675516.616905] type=1302 audit(1466769981.090:9868): item=0 name="/home/www/yii/rantech/.git/objects/82/tmp_obj_QV2oZf" inode=141342550 dev=00:19 mode=0100444 ouid=501 ogid=20 rdev=00:00 nametype=NORMAL
[675516.628290] type=1702 audit(1466769981.102:9869): op=linkat ppid=19637 pid=19641 auid=1000 uid=1000 gid=1000 euid=1000 suid=1000 fsuid=1000 egid=1000 sgid=1000 fsgid=1000 tty=pts0 ses=22 comm="git" exe="/usr/lib/git-core/git" res=0
[675516.628298] type=1302 audit(1466769981.102:9870): item=0 name="/home/www/yii/rantech/.git/objects/ac/tmp_obj_SewzDi" inode=141342551 dev=00:19 mode=0100444 ouid=501 ogid=20 rdev=00:00 nametype=NORMAL
[675516.644786] type=1702 audit(1466769981.118:9871): op=linkat ppid=19637 pid=19641 auid=1000 uid=1000 gid=1000 euid=1000 suid=1000 fsuid=1000 egid=1000 sgid=1000 fsgid=1000 tty=pts0 ses=22 comm="git" exe="/usr/lib/git-core/git" res=0
[675516.644800] type=1302 audit(1466769981.118:9872): item=0 name="/home/www/yii/rantech/.git/objects/ba/tmp_obj_S00oeh" inode=141342552 dev=00:19 mode=0100444 ouid=501 ogid=20 rdev=00:00 nametype=NORMAL
[675516.650740] type=1702 audit(1466769981.126:9873): op=linkat ppid=19637 pid=19641 auid=1000 uid=1000 gid=1000 euid=1000 suid=1000 fsuid=1000 egid=1000 sgid=1000 fsgid=1000 tty=pts0 ses=22 comm="git" exe="/usr/lib/git-core/git" res=0
[675516.650752] type=1302 audit(1466769981.126:9874): item=0 name="/home/www/yii/rantech/.git/objects/39/tmp_obj_6zT1di" inode=141342554 dev=00:19 mode=0100444 ouid=501 ogid=20 rdev=00:00 nametype=NORMAL
[675516.658869] type=1702 audit(1466769981.134:9875): op=linkat ppid=19637 pid=19641 auid=1000 uid=1000 gid=1000 euid=1000 suid=1000 fsuid=1000 egid=1000 sgid=1000 fsgid=1000 tty=pts0 ses=22 comm="git" exe="/usr/lib/git-core/git" res=0
[675516.658897] type=1302 audit(1466769981.134:9876): item=0 name="/home/www/yii/rantech/.git/objects/75/tmp_obj_CIF89k" inode=141342555 dev=00:19 mode=0100444 ouid=501 ogid=20 rdev=00:00 nametype=NORMAL


续【No.2】监控Linux性能25个命令行工具