- 工信部備案號 滇ICP備05000110號-1
- 滇公安備案 滇53010302000111
- 增值電信業務經營許可證 B1.B2-20181647、滇B1.B2-20190004
- 云南互聯網協會理事單位
- 安全聯盟認證網站身份V標記
- 域名注冊服務機構許可:滇D3-20230001
- 代理域名注冊服務機構:新網數碼
一、線上服務器CPU飆升,如何定位到Java代碼
解決這個問題的關鍵是要找到Java代碼的位置。下面分享一下排查思路,以CentOS為例,總結為4步。
第1步,使用top命令找到占用CPU高的進程。
第2步,使用ps –mp命令找到進程下占用CPU高的線程ID。
第3步,使用printf命令將線程ID轉換成十六進制數。
第4步,使用jstack命令輸出線程運行狀態的日志信息。
二、生產環境服務器變慢,如何診斷處理
生產環境服務器變慢主要涉及3個維度:CPU利用率、磁盤I/O效率、內存瓶頸。
1、CPU利用率
CPU利用率過高或者CPU利用率過低,都會影響程序的處理效率。CPU利用率過高,說明當前服務器要處理的指令比較多,當CPU忙不過來的時候,指令的運行效率自然就會下降,用戶的感受就是程序響應變慢了。
針對這個問題,我們可以使用top命令查詢當前系統中占用CPU過高的進程,并定位到這個進程中比較活躍的線程。再通過jstack命令打印當前虛擬機的線程快照,根據快照日志排查問題代碼。
如果CPU利用率過低,則說明程序資源使用不夠,可以增加線程數量提升程序性能。
2、磁盤I/O效率
在程序運行過程中會直接或者間接涉及一些與磁盤I/O相關的操作,比如程序直接讀/寫磁盤或者程序依賴的第三方組件對磁盤進行持久化存儲,此時磁盤I/O效率就會對程序運行效率產生影響。
針對這種情況可以使用iostat命令查看,如果磁盤負載較高,可以針對性地進行優化。比如,借助緩存系統,減少磁盤I/O次數;用順序寫替代隨機寫入,減少尋址開銷;使用mmap替代read/write,減少內存拷貝次數。另外,磁盤I/O效率可以通過CPU與負載的非線性關系體現出來。當負載增大時,系統吞吐量不能有效增大,CPU不能線性增長,則很可能是磁盤I/O出現阻塞。
3、內存瓶頸
內存作為一塊臨時存儲數據的組件,所有CPU運行的指令都需要從內存中去讀/寫。內存的合理使用可以減少應用和磁盤的I/O頻率,減少網絡I/O的頻率,極大地提升I/O性能。
JVM對內存的合理分配,能夠避免頻繁的YGC和FULL GC。當內存使用率較高時,可以用dump命令查出JVM堆內存,用MAT工具進行分析,查出大對象或者占用內存最多的對象,以及排查是否存在內存泄漏的問題。如果用 dump 命令查出的堆內存文件正常,則可以考慮是堆外內存被大量使用導致出現問題,此時需要借助操作系統的pmap命令查出進程的內存分配情況。如果CPU和內存使用率都很正常,那么就需要進一步開啟GC日志,分析用戶線程暫停的時間、各部分內存區域GC次數和時間等指標,這里可以借助jstat命令或可視化工具GCEasy等。如果問題出在GC上,則考慮是不是內存不足,然后根據垃圾對象的特點進行參數調優,使用更適合的垃圾收集器,用jstack命令分析各個線程的狀態。如果問題比較隱蔽,則考慮是否開啟JMX,使用 visualmv 等可視化工具進行遠程監控與分析。
售前咨詢
售后咨詢
備案咨詢
二維碼
TOP