監控的分層
理論上,我們需要對系統數據流轉的每個節點做監控,收集數據,以便於分析。但是受限於環境問題或者時間問題,我們不能面面俱到,所以需要把系統做一下簡單的分類,選擇最需要的地方進行監控。
系統資源的監控
對於承載應用的最基礎設備,我們需要充分了解它的使用情況,觀察其當前的狀態,對於硬件設備的評估,也有助於線上設備的采購和選擇。一般情況下,我們需要關注的內容有CPU、Memory、I/O、Network,也就是我們通常說的3+1.
注意點:
1、CPU我們關注的是%us(用戶使用率),%sy(系統使用率,當需要系統做任務調度的時候會消耗)需要注意。
2、Linux下,空閑Memory的計算方式,基於Linux系統的內存使用原則,不要看到free的數據少了,覺得是瓶頸了。
例如:Total 2G usred 1.5G free 200M buffer 1G cache 500M
系統當前能使用的Memory總量 = free + buffer + cache
3、IO的瓶頸的確認需要特別注意,需要多方考慮,綜合思考,"一切問題皆IO"。
4、Network需要注意上下行及單位。
監控工具
Nmon小巧精練的工具,安裝和使用都很方便,支持多版本的linux,內容豐富。
Glances業內號稱Linux系統實時監控的瑞士軍刀,用python開發,很小巧,監控覆蓋全面,界面清晰,通過顏色來區別不同的等級,一目了然。
最高境界,利用linux自帶的命令,通過shell腳本自行采集數據並繪制成圖表。常用的命令top、iostat、pidstat、sar、netstat、iftop、vmsata、jstat(jvm使用情況)、jps(java進程)等。
應用層資源的監控
我們可以操作系統的資源消耗,理解為是應用層問題的外在表現。在應用層,由於框架的不同,開發人員水平及意識的限制,會產生各種各樣的問題,導致了硬件資源的不合理消耗,從而產生性能問題。在這一層次,我們通常關注以下問題:
1、阻塞,正在運行的線程沒有運行結束,暫時讓出CPU。
2、爭用,多個線程對同一段數據進行不同的操作。
3、死鎖,好的線程鎖是業務的保障,不好的鎖是災難。
4、理解線程狀態圖,有助於解決問題。
基於java的監控工具
Jvisualvm JDK自帶監控工具,無需安裝,只需要一個簡單的配置,就能全方位監控代碼運行情況,跟蹤方便,插件豐富,你不能錯過的工具。
JProfiler直覺式的GUI讓你可以找到性能瓶頸、抓出內存漏失(memory leaks)、並解決執行緒的問題。它讓你得以對heap walker做資源回收器的root analysis,可以輕易找出內存漏失;heap快照(snapshot)模式讓未被參照(reference)的對象、稍微被參照的對象或在終結(finalization)隊列的對象都會被移除。
數據庫資源的監控
目前,80%性能問題,會出現在數據庫層面。配置不合理;開發人員沒有意識,導致SQL執行效率差;線上的大數據量沒有提前考慮;不合理的索引等等,都在時時刻刻影響着性能;我們需要重點關注數據庫層面的性能問題,關注點以下問題:
1、SQL的執行效率,或者說執行計划。
2、索引的正確使用。
3、大數據量情況下分庫分表。
4、其它TOP N的消耗。
數據庫監控工具
在oracle數據庫中,沒什么比AWR報告更好了,看懂了這份報告,基本上足夠了。
Msql監控工具MONyog,內容全面,界面清爽,個人強力推薦此工具,從此查看慢SQL不再是體力活。
總結
監控工具沒有好壞之分,每個節點選擇一款並把它用熟悉,了解每個指標背后的含義,才是正解。我們要做到知其然而知其所以然,這樣才能提高自己的判斷力,找出問題的根本原因。
性能測試需要豐富的經驗,做得越久,你的價值越高。真正的高手會在系統架構之初,就會預期到並解決掉大部分的性能問題。當下,我們不要急功近利,只想學習怎么分析怎么調優,我們需要沉下心來,從小處做起,從基礎做起。
