零、Linux系統監控命令速查手冊
命令 | 功能應用 | 用法舉例 | ? | ? |
---|---|---|---|---|
free | 查看內存使用情況,包括物理內存和虛擬內存 | free -h或free -m | ? | ? |
vmstat | 對系統的整體情況進行統計,包括內核進程、虛擬內存、磁盤、陷阱和 CPU 活動的統計信息 | vmstat 2 100 | ? | ? |
top | 實時顯示系統中各個進程的資源占用狀況及總體狀況 | top | ? | ? |
mpstat | 實時系統監控工具,它會報告與CPU相關的統計信息 | mpstat | ? | ? |
sar | 收集、報告和保存CPU、內存、輸入輸出端口使用情況 | sar -n DEV 3 100 | ? | ? |
netstat | 檢驗本機各端口的網絡連接情況,用于顯示與IP、TCP、UDP和ICMP協議相關的統計數據 | netstat -a | ? | ? |
tcpdump | 用于捕捉或者過濾網絡上指定接口上接收或者傳輸的TCP/IP包 | tcpdump -i eth0 -c 3 | ? | ? |
IPTraf | 用來生成包括TCP信息、UDP計數、ICMP和OSPF信息、以太網負載信息、節點狀態信息、IP校驗和錯誤等等統計數據 | iptraf | ? | ? |
df | 檢查linux的文件系統的磁盤空間占用情況 | df -h | ? | ? |
iostat | 收集顯示系統存儲設備輸入和輸出狀態統計 | iostat -x -k 2 100 | ? | ? |
iotop | 用來監視磁盤I/O使用狀況的top類工具 | iotop | ? | ? |
lsof | 用于以列表的形式顯示所有打開的文件和進程 | lsof | ? | ? |
atop | 顯示的是各種系統資源(CPU, memory, network, I/O, kernel)的綜合,并且在高負載的情況下進行了彩色標注 | atop | ? | ? |
htop | 它和top命令十分相似,高級的交互式的實時linux進程監控工具 | htop | ? | ? |
ps | 最基本同時也是非常強大的進程查看命令 | ps aux | ? | ? |
glances | 監視 CPU,平均負載,內存,網絡流量,磁盤 I/O,其他處理器 和 文件系統 空間的利用情況 | glances | ? | ? |
dstat | 全能系統信息統計工具,可用于替換vmstat、iostat、netstat、nfsstat和ifstat這些命令的工具 | dstat | ? | ? |
uptime | 用于查看服務器運行了多長時間以及有多少個用戶登錄,快速獲知服務器的負荷情況 | uptime | ? | ? |
dmesg | 主要用來顯示內核信息。使用dmesg可以有效診斷機器硬件故障或者添加硬件出現的問題。 | dmesg | ? | ? |
mpstat | 用于報告多路CPU主機的每顆CPU活動情況,以及整個主機的CPU情況。 | mpstat 2 3 | ? | ? |
mpstat 2 3 | 監控CPU、內存、I/O、文件系統及網絡資源。對于內存的使用,它可以實時的顯示 總/剩余內存、交換空間等信息。 | nmon | ? | ? |
mytop | 用于監控 mysql 的線程和性能。它能讓你實時查看數據庫以及正在處理哪些查詢。 | mytop | ? | ? |
iftop | 用來監控網卡的實時流量(可以指定網段)、反向解析IP、顯示端口信息等 | iftop | ? | ? |
jnettop | 以相同的方式來監測網絡流量但比 iftop 更形象。它還支持自定義的文本輸出,并能以友好的交互方式來深度分析日志。 | jnettop | ? | ? |
ngrep | 網絡層的 grep。它使用 pcap ,允許通過指定擴展正則表達式或十六進制表達式來匹配數據包。 | ngrep | ? | ? |
nmap | 可以掃描你服務器開放的端口并且可以檢測正在使用哪個操作系統 | nmap | ? | ? |
du | 查看Linux系統中某目錄的大小 | du -sh 目錄名 | ? | ? |
fdisk | 查看硬盤及分區信息 | fdisk -l | ? | ? |
一、內存監控
1.1 free命令
free可以用來快速查看VPS主機的內存使用情況,包括了物理內存和虛擬內存。后面可以加上參數:-h和-m,否則默認會以kb為單位顯示。運行命令結果如下:
shell腳本監控進程?
相關參數說明:
- total:物理內存大小,就是機器實際的內存
- used:已使用的內存大小,這個值包括了 cached 和 應用程序實際使用的內存
- free:未被使用的內存大小
- shared:共享內存大小,是進程間通信的一種方式
- buffers:被緩沖區占用的內存大小
- cached:被緩存占用的內存大小
1.2 vmstat命令
centos控制臺?vmstat(Virtual Meomory Statistics,虛擬內存統計)是對系統的整體情況進行統計,包括內核進程、虛擬內存、磁盤、陷阱和 CPU 活動的統計信息。命令格式:vmstat 2 100,其中2表示刷新間隔,100表示輸出次數。運行命令結果如下:
相關參數說明:
- 1 procs
- r列表示運行和等待CPU時間片的進程數,這個值如果長期大于系統CPU個數,就說明CPU資源不足,可以考慮增加CPU;
b列表示在等待資源的進程數,比如正在等待I/O或者內存交換等。
2 memory - swpd列表示切換到內存交換區的內存數量(以KB為單位)。如果swpd的值不為0或者比較大,而且si、so的值長期為0,那么這種情況一般不用擔心,不會影響系統性能;
free列表示當前空閑的物理內存數量(以KB為單位);
buff列表示buffers cache的內存數量,一般對塊設備的讀寫才需要緩沖;
cache列表示page cached的內存數量,一般作文件系統的cached,頻繁訪問的文件都會被cached。如果cached值較大,就說明cached文件數較多。如果此時IO中的bi比較小,就說明文件系統效率比較好。
3 swap - si列表示由磁盤調入內存,也就是內存進入內存交換區的數量;
so列表示由內存調入磁盤,也就是內存交換區進入內存的數量
一般情況下,si、so的值都為0,如果si、so的值長期不為0,則表示系統內存不足,需要考慮是否增加系統內存。
4 IO - bi列表示從塊設備讀入的數據總量(即讀磁盤,單位KB/秒)
bo列表示寫入到塊設備的數據總量(即寫磁盤,單位KB/秒)
這里設置的bi+bo參考值為1000,如果超過1000,而且wa值比較大,則表示系統磁盤IO性能瓶頸。
5 system - in列表示在某一時間間隔中觀察到的每秒設備中斷數;
cs列表示每秒產生的上下文切換次數。
上面這兩個值越大,會看到內核消耗的CPU時間就越多。
6 CPU - us列顯示了用戶進程消耗CPU的時間百分比。us的值比較高時,說明用戶進程消耗的CPU時間多,如果長期大于50%,需要考慮優化程序啥的。
sy列顯示了內核進程消耗CPU的時間百分比。sy的值比較高時,說明內核消耗的CPU時間多;如果us+sy超過80%,就說明CPU的資源存在不足。
id列顯示了CPU處在空閑狀態的時間百分比;
wa列表示IO等待所占的CPU時間百分比。wa值越高,說明IO等待越嚴重。如果wa值超過20%,說明IO等待嚴重。
st列一般不關注,虛擬機占用的時間百分比。
二、CPU監控
2.1 TOP命令
top命令是Linux下常用的性能分析工具,能夠實時顯示系統中各個進程的資源占用狀況及總體狀況。運行結果如下:
相關的參數說明:
- 第一行:
- 14:36:09: 這是wzfou.com測試時系統時間
up xxx days, 11:13:系統運行時間,系統已經運行了xx天11小時13分鐘了。
2 users:當前登錄用戶數
load average:系統負載,即任務隊列的平均長度。三個數值分別為最近1分鐘、最近5分鐘、最近15分鐘的平均負載 —— 超過N(CPU核數)說明系統滿負荷運行。也可以通過$w或$uptime命令查看load average。
第二行: - 顯示進程總數、正在運行的進程數、休眠的進程數、停止的進程數、僵尸進程數
第三行: - %us:用戶進程消耗的CPU百分比
%sy:內核進程消耗的CPU百分比
%ni:改變過優先級的進程占用CPU的百分比
%id:空閑CPU的百分比
%wa:IO等待消耗的CPU百分比
2.2 mpstat命令
mpstat(Multiprocessor Statistics,多處理器統計)是實時系統監控工具,它會報告與CPU相關的統計信息,這些信息存放在/proc/stat文件中。格式:mpstat -P ALL 2 # ALL表示顯示所有CPUs,也可以指定某個CPU;2表示刷新間隔。
命令效果如下:
三、網絡監控
3.1 sar命令
SAR是一個在Unix和Linux操作系統中用來收集、報告和保存CPU、內存、輸入輸出端口使用情況的命令。SAR命令可以動態產生報告,也可以把報告保存在日志文件中。命令格式:sar -n DEV 3 100。效果如下:
相關參數說明如下:
- IFACE:網絡設備的名稱
- rxpck/s:每秒鐘接收到的包數目
- txpck/s:每秒鐘發送出去的包數目
- rxkB/s:每秒鐘接收到的字節數
- txkB/s:每秒鐘發送出去的字節數
3.2 netstat
netstat命令一般用于檢驗本機各端口的網絡連接情況,用于顯示與IP、TCP、UDP和ICMP協議相關的統計數據。
選取部分選項說明如下:
- -a, --all, --listening 顯示所有連接中的Socket。
-n, --numeric 以數字形式顯示地址和端口號。
-t, -–tcp 顯示TCP傳輸協議的連線狀況。
-u, -–udp 顯示UDP傳輸協議的連線狀況。
-p, --programs 顯示正在使用socket的程序名/進程ID
-l, --listening 顯示監控中的服務器的Socket。
-o, --timers 顯示計時器。
-s, --statistics 顯示每個網絡協議的統計信息(比如SNMP)
-i, --interfaces 顯示網絡界面信息表單(網卡列表)
-r, --route 顯示路由表
常用的幾種:
- $ netstat -aup # 輸出所有UDP連接狀況
$ netstat -atp # 輸出所有TCP連接狀況
$ netstat -s # 顯示各個協議的網絡統計信息
$ netstat -i # 顯示網卡列表
$ netstat -r # 顯示路由表信息
netstat在防御攻擊時非常有用。以wzfou.com平常用到的示例如下:
- netstat -n -p|grep SYN_REC | wc -l
上面命令可以查找出當前服務器有多少個活動的 SYNC_REC 連接。正常來說這個值很小,最好小于5。 當有Dos攻擊或者郵件炸彈的時候,這個值相當的高。另外這個值和系統有很大關系,有的服務器值就很高,也是正常現象。
- netstat -n -p | grep SYN_REC | sort -u
上面命令可以列出所有連接過的IP地址。
- netstat -n -p | grep SYN_REC | awk '{print $5}' | awk -F: '{print $1}'
上面命令可以列出所有發送SYN_REC連接節點的IP地址。
- netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
上面命令可以使用netstat命令計算每個主機連接到本機的連接數。
- netstat -anp |grep 'tcp|udp' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
上面命令可以列出所有連接到本機的UDP或者TCP連接的IP數量。
- netstat -ntu | grep ESTAB | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
上面命令可以檢查 ESTABLISHED 連接并且列出每個IP地址的連接數量。
- netstat -plan|grep :80|awk {'print $5'}|cut -d: -f 1|sort|uniq -c|sort -nk 1
上面命令可以列出所有連接到本機80端口的IP地址和其連接數。80端口一般是用來處理HTTP網頁請求。
防御CC攻擊還可以用以下方法檢測:
- 查看所有80端口的連接數
- netstat -nat|grep -i “80”|wc -l
對連接的IP按連接數量進行排序 - netstat -anp | grep ‘tcp\|udp’ | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -n
netstat -ntu | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -n
netstat -ntu | awk ‘{print $5}’ | egrep -o “[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}” | sort | uniq -c | sort -nr
查看TCP連接狀態 - netstat -nat |awk ‘{print $6}’|sort|uniq -c|sort -rn
netstat -n | awk ‘/^tcp/ {print $NF}’|sort|uniq -c|sort -rn
netstat -n | awk ‘/^tcp/ {++S[$NF]};END {for(a in S) print a, S[a]}’
netstat -n | awk ‘/^tcp/ {++state[$NF]}; END {for(key in state) print key,”\t”,state[key]}’
netstat -n | awk ‘/^tcp/ {++arr[$NF]};END {for(k in arr) print k,”\t”,arr[k]}’
netstat -ant | awk ‘{print $NF}’ | grep -v ‘[a-z]’ | sort | uniq -c
查看80端口連接數最多的20個IP - cat /www/web_logs/wzfou.com_access.log|awk ‘{print $1}’|sort|uniq -c|sort -nr|head -100
tail -n 10000 /www/web_logs/wzfou.com_access.log|awk ‘{print $1}’|sort|uniq -c|sort -nr|head -100
cat /www/web_logs/wzfou.com_access.log|awk ‘{print $1}’|sort|uniq -c|sort -nr|head -100
netstat -anlp|grep 80|grep tcp|awk ‘{print $5}’|awk -F: ‘{print $1}’|sort|uniq -c|sort -nr|head -n20
netstat -ant |awk ‘/:80/{split($5,ip,”:”);++A[ip[1]]}END{for(i in A) print A,i}’ |sort -rn|head -n20
用tcpdump嗅探80端口的訪問看看誰最高 - tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F”.” ‘{print $1″.”$2″.”$3″.”$4}’ | sort | uniq -c | sort -nr |head -20
查找較多time_wait連接 - netstat -n|grep TIME_WAIT|awk ‘{print $5}’|sort|uniq -c|sort -rn|head -n20
查找較多的SYN連接 - netstat -an | grep SYN | awk ‘{print $5}’ | awk -F: ‘{print $1}’ | sort | uniq -c | sort -nr | more
linux下實用iptables封ip段的一些常見命令: - 封單個IP的命令是:
- iptables -I INPUT -s 211.1.0.0 -j DROP
封IP段的命令是: - iptables -I INPUT -s 211.1.0.0/16 -j DROP
iptables -I INPUT -s 211.2.0.0/16 -j DROP
iptables -I INPUT -s 211.3.0.0/16 -j DROP
封整個段的命令是: - iptables -I INPUT -s 211.0.0.0/8 -j DROP
封幾個段的命令是: - iptables -I INPUT -s 61.37.80.0/24 -j DROP
iptables -I INPUT -s 61.37.81.0/24 -j DROP
3.3 tcpdump命令
Tcpdump是最廣泛使用的網絡包分析器或者包監控程序之一,它用于捕捉或者過濾網絡上指定接口上接收或者傳輸的TCP/IP包。格式:tcpdump -i eth0 -c 3
該命令不是系統自帶的,可能需要自己搬運安裝。命令執行效果如下:
3.4 IPTraf
iptraf是一個基于ncurses的IP局域網監控器,用來生成包括TCP信息、UDP計數、ICMP和OSPF信息、以太網負載信息、節點狀態信息、IP校驗和錯誤等等統計數據。簡單的和詳細的接口統計數據,包括IP、TCP、UDP、ICMP、非IP以及其他的IP包計數、IP校驗和錯誤,接口活動、包大小計數。
命令格式:iptraf。接著就會顯示幾個監控菜單,效果如下:
四、磁盤監控
4.1 df命令
df命令的功能是用來檢查linux的文件系統的磁盤空間占用情況。如果沒有文件名被指定,則顯示當前所有被掛載的文件系統,默認以 KB 為單位。常用格式:$ df -h。效果如下:
相關參數說明如下:
- -a 全部文件系統列表
- -h 以方便閱讀的方式顯示
- -i 顯示inode信息
- -T 顯示文件系統類型
- -l 只顯示本地文件系統
- -k 以KB為單位
- -m 以MB為單位
4.2 iostat命令
iostat是一個用于收集顯示系統存儲設備輸入和輸出狀態統計的簡單工具。這個工具常常用來追蹤存儲設備的性能問題,其中存儲設備包括設備、本地磁盤,以及諸如使用NFS等的遠端磁盤。常用格式:
- $ iostat -x -k 2 100 # 2表示刷新間隔,100表示刷新次數
效果如下圖:
iostat主要是用來監控磁盤I/O,首先輸出了CPUs的平均數據(avg-cpu),我們可以看%iowait這一項,除此之外iostat還提供了一些更詳細的I/O狀態數據,比如:
- r/s: 每秒完成的讀 I/O 設備次數。
- w/s: 每秒完成的寫 I/O 設備次數。
- rkB/s: 每秒讀K字節數.是 rsect/s 的一半,因為每扇區大小為512字節。
- wkB/s: 每秒寫K字節數.是 wsect/s 的一半。
- avgrq-sz: 平均每次設備I/O操作的數據大小 (扇區)。
- avgqu-sz: 平均I/O隊列長度。
- await: 平均每次設備I/O操作的等待時間 (毫秒)。
- svctm: 平均每次設備I/O操作的服務時間 (毫秒)。
- %util: 一秒中有百分之多少的時間用于 I/O 操作,或者說一秒中有多少時間 I/O 隊列是非空的。
4.3 iotop命令
iotop命令是一個用來監視磁盤I/O使用狀況的top類工具。iotop具有與top相似的UI,其中包括PID、用戶、I/O、進程等相關信息。Linux下的IO統計工具如iostat,nmon等大多數是只能統計到per設備的讀寫情況,如果你想知道每個進程是如何使用IO的就比較麻煩,使用iotop命令可以很方便的查看。
iotop的常用參數如下:
- –version 查看程序版本號
-h, –help 查看幫助信息
-o, –only 只查看有IO操作的進程
-b, –batch 非交互模式
-n, –iter= 設置迭代次數
-d, –delay 刷新頻率,默認是1秒
-p, –pid 查看指定的進程號的IO,默認是所有進程
-u, –user 查看指定用戶進程的IO,默認是所有用戶
-P, –processes 只看進程,不看線程
-a, –accumulated 看累計IO,而不是實時IO
-k, –kilobytes 以KB為單位查看IO,而不是以最友好的單位顯示
-t, –time 每行添加一個時間戳,默認便開啟–batch
-q, –quit 不顯示頭部信息
執行效果如下:
4.4 lsof命令
列出打開的文件:lsof。它常用于以列表的形式顯示所有打開的文件和進程。打開的文件包括磁盤文件、網絡套接字、管道、設備和進程。使用這條命令的主要情形之一就是在無法掛載磁盤和顯示正在使用或者打開某個文件的錯誤信息的時候。使用這條命令,你可以很容易地看到正在使用哪個文件。
五、進程監控
5.1 aTOP命令
atop命令是一個終端環境的監控命令。它顯示的是各種系統資源(CPU, memory, network, I/O, kernel)的綜合,并且在高負載的情況下進行了彩色標注。atop可以看成是top的加強版,如果執行atop命令顯示不存在你需要yum或者apt-get 來安裝它。效果如下:
相關的參數說明:
- ATOP列:該列顯示了主機名、信息采樣日期和時間點
- PRC列:該列顯示進程整體運行情況
- sys、usr字段分別指示進程在內核態和用戶態的運行時間
#proc字段指示進程總數
#zombie字段指示僵死進程的數量
#exit字段指示atop采樣周期期間退出的進程數量
CPU列:該列顯示CPU整體(即多核CPU作為一個整體CPU資源)的使用情況,我們知道CPU可被用于執行進程、處理中斷,也可處于空閑狀態(空閑狀態分兩種,一種是活動進程等待磁盤IO導致CPU空閑,另一種是完全空閑) - sys、usr字段指示CPU被用于處理進程時,進程在內核態、用戶態所占CPU的時間比例
irq字段指示CPU被用于處理中斷的時間比例
idle字段指示CPU處在完全空閑狀態的時間比例
wait字段指示CPU處在“進程等待磁盤IO導致CPU空閑”狀態的時間比例
CPU列各個字段指示值相加結果為N00%,其中N為cpu核數。 - cpu列:該列顯示某一核cpu的使用情況,各字段含義可參照CPU列,各字段值相加結果為100%
- CPL列:該列顯示CPU負載情況
- avg1、avg5和avg15字段:過去1分鐘、5分鐘和15分鐘內運行隊列中的平均進程數量
csw字段指示上下文交換次數
intr字段指示中斷發生次數
MEM列:該列指示內存的使用情況 - tot字段指示物理內存總量
free字段指示空閑內存的大小
cache字段指示用于頁緩存的內存大小
buff字段指示用于文件緩存的內存大小
slab字段指示系統內核占用的內存大小
SWP列:該列指示交換空間的使用情況 - tot字段指示交換區總量
free字段指示空閑交換空間大小
PAG列:該列指示虛擬內存分頁情況 - swin、swout字段:換入和換出內存頁數
- DSK列:該列指示磁盤使用情況,每一個磁盤設備對應一列,如果有sdb設備,那么增多一列DSK信息
- sda字段:磁盤設備標識
busy字段:磁盤忙時比例
read、write字段:讀、寫請求數量
NET列:多列NET展示了網絡狀況,包括傳輸層(TCP和UDP)、IP層以及各活動的網口信息 - XXXi 字段指示各層或活動網口收包數目
XXXo 字段指示各層或活動網口發包數目
5.2 htop命令
htop 是一個非常高級的交互式的實時linux進程監控工具。 它和top命令十分相似,但是它具有更豐富的特性,例如用戶可以友好地管理進程,快捷鍵,垂直和水平方式顯示進程等等。
命令效果如下(點擊放大):
5.3 ps命令
ps(Process Status,進程狀態)命令是最基本同時也是非常強大的進程查看命令,最常用的命令就是ps aux——顯示當前所有進程
- $ ps aux | grep root # 輸出root用戶的所有進程
$ ps -p <pid> -L # 顯示進程<pid>的所有線程
$ ps -e -o pid,uname,pcpu,pmem,comm # 定制顯示的列
$ ps -o lstart <pid> # 顯示進程的啟動時間
ps命令的輸出可以按任意某一列進行排序,通過使用內部排序鍵(列的別名),例如:
- $ ps aux --sort=+rss # 按內存升序排列
$ ps aux --sort=-rss # 按內存降序排列
$ ps aux --sort=+%cpu # 按cpu升序排列
$ ps aux --sort=-%cpu # 按cpu降序排列
六、系統監控全能工具
上面分享的都是單個查看Linux系統磁盤、CPU、內存等指標的工具,如果我們想要迅速找出來VPS主機的性能瓶頸所在,我們可以采用以下幾個“全能”工具:
6.1 glances工具
Glances 是一個用來監視 GNU/Linux 和 FreeBSD 操作系統的 GPL 授權的免費軟件,通過 Glances,我們可以監視 CPU,平均負載,內存,網絡流量,磁盤 I/O,其他處理器 和 文件系統 空間的利用情況。wzfou.com就是用這個來監控的。語法:glances
Glances 會用一下幾種顏色來代表狀態:綠色:OK(一切正常) 藍色:CAREFUL(需要注意) 紫色:WARNING(警告) 紅色:CRITICAL(嚴重)。閥值可以在配置文件中設置,一般閥值被默認設置為(careful=50、warning=70、critical=90)。效果如下:(點擊放大)
Glances 還提供了更多的可在其運行時開關輸出信息選項的快捷鍵,例如:
- a – 對進程自動排序
- c – 按 CPU 百分比對進程排序
- m – 按內存百分比對進程排序
- p – 按進程名字母順序對進程排序
- i – 按讀寫頻率(I/O)對進程排序
- d – 顯示/隱藏磁盤 I/O 統計信息
- f – 顯示/隱藏文件系統統計信息
- n – 顯示/隱藏網絡接口統計信息
- s – 顯示/隱藏傳感器統計信息
- y – 顯示/隱藏硬盤溫度統計信息
- l – 顯示/隱藏日志(log)
- b – 切換網絡 I/O 單位(Bytes/bits)
- w – 刪除警告日志
- x – 刪除警告和嚴重日志
- 1 – 切換全局 CPU 使用情況和每個 CPU 的使用情況
- h – 顯示/隱藏這個幫助畫面
- t – 以組合形式瀏覽網絡 I/O
- u – 以累計形式瀏覽網絡 I/O
- q – 退出(‘ESC‘ 和 ‘Ctrl&C‘ 也可以)
6.2 dstat工具
dstat命令是一個用來替換vmstat、iostat、netstat、nfsstat和ifstat這些命令的工具,是一個全能系統信息統計工具。與sysstat相比,dstat擁有一個彩色的界面,在手動觀察性能狀況時,數據比較顯眼容易觀察;而且dstat支持即時刷新,譬如輸入dstat 3即每三秒收集一次,但最新的數據都會每秒刷新顯示。
直接使用dstat,默認使用的是-cdngy參數,分別顯示cpu、disk、net、page、system信息,默認是1s顯示一條信息。可以在最后指定顯示一條信息的時間間隔,如dstat 5是沒5s顯示一條,dstat 5 10表示沒5s顯示一條,一共顯示10條。如下:
默認輸出顯示的信息說明:
- Procs
- r:運行的和等待(CPU時間片)運行的進程數,這個值也可以判斷是否需要增加CPU(長期大于1)
b:處于不可中斷狀態的進程數,常見的情況是由IO引起的
Memory - swpd: 切換到交換內存上的內存(默認以KB為單位)。如果 swpd 的值不為0,或者還比較大,比如超過100M了,但是 si, so 的值長期為 0,這種情況我們可以不用擔心,不會影響系統性能。
free: 空閑的物理內存
buff: 作為buffer cache的內存,對塊設備的讀寫進行緩沖
cache: 作為page cache的內存, 文件系統的cache。如果 cache 的值大的時候,說明cache住的文件數多,如果頻繁訪問到的文件都能被cache住,那么磁盤的讀IO bi 會非常小。
Swap - si: 交換內存使用,由磁盤調入內存
so: 交換內存使用,由內存調入磁盤
內存夠用的時候,這2個值都是0,如果這2個值長期大于0時,系統性能會受到影響。磁盤IO和CPU資源都會被消耗。 - 我發現有些朋友看到空閑內存(free)很少或接近于0時,就認為內存不夠用了,實際上不能光看這一點的,還要結合si,so,如果free很少,但是si,so也很少(大多時候是0),那么不用擔心,系統性能這時不會受到影響的。
- 磁盤IO
- bi: 從塊設備讀入的數據總量(讀磁盤) (KB/s)
bo: 寫入到塊設備的數據總理(寫磁盤) (KB/s)
注:隨機磁盤讀寫的時候,這2個 值越大(如超出1M),能看到CPU在IO等待的值也會越大 - System
- in: 每秒產生的中斷次數
cs: 每秒產生的上下文切換次數
上面這2個值越大,會看到由內核消耗的CPU時間會越多 - Cpu
- usr: 用戶進程消耗的CPU時間百分比
us 的值比較高時,說明用戶進程消耗的CPU時間多,但是如果長期超過50% 的使用,那么我們就該考慮優化程序算法或者進行加速了(比如 PHP/Perl) - sys: 內核進程消耗的CPU時間百分比
sys 的值高時,說明系統內核消耗的CPU資源多,這并不是良性的表現,我們應該檢查原因。 - wai: IO等待消耗的CPU時間百分比
wa 的值高時,說明IO等待比較嚴重,這可能是由于磁盤大量作隨機訪問造成,也有可能是磁盤的帶寬出現瓶頸(塊操作)。 - idl: CPU處在空閑狀態時間百分比
七、總結
對于上面的命令,有些是Linux系統自帶的,你可以直接執行。有些是第三方命令,不過絕大多數可以直接通過Yum install xxx或者apt-get intall xxx來安裝。這些命令雖然小巧,但是在我們的服務器出現問題將會顯得特別有用。
排查服務器問題,我們一般需要結合多項指標來進行綜合分析研判。例如如果你懷疑VPS主機的IO讀寫有問題,你可以通過iotop來查看讀寫實時速度,同時用top命令查看哪些進程來占用CPU和內存,這樣結合多項數據就會得到正確的結果。