人人妻人人澡人人爽人人精品av_精品乱码一区内射人妻无码_老司机午夜福利视频_精品成品国色天香摄像头_99精品福利国产在线导航_野花社区在线观看视频_大地资源在线影视播放_东北高大肥胖丰满熟女_金门瓶马车内剧烈运动

首頁(yè)>國(guó)內(nèi) > 正文

當(dāng)前時(shí)訊:Java 經(jīng)典面試解析:服務(wù)器卡頓、CPU飆升、接口負(fù)載劇增

2023-07-06 09:25:44來源:碼哥字節(jié)

01、線上服務(wù)器CPU飆升,如何定位到Java代碼

解決這個(gè)問題的關(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命令輸出線程運(yùn)行狀態(tài)的日志信息。

下面詳細(xì)介紹每一步的操作。

第1步,在使用top命令之后,可以看到一個(gè)列表,其中包含PID(進(jìn)程ID)、USER(操作用戶)、CPU占用率、內(nèi)存占用率、TIME+(運(yùn)行時(shí)間)、COMMAND(運(yùn)行命令)等信息。一般默認(rèn)按CPU占用率從上到下降序排列,如下圖所示。

我們找到COMMAND列是java的這一行,說明這個(gè)程序就是用Java編寫的。然后,用記事本記下這一行的PID,也就是進(jìn)程ID。

第2步,使用ps-mp命令,輸出這個(gè)PID下面的線程運(yùn)行情況列表,如下圖所示。

圖片

在這個(gè)列表中包含了幾個(gè)關(guān)鍵字段,比如CPU占用率、TID(線程ID)、TIME(運(yùn)行時(shí)間)等。在這個(gè)列表中找到CPU占用最高的線程,記下TID,也就是線程ID。

前面記下的TID是一個(gè)十進(jìn)制數(shù),不能直接使用,需要轉(zhuǎn)化為十六進(jìn)制數(shù)。

第3步,使用 printf 命令將TID轉(zhuǎn)換為十六進(jìn)制數(shù),如下圖所示。

圖片

這樣就得到了真正占用CPU過高的線程ID。

第4步,使用jstack命令輸出線程的具體運(yùn)行日志,如下圖所示。

圖片

jstack有3個(gè)參數(shù),第1個(gè)參數(shù)是前面記下的 PID,之后加上 grep,緊跟著是轉(zhuǎn)成十六進(jìn)制數(shù)的TID,最后加上 –A和一個(gè)數(shù)字,這個(gè)數(shù)字表示輸出日志的行數(shù),至此就可以直接打印出具體的異常信息了。

如果日志信息比較多,異常內(nèi)容比較復(fù)雜,則可以把這些異常信息輸出到一個(gè) txt文件中,慢慢分析。只需要在 jstack命令的最后追加 txt 文件名就可以了。

jstack PID | grep TID -A60 >> error_log.txt

面試點(diǎn)評(píng):從這個(gè)問題來看,面試官主要考查求職者的實(shí)操能力,以及解決問題的思路。如果求職者沒有實(shí)操過,但是知道導(dǎo)致CPU飆升的原因,并說出解決思路,那么通過面試是沒問題的。

02生產(chǎn)環(huán)境服務(wù)器變慢,如何診斷處理

生產(chǎn)環(huán)境服務(wù)器變慢主要涉及3個(gè)維度:CPU利用率、磁盤I/O效率、內(nèi)存瓶頸。

1. CPU利用率

CPU利用率過高或者CPU利用率過低,都會(huì)影響程序的處理效率。CPU利用率過高,說明當(dāng)前服務(wù)器要處理的指令比較多,當(dāng)CPU忙不過來的時(shí)候,指令的運(yùn)行效率自然就會(huì)下降,用戶的感受就是程序響應(yīng)變慢了。

針對(duì)這個(gè)問題,我們可以使用top命令查詢當(dāng)前系統(tǒng)中占用CPU過高的進(jìn)程,并定位到這個(gè)進(jìn)程中比較活躍的線程。再通過jstack命令打印當(dāng)前虛擬機(jī)的線程快照,根據(jù)快照日志排查問題代碼。

如果CPU利用率過低,則說明程序資源使用不夠,可以增加線程數(shù)量提升程序性能。

2. 磁盤I/O效率

在程序運(yùn)行過程中會(huì)直接或者間接涉及一些與磁盤I/O相關(guān)的操作,比如程序直接讀/寫磁盤或者程序依賴的第三方組件對(duì)磁盤進(jìn)行持久化存儲(chǔ),此時(shí)磁盤I/O效率就會(huì)對(duì)程序運(yùn)行效率產(chǎn)生影響。

針對(duì)這種情況可以使用iostat命令查看,如果磁盤負(fù)載較高,可以針對(duì)性地進(jìn)行優(yōu)化。比如,借助緩存系統(tǒng),減少磁盤I/O次數(shù);用順序?qū)懱娲S機(jī)寫入,減少尋址開銷;使用mmap替代read/write,減少內(nèi)存拷貝次數(shù)。另外,磁盤I/O效率可以通過CPU與負(fù)載的非線性關(guān)系體現(xiàn)出來。當(dāng)負(fù)載增大時(shí),系統(tǒng)吞吐量不能有效增大,CPU不能線性增長(zhǎng),則很可能是磁盤I/O出現(xiàn)阻塞。

