在不同的Linux發行版中,會有不同的GUI程式可以顯示各種系統資訊,比如SUSE Linux發行版中,就有非常棒的圖形化的配置和管理工具YaST,KDE桌面環境裡的KDE System Guard也很不錯。
然而,對於一名Linux系統管理員來說,除非迫不得已,否則不會在Linux伺服器上去執行這樣的GUI程式,主要還是因為GUI會佔用很多的系統資源。所以呢,使用GUI工具一般都是做簡單的排查,如果你真的想知道系統裡真正發生了什麼,那麼請關掉你的GUI,快點進入Linux命令列的世界吧。
如果希望追求最佳效能,那麼Linux伺服器應該執行在runlevel 3級別,也就是支援網路和多使用者功能,但不支援GUI功能。如果你真的需要GUI,那麼可以在命令列輸入startx進入GUI。
如果你的Linux系統預設就是進入GUI,你可以調一調配置,讓他預設進入runlevel 3。具體方法就是:
1 開啟一個終端,su到root賬號 2 用你喜歡的編輯器(vi/emacs/...)開啟/etc/inittab檔案 3 查詢initdefault關鍵字,將“id:5:initdefault:”修改為“id:3:initdefault:”如果系統中根本就沒有/etc/inittab檔案的話,也沒關係,直接建立這個檔案,並新增新的一行“id:3”。這樣的話,你再重啟伺服器,便會預設進入命令列狀態。當然,如果你只想在臨時進入命令列狀態,那麼直接在終端中輸入“init 3”就好了。
至此,我們的命令列準備好了,下面就可以開始通過強大的命令來檢視“到底伺服器裡發生了什麼”:
[01 - iostat ] [02/03 - meminfo/free ] [04 - mpstat ] [05 - netstat ] [06 - nmon ] [07 - pmap ] [08/09 - ps/pstree ] [10 - sar ] [11 - strace ] [12 - tcpdump ] [13 - top ] [14 - uptime ] [15 - vmstat ] [16 - wireshark ]
[01 - iostat]
iostat命令顯示的是你的儲存系統的細節狀態。你通常可以用這個命令去檢測你的儲存裝置是否工作正常,完全可以在使用者抱怨伺服器慢之前,通過這個命令發現系統IO方面的問題。
如下可以看到iostat既可以顯示CPU使用情況,也可以看到每個磁碟的IO情況。
# iostat 1 Linux 2.6.32-220.4.1.el6.i686 (roclinux) 2012年12月22日 _i686_ (4 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.55 0.00 0.03 0.02 0.00 99.40 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sdb 0.41 2.61 5.76 2558664 5653872 sda 0.24 0.80 4.12 784650 4038344
[02/03 - meminfo/free]
meminfo提供了很詳細的記憶體使用狀況。可以直接用cat命令檢視:
cat /proc/meminfo當然meminfo裡包含了太多細節,你可以直接使用free命令來檢視有關記憶體的綜述。
# free -m total used free shared buffers cached Mem: 1513 1429 83 0 343 836 -/+ buffers/cache: 249 1263 Swap: 0 0 0
[04 - mpstat]
mpstat用在多處理器的伺服器上,用來顯示每一個CPU的狀態。
另外,mpstat也會顯示所有處理器的平均狀況。
你可以設定顯示每個伺服器的CPU統計資訊,或者每個處理的CPU統計資訊。
# mpstat -P ALL Linux 2.6.32-220.4.1.el6.i686 (roclinux) 2012年12月22日 _i686_ (4 CPU) 17時46分35秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 17時46分35秒 all 0.55 0.00 0.03 0.02 0.00 0.00 0.00 0.00 99.40 17時46分35秒 0 0.84 0.00 0.04 0.03 0.00 0.01 0.00 0.00 99.08 17時46分35秒 1 0.51 0.00 0.03 0.02 0.00 0.00 0.00 0.00 99.44 17時46分35秒 2 0.45 0.00 0.02 0.01 0.00 0.00 0.00 0.00 99.51 17時46分35秒 3 0.40 0.00 0.02 0.01 0.00 0.00 0.00 0.00 99.56 # mpstat -P 0 Linux 2.6.32-220.4.1.el6.i686 (roclinux) 2012年12月22日 _i686_ (4 CPU) 17時46分39秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 17時46分39秒 0 0.84 0.00 0.04 0.03 0.00 0.01 0.00 0.00 99.08其中各個域的含義簡述如下:
1 CPU:處理器編號,如果為all,則此行表示的是所有處理器的統計平均值 2 %usr:使用者態的CPU利用率 3 %nice:具有排程優先順序的使用者態CPU利用率 4 %sys:核心態CPU利用率(此值不包括響應硬體中斷和軟體中斷的時間) 5 %iowait:處理IO請求導致CPU處於IDLE狀態的時間百分比 6 %irq:CPU響應硬體中斷的時間比率 7 %soft:CPU響應軟體中斷的時間比率 8 %steal:當虛擬機器監控器在服務於其他虛擬處理器時,虛擬CPU的被動等待時間比率 9 %guest:執行一個虛擬處理器所消耗的CPU時間比率
[05 - netstat]
netstat命令,是Linux系統管理員幾乎每天都會用到的命令(它已經逐步在被ss命令取代),他可以顯示很多有關網路方面的資訊,例如socket使用情況、路由情況、網路卡情況、協議情況、網路流量統計等等。
一些常用的netstat選項包括:
-a : 顯示所有socke資訊 -r : 顯示路由資訊 -i : 顯示網路卡藉口統計 -s : 顯示網路協議統計
[06 - nmon]
nmon是Nigel’s Monitor的縮寫,它是一個很知名的監視Linux系統效能的工具。
nmon可以檢視到處理器利用率、記憶體使用率、執行佇列資訊、磁碟IO統計、網路IO統計、換頁統計等。
你可以通過一個基於curses的類GUI介面來檢視到上述資訊。
nmon監控工具
[07 - pmap]
pmap命令可以顯示程式佔用的記憶體量。
你可以通過pmap找到那個佔用記憶體量最多的程式。
如下就是nignx主程式所佔用的記憶體情況:
# pmap 2395|head -n 10 2395: nginx: master process ./sbin/nginx 00110000 240K r-x-- /lib/libgssapi_krb5.so.2.2 0014c000 4K ----- /lib/libgssapi_krb5.so.2.2 0014d000 4K r---- /lib/libgssapi_krb5.so.2.2 0014e000 4K rw--- /lib/libgssapi_krb5.so.2.2 0014f000 12K r-x-- /lib/libcom_err.so.2.1 00152000 4K r---- /lib/libcom_err.so.2.1 00153000 4K rw--- /lib/libcom_err.so.2.1 00154000 48K r-x-- /lib/libnss_files-2.12.so 00160000 4K r---- /lib/libnss_files-2.12.so ... b78e4000 20K rw--- [ anon ] b78f3000 4K rw-s- /dev/zero (deleted) b78f4000 4K rw--- [ anon ] bfeaa000 84K rw--- [ stack ] total 7280K
[08/09 - ps/pstree]
ps和pstree在Linux系統裡是一對好兄弟,它們都是用來列出處於執行狀態的程式的列表的。
ps告訴我們每個程式使用的記憶體量以及所消耗的CPU時間。
pstree則會告訴我們程式間的父子關係,如下便是mysql的一些父子關係資訊:
# pstree -p 1829 mysqld_safe(1829)───mysqld(2307)─┬─{mysqld}(2309) ├─{mysqld}(2310) ├─{mysqld}(2311) ├─{mysqld}(2312) ├─{mysqld}(2313) ├─{mysqld}(2314) ├─{mysqld}(2315) ├─{mysqld}(2316) ├─{mysqld}(2317) ├─{mysqld}(2318) ├─{mysqld}(2320) ├─{mysqld}(2321) ├─{mysqld}(2322) ├─{mysqld}(2323) ├─{mysqld}(2325) ├─{mysqld}(2544) ├─{mysqld}(2548) ├─{mysqld}(7912) ├─{mysqld}(7914) ├─{mysqld}(7916) ├─{mysqld}(24689) ├─{mysqld}(27329) └─{mysqld}(27331)
[10 - sar]
sar命令堪稱系統監控工具裡的瑞士軍刀。
sar命令實際上是由三個程式組成的,即sar(用於顯示資料)、sa1(用於採集資料)和sa2(用於儲存資料)。
sar可以涵蓋到CPU利用率資訊、記憶體換頁資訊、網路IO傳輸資訊、程式建立行為和儲存裝置行為。
s
ar和nmon的最大區別在於,sar更適用於長期的系統監控,而nmon則更適用於快速檢視資訊。
[11 - strace]
starce經常被用來作為追查程式問題的工具,但他的功能遠非如此。
它可以解析和記錄程式的系統呼叫行為,這使得strace成為了一個非常有用的診斷、調查和糾錯工具。
舉例來說,你可以適用strace來追查到一個程式在啟動之初所需載入的配置檔案資訊。
當然,strace也有它自身的缺陷,那就是strace會嚴重拖慢調查物件(某個程式)的效能和執行速度。
順便推薦一篇非常好的strace的文章:《strace使用詳解》
另外,如果你使用MAC,strace的替代品是truss。
[12 - tcpdump]
tcpdump是一個簡單的、好用的網路監控工具。它的網路協議分析能力使得它能夠看清網路中到底發生了什麼,如果你希望更細節的調查的話,可以考慮適用功能更為強大的wireshark工具。
tcpdump的系列教程“在這裡”。
[13 - top]
top命令可以顯示系統中的程式資訊。預設情況下,top會按照CPU使用率從高到低來顯示系統中的程式,並且每5秒重新整理一次排行榜。
當然,你也可以讓top按照PID、程式壽命、CPU耗時、記憶體消耗等維度對程式進行排序。(我經常使用的是P和M快捷鍵,分別是按CPU利用率排序、按記憶體使用量排序)
通過top命令,你可以很快的發現那些失去控制或不符合預期的程式。
[14 - uptime]
通過uptime命令可以檢視系統已經執行了多久,可以統計當前處於登陸狀態的使用者數量,還可以顯示當前伺服器的負載情況。
# uptime 18:35:17 up 11 days, 9:30, 1 user, load average: 0.00, 0.00, 0.00
[15 - vmstat]
大多數情況下,你可以使用vmstat命令去檢視系統的虛擬記憶體情況,因為Linux通常會通過虛擬記憶體來獲得更好的儲存效能。
如果你的程式佔用了大量了記憶體,那麼系統會進行記憶體頁換出的動作,以便把程式從記憶體中移動到系統SWAP空間中,也就是硬碟中。
如果系統的記憶體頁的換入換出動作頻度超過一個臨界值,那麼這種狀態被叫做“Thrashing”。當系統處於thrashing狀態時,效能會急劇下降。
vmstat命令便可以幫助人們及時發現此類問題,找出那個拖慢系統的元凶。
# vmstat 1 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 2 0 0 57484 356864 861332 0 0 0 1 7 3 1 0 99 0 0 0 0 0 57468 356864 861360 0 0 0 0 336 145 6 1 94 0 0 0 0 0 57468 356864 861360 0 0 0 0 43 51 0 0 100 0 0 0 0 0 57468 356864 861360 0 0 0 16 51 62 0 0 100 0 0
[16 - wireshark]
Wireshark的前身叫做Ethereal,我們可以認為wireshark是tcpdump命令的大師兄,因為wireshark會更為專業,也具有更高階的協議分析和統計能力。
Wireshark同時具有GUI介面和shell藉口。
如果你是一位資深的網路管理員,那麼你一定使用過ethereal。而如果你正在使用wireshark/ethereal,那麼我推薦你閱讀Chris Sander的一本非常好的書《Practical Packet Analysis》。
謝謝!
相關閱讀
評論(2)