若是你的Linux服務器忽然負載暴增,告警短信快發爆你的手機,如何在最短期內找出Linux性能問題所在?經過如下命令或者工具能夠快速定位php
tophtml
vmstatnode
lsofmysql
tcpdumplinux
netstatios
htop
git
iotopsql
iostat緩存
uptimebash
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
Linux下的Top命令是一個性能監控程序,許多系統管理員經常用它來監控Linux性能,在許多Linux或者類Unix操做系統裏都有這個命令。Top命令用於按必定的順序顯示全部正在運行並且處於活動狀態的實時進程,並且會按期更新顯示結果。這條命令顯示了CPU的使用率、內存使用率、交換內存使用大小、高速緩存使用大小、緩衝區使用大小,進程PID、所使用命令以及其餘。它還能夠顯示正在運行進程的內存和CPU佔用多的狀況。對系統管理員來講,top命令式是一個很是有用的,它可用於監控系統並在須要的時候採起正確的處理動做。讓咱們看看實際中的top命令
$ top
有關Top命令更多的例子,請閱讀 :Linux下12個使用Top命令的例子
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 命令實例
在許多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命令的例子。
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命令的例子
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命令的例子
Htop 是一個很是高級的交互式的實時linux進程監控工具。 它和top命令十分類似,可是它具備更豐富的特性,例如用戶能夠友好地管理進程,快捷鍵,垂直和水平方式顯示進程等等。 Htop是一個第三方工具,它不包含在linux系統中,你須要使用YUM包管理工具去安裝它。 關於安裝的更多信息,請閱讀下文
$ sudo apt-get install htop
Iotop命令一樣也很是相似於top命令和Htop程序,不過它具備監控並顯示實時磁盤I/O和進程的統計功能。在查找具體進程和大量使用磁盤讀寫進程的時候,這個工具就很是有用。
$ sudo apt-get install iotop $ sudo iotop
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
這個命令能夠快速查看機器的負載狀況。在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
該命令會輸出系統日誌的最後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