3. 內(nèi)存瓶頸

內(nèi)存作為一塊臨時(shí)存儲(chǔ)數(shù)據(jù)的組件,所有CPU運(yùn)行的指令都需要從內(nèi)存中去讀/寫。內(nèi)存的合理使用可以減少應(yīng)用和磁盤的I/O頻率,減少網(wǎng)絡(luò)I/O的頻率,極大地提升I/O性能。

JVM對(duì)內(nèi)存的合理分配,能夠避免頻繁的YGC和FULL GC。當(dāng)內(nèi)存使用率較高時(shí),可以用dump命令查出JVM堆內(nèi)存,用MAT工具進(jìn)行分析,查出大對(duì)象或者占用內(nèi)存最多的對(duì)象,以及排查是否存在內(nèi)存泄漏的問題。如果用dump 命令查出的堆內(nèi)存文件正常,則可以考慮是堆外內(nèi)存被大量使用導(dǎo)致出現(xiàn)問題,此時(shí)需要借助操作系統(tǒng)的pmap命令查出進(jìn)程的內(nèi)存分配情況。如果CPU和內(nèi)存使用率都很正常,那么就需要進(jìn)一步開啟GC日志,分析用戶線程暫停的時(shí)間、各部分內(nèi)存區(qū)域GC次數(shù)和時(shí)間等指標(biāo),這里可以借助jstat命令或可視化工具GCEasy等。如果問題出在GC上,則考慮是不是內(nèi)存不足,然后根據(jù)垃圾對(duì)象的特點(diǎn)進(jìn)行參數(shù)調(diào)優(yōu),使用更適合的垃圾收集器,用jstack命令分析各個(gè)線程的狀態(tài)。如果問題比較隱蔽,則考慮是否開啟JMX,使用 visualmv 等可視化工具進(jìn)行遠(yuǎn)程監(jiān)控與分析。

面試點(diǎn)評(píng):這個(gè)問題涉及的知識(shí)面比較多,如果只是站在求職者的角度來分析,則可以這樣回答。如果你沒有實(shí)際解決過類似問題,則可以說一下自己的思路,只要大體思路和方向是對(duì)的,那么在遇到類似問題的時(shí)候,可以利用網(wǎng)絡(luò)上的資料去逐步嘗試解決。

03線上接口負(fù)載劇增,快扛不住了,你的首選方案是什么

遇到這樣的問題,我們的第一反應(yīng)應(yīng)該是增加緩存。因?yàn)?,增加緩存是解決系統(tǒng)性能問題最快速、最高效的方案,它能夠快速提升系統(tǒng)的線性吞吐量,效果也最為明顯。這就相當(dāng)于是用空間來?yè)Q取時(shí)間。曾經(jīng)有人說過,緩存是解決性能問題的萬金油,哪里存在性能瓶頸,就往哪里加緩存。

但是程序都已經(jīng)上線了,增加緩存還來得及嗎?因?yàn)樵谠黾泳彺鏁r(shí)需要改代碼,所以,臨時(shí)解決方案就是增加節(jié)點(diǎn)。隨后,將程序緊急部署到新的節(jié)點(diǎn)上,在流量入口增加限流和分發(fā)。但是增加節(jié)點(diǎn)自然會(huì)增加成本,所以增加緩存才是最優(yōu)的解決方案。

緩存的設(shè)計(jì)思想在架構(gòu)設(shè)計(jì)中十分常見。比如我們每天用的操作系統(tǒng),不管是Windows、Linux,還是Mac OS都有系統(tǒng)緩存、用戶緩存。磁盤有磁盤緩存區(qū)、CPU有CPU緩存區(qū)。再比如,在我們常用的經(jīng)典框架中,也經(jīng)常使用到緩存,Spring有IoC緩存,MyBatis有一級(jí)緩存、二級(jí)緩存。在架構(gòu)設(shè)計(jì)中,可以說緩存無處不在。

因此,當(dāng)并發(fā)量過高扛不住的時(shí)候,可以優(yōu)先采用緩存來緩解負(fù)載壓力。比如將讀取頻繁的數(shù)據(jù)寫到緩存中,將動(dòng)態(tài)頁(yè)面靜態(tài)化。在加上緩存之后,如果負(fù)載壓力依然過大,則再考慮增加限流策略,比如消息隊(duì)列;如果在增加限流后還是壓力過大,則再考慮增加服務(wù)器節(jié)點(diǎn)。

面試點(diǎn)評(píng):這個(gè)問題考查的是求職者的臨場(chǎng)應(yīng)變能力,有相關(guān)經(jīng)驗(yàn)的程序員回答這個(gè)問題并不困難。在回答這個(gè)問題的時(shí)候,可以分兩種情況:一種是臨時(shí)解決方案,就是加服務(wù)器;另一種就是增加緩存,但是涉及修改代碼,會(huì)增加程序不穩(wěn)定的風(fēng)險(xiǎn)。

關(guān)鍵詞:

相關(guān)新聞

Copyright 2015-2020   三好網(wǎng)  版權(quán)所有 聯(lián)系郵箱:435 22 [email protected]  備案號(hào): 京ICP備2022022245號(hào)-21