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