【Java面試】生產環境伺服器變慢,如何診斷處理?

「生產環境伺服器變慢?如何診斷處理」

這是最近一些工作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學架構」公眾號公眾號獲取更多技術乾貨!