“生產環境伺服器變慢?如何診斷處理” 這是最近一些工作5年以上的粉絲反饋給我的問題,他們去一線大廠面試,都被問到了這一類的問題。 今天給大家分享一下,面試過程中遇到這個問題,我們應該怎麼回答。 這個問題高手部分的回答,我整理到了一個10W字的文檔裡面,大家可以在我的主頁加V領取。 來看看高手的回答。 ...
“生產環境伺服器變慢?如何診斷處理”
這是最近一些工作5年以上的粉絲反饋給我的問題,他們去一線大廠面試,都被問到了這一類的問題。
今天給大家分享一下,面試過程中遇到這個問題,我們應該怎麼回答。
這個問題高手部分的回答,我整理到了一個10W字的文檔裡面,大家可以在我的主頁加V領取。
來看看高手的回答。
高手:
生產環境伺服器處理效率變慢,我認為主要會涉及到三個緯度:
- CPU的利用率
- 磁碟IO效率
- 記憶體
CPU利用率過高或者CPU利用率過低,都會影響程式的處理效率。
利用率過高,說明當前伺服器要處理的指令比較多,當CPU忙不過來的時候,指令的運算效率自然就會下降。
反饋在用戶上的感受就是程式響應變慢了。
針對這個問題,我們可以使用top命令查詢當前系統中占用CPU過高的進程,以及定位到這個進程中比較活躍的線程。
再通過jstack命令列印當前虛擬機的線程快照,然後根據快照日誌排查問題代碼。
如果CPU利用率過低,說明程式資源使用不夠,可以增加線程數量提升程式性能。
程式運算過程中,會直接或者間接涉及到一些磁碟IO相關的操作,比如程式直接讀寫磁碟,
或者程式依賴的第三方組件涉及到磁碟的持久化存儲,所以磁碟的IO效率也會對程式運行效率產生影響。
針對這個情況,可以使用iostat
命令查看,如果磁碟負載較高,可以針對性的進行優化,比如
- 藉助緩存系統,減少磁碟IO次數
- 用順序寫替代隨機寫入,減少定址開銷
- 使用mmap替代read/write,減少記憶體拷貝次數
另外,系統IO的瓶頸可以通過CPU和負載的非線性關係體現出來。當負載增大時,系統吞吐量不能有效增大,
CPU不能線性增長,其中一種可能是IO出現阻塞。
最後,就是記憶體的瓶頸,記憶體作為一塊臨時存儲數據的組件,所有CPU運算的指令都需要從記憶體中去讀寫。
記憶體的合理使用,可以減少應用和磁碟的直接IO頻率,以及減少網路IO的頻率,極大提升IO性能。
其次,作為Java應用程式的運行平臺JVM,對於記憶體的合理分配,能夠避免頻繁的YGC和FULL GC。
記憶體使用率比較高的時候, 可以 dump 出 JVM 堆記憶體,然後藉助 MAT 工具進行分析,
查出大對象或者占用最多的對象,以及排查是否存在記憶體泄漏的問題。
如果 dump 出的堆記憶體文件正常,此時可以考慮堆外記憶體被大量使用導致出現問題,
需要藉助操作系統指令 pmap 查出進程的記憶體分配情況。
如果 CPU 和 記憶體使用率都很正常,那就需要進一步開啟 GC 日誌,分析用戶線程暫停的時間、
各部分記憶體區域 GC 次數和時間等指標,可以藉助 jstat 或可視化工具 GCeasy 等,
如果問題出在 GC 上面的話,考慮是否是記憶體不夠、根據垃圾對象的特點進行參數調優、使用更適合的垃圾收集器;
分析 jstack 出來的各個線程狀態。如果問題實在比較隱蔽,考慮是否可以開啟 jmx,使用 visualmv 等可視化工具遠程監控與分析。
總結
這個問題涉及到的知識面比較多,站在面試者的角度來說。
如果沒有實際解決過類似問題,可以說一下自己的思路
只要大體思路和方向是對的,那在遇到類似問題的時候,可以利用網路上的資料
去逐步嘗試解決。
大家記得點贊收藏加關註。
版權聲明:本博客所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自
Mic帶你學架構
!
如果本篇文章對您有幫助,還請幫忙點個關註和贊,您的堅持是我不斷創作的動力。歡迎關註「跟著Mic學架構」公眾號公眾號獲取更多技術乾貨!