一個基於 Linux 操做系統的服務器運行的同時,也會表徵出各類各樣參數信息。一般來講運維人員、系統管理員會對這些數據會極爲敏感,可是這些參數對於開發者來講也十分重要,尤爲當你的程序非正常工做的時候,這些蛛絲馬跡每每會幫助快速定位跟蹤問題。linux
這裏只是一些簡單的工具查看系統的相關參數,固然不少工具也是經過分析加工 /proc、/sys 下的數據來工做的,而那些更加細緻、專業的性能監測和調優,可能還須要更加專業的工具(perf、systemtap 等)和技術才能完成哦。畢竟來講,系統性能監控自己就是個大學問。ios
1、CPU和內存類緩存
1.1 top服務器
➜ ~ top網絡
第一行後面的三個值是系統在以前 一、五、15 的平均負載,也能夠看出系統負載是上升、平穩、降低的趨勢,當這個值超過 CPU 可執行單元的數目,則表示 CPU 的性能已經飽和成爲瓶頸了。多線程
第二行統計了系統的任務狀態信息。running 很天然沒必要多說,包括正在 CPU 上運行的和將要被調度運行的;sleeping 一般是等待事件(好比 IO 操做)完成的任務,細分能夠包括 interruptible 和 uninterruptible 的類型;stopped 是一些被暫停的任務,一般發送 SIGSTOP 或者對一個前臺任務操做 Ctrl-Z 能夠將其暫停;zombie 殭屍任務,雖然進程終止資源會被自動回收,可是含有退出任務的 task descriptor 須要父進程訪問後才能釋放,這種進程顯示爲 defunct 狀態,不管是由於父進程提早退出仍是未 wait 調用,出現這種進程都應該格外注意程序是否設計有誤。 第三行 CPU 佔用率根據類型有如下幾種狀況:負載均衡
CPU 佔用率高不少狀況下意味着一些東西,這也給服務器 CPU 使用率太高狀況下指明瞭相應地排查思路:運維
第四行和第五行是物理內存和虛擬內存(交換分區)的信息: total = free + used + buff/cache,如今buffers和cached Mem信息總和到一塊兒了,可是buffers和cachedasync
Mem 的關係不少地方都沒說清楚。其實經過對比數據,這兩個值就是 /proc/meminfo 中的 Buffers 和 Cached 字段:Buffers 是針對 raw disk 的塊緩存,主要是以 raw block 的方式緩存文件系統的元數據(好比超級塊信息等),這個值通常比較小(20M左右);而 Cached 是針對於某些具體的文件進行讀緩存,以增長文件的訪問效率而使用的,能夠說是用於文件系統中文件緩存使用。tcp
而 avail Mem 是一個新的參數值,用於指示在不進行交換的狀況下,能夠給新開啓的程序多少內存空間,大體和 free + buff/cached 至關,而這也印證了上面的說法,free + buffers + cached Mem纔是真正可用的物理內存。而且,使用交換分區不見得是壞事情,因此交換分區使用率不是什麼嚴重的參數,可是頻繁的 swap in/out 就不是好事情了,這種狀況須要注意,一般表示物理內存緊缺的狀況。
最後是每一個程序的資源佔用列表,其中 CPU 的使用率是全部 CPU core 佔用率的總和。一般執行 top 的時候,自己該程序會大量的讀取 /proc 操做,因此基本該 top 程序自己也會是名列前茅的。
top 雖然很是強大,可是一般用於控制檯實時監測系統信息,不適合長時間(幾天、幾個月)監測系統的負載信息,同時對於短命的進程也會遺漏沒法給出統計信息。
1.2 vmstat
vmstat 是除 top 以外另外一個經常使用的系統檢測工具,下面截圖是我用-j4編譯boost的系統負載。
r 表示可運行進程數目,數據大體相符;而b表示的是 uninterruptible 睡眠的進程數目;swpd 表示使用到的虛擬內存數量,跟 top-Swap-used 的數值是一個含義,而如手冊所說,一般狀況下 buffers 數目要比 cached Mem 小的多,buffers 通常20M這麼個數量級;io 域的 bi、bo 代表每秒鐘向磁盤接收和發送的塊數目(blocks/s);system 域的 in 代表每秒鐘的系統中斷數(包括時鐘中斷),cs代表由於進程切換致使上下文切換的數目。
說到這裏,想到之前不少人糾結編譯 linux kernel 的時候 -j 參數到底是 CPU Core 仍是 CPU Core+1?經過上面修改 -j 參數值編譯 boost 和 linux kernel 的同時開啓 vmstat 監控,發現兩種狀況下 context switch 基本沒有變化,且也只有顯著增長 -j 值後 context switch 纔會有顯著的增長,看來沒必要過於糾結這個參數了,雖然具體編譯時間長度我尚未測試。資料說若是不是在系統啓動或者 benchmark 的狀態,參數 context switch>100000 程序確定有問題。
1.3 pidstat
若是想對某個進程進行全面具體的追蹤,沒有什麼比 pidstat 更合適的了——棧空間、缺頁狀況、主被動切換等信息一覽無餘。這個命令最有用的參數是-t,能夠將進程中各個線程的詳細信息羅列出來。
-r: 顯示缺頁錯誤和內存使用情況,缺頁錯誤是程序須要訪問映射在虛擬內存空間中可是還還沒有被加載到物理內存中的一個分頁,缺頁錯誤兩個主要類型是
-s:棧使用情況,包括 StkSize 爲線程保留的棧空間,以及 StkRef 實際使用的棧空間。使用ulimit -s發現CentOS 6.x上面默認棧空間是10240K,而 CentOS 7.x、Ubuntu系列默認棧空間大小爲8196K
-u:CPU使用率狀況,參數同前面相似
-w:線程上下文切換的數目,還細分爲cswch/s由於等待資源等因素致使的主動切換,以及nvcswch/s線程CPU時間致使的被動切換的統計
若是每次都先ps獲得程序的pid後再操做pidstat會顯得很麻煩,因此這個殺手鐗的-C能夠指定某個字符串,而後Command中若是包含這個字符串,那麼該程序的信息就會被打印統計出來,-l能夠顯示完整的程序名和參數 ➜ ~ pidstat -w -t -C 「ailaw」 -l
這麼看來,若是查看單個尤爲是多線程的任務時候,pidstat比經常使用的ps更好使!
1.4 其餘
當須要單獨監測單個 CPU 狀況的時候,除了 htop 還可使用 mpstat,查看在 SMP 處理器上各個 Core 的工做量是否負載均衡,是否有某些熱點線程佔用 Core。 ➜ ~ mpstat -P ALL 1
若是想直接監測某個進程佔用的資源,既可使用top -u taozj的方式過濾掉其餘用戶無關進程,也能夠採用下面的方式進行選擇,ps命令能夠自定義須要打印的條目信息:
while :; do ps -eo user,pid,ni,pri,pcpu,psr,comm | grep 'ailawd'; sleep 1; done
如想理清繼承關係,下面一個經常使用的參數能夠用於顯示進程樹結構,顯示效果比pstree詳細美觀的多
➜ ~ ps axjf
2、磁盤IO類
iotop 能夠直觀的顯示各個進程、線程的磁盤讀取實時速率;lsof 不只能夠顯示普通文件的打開信息(使用者),還能夠操做 /dev/sda1 這類設備文件的打開信息,那麼好比當分區沒法 umount 的時候,就能夠經過 lsof 找出磁盤該分區的使用狀態了,並且添加 +fg 參數還能夠額外顯示文件打開 flag 標記。
2.1 iostat
➜ ~ iostat -xz 1
其實不管使用 iostat -xz 1 仍是使用 sar -d 1,對於磁盤重要的參數是:
還有,雖然監測到的磁盤性能比較差,可是不必定會對應用程序的響應形成影響,內核一般使用 I/O asynchronously 技術,使用讀寫緩存技術來改善性能,不過這又跟上面的物理內存的限制相制約了。
上面的這些參數,對網絡文件系統也是受用的。
3、網絡類
網絡性能對於服務器的重要性不言而喻,工具 iptraf 能夠直觀的現實網卡的收發速度信息,比較的簡潔方便經過 sar -n DEV 1 也能夠獲得相似的吞吐量信息,而網卡都標配了最大速率信息,好比百兆網卡千兆網卡,很容易查看設備的利用率。
一般,網卡的傳輸速率並非網絡開發中最爲關切的,而是針對特定的 UDP、TCP 鏈接的丟包率、重傳率,以及網絡延時等信息。
3.1 netstat
➜ ~ netstat -s
顯示自從系統啓動以來,各個協議的整體數據信息。雖然參數信息比較豐富有用,可是累計值,除非兩次運行作差才能得出當前系統的網絡狀態信息,亦或者使用 watch 眼睛直觀其數值變化趨勢。因此netstat一般用來檢測端口和鏈接信息的:
netstat –all(a) –numeric(n) –tcp(t) –udp(u) –timers(o) –listening(l) –program(p)
–timers能夠取消域名反向查詢,加快顯示速度;比較經常使用的有
➜ ~ netstat -antp #列出全部TCP的鏈接
➜ ~ netstat -nltp #列出本地全部TCP偵聽套接字,不要加-a參數
3.2 sar
sar 這個工具太強大了,什麼 CPU、磁盤、頁面交換啥都管,這裏使用 -n 主要用來分析網絡活動,雖然網絡中它還給細分了 NFS、IP、ICMP、SOCK 等各類層次各類協議的數據信息,咱們只關心 TCP 和 UDP。下面的命令除了顯示常規狀況下段、數據報的收發狀況,還包括
TCP ➜ ~ sudo sar -n TCP,ETCP 1
UDP ➜ ~ sudo sar -n UDP 1
固然,這些數據必定程度上能夠說明網絡可靠性,但也只有同具體的業務需求場景結合起來才具備意義。
3.3 tcpdump
tcpdump 不得不說是個好東西。你們都知道本地調試的時候喜歡使用 wireshark,可是線上服務端出現問題怎麼弄呢?
附錄的參考文獻給出了思路:復原環境,使用 tcpdump 進行抓包,當問題復現(好比日誌顯示或者某個狀態顯現)的時候,就能夠結束抓包了,並且 tcpdump 自己帶有 -C/-W 參數,能夠限制抓取包存儲文件的大小,當達到這個這個限制的時候保存的包數據自動 rotate,因此抓包數量整體仍是可控的。此後將數據包拿下線來,用 wireshark 想怎麼看就怎麼看,豈不樂哉!tcpdump 雖然沒有 GUI 界面,可是抓包的功能絲絕不弱,能夠指定網卡、主機、端口、協議等各項過濾參數,抓下來的包完整又帶有時間戳,因此線上程序的數據包分析也能夠這麼簡單。
下面就是一個小的測試,可見 Chrome 啓動時候自動向 Webserver 發起創建了三條鏈接,因爲這裏限制了 dst port 參數,因此服務端的應答包被過濾掉了,拿下來用 wireshark 打開,SYNC、ACK 創建鏈接的過程仍是很明顯的!在使用 tcpdump 的時候,須要儘量的配置抓取的過濾條件,一方面便於接下來的分析,二則 tcpdump 開啓後對網卡和系統的性能會有影響,進而會影響到在線業務的性能。