共計 2890 個字符,預計需要花費 8 分鐘才能閱讀完成。
線上服務器 CPU 飆升,如何定位到 Java 代碼
解決這個問題的關鍵是要找到 Java 代碼的位置。下面分享一下排查思路,以 CentOS 為例,總結為 4 步。
第 1 步,使用 top 命令找到占用 CPU 高的進程。
第 2 步,使用 ps –mp 命令找到進程下占用 CPU 高的線程 ID。
第 3 步,使用 printf 命令將線程 ID 轉換成十六進制數。
第 4 步,使用 jstack 命令輸出線程運行狀態的日志信息。
下面詳細介紹每一步的操作。
第 1 步,在使用 top命令 之后,可以看到一個列表,其中包含 PID(進程 ID)、USER(操作用戶)、CPU 占用率、內存占用率、TIME+(運行時間)、COMMAND(運行命令)等信息。一般默認按 CPU 占用率從上到下降序排列,如下圖所示。
我們找到 COMMAND 列是 java 的這一行,說明這個程序就是用 Java 編寫的。然后,用記事本記下這一行的 PID,也就是進程 ID。
第 2 步,使用 ps -mp 命令,輸出這個 PID 下面的線程運行情況列表,如下圖所示。
在這個列表中包含了幾個關鍵字段,比如 CPU 占用率、TID(線程 ID)、TIME(運行時間)等。在這個列表中找到 CPU 占用最高的線程,記下 TID,也就是線程 ID。
前面記下的 TID 是一個十進制數,不能直接使用,需要轉化為十六進制數。
第 3 步,使用 printf 命令 將 TID 轉換為十六進制數,如下圖所示。
這樣就得到了真正占用 CPU 過高的線程 ID。
?第 4 步,使用 jstack 命令 輸出線程的具體運行日志,如下圖所示。
jstack PID | grep TID -A60 >> error_log.txt
面試點評:從這個問題來看,面試官主要考查求職者的實操能力,以及解決問題的思路。如果求職者沒有實操過,但是知道導致 CPU 飆升的原因,并說出解決思路,那么通過面試是沒問題的。
生產環境服務器變慢,如何診斷處理
生產環境服務器變慢主要涉及 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 性能。
面試點評:這個問 題涉及 的知識面比較多,如果只是 站在 求職 者的角度來 分析,則可以這樣回答 。 如果你 沒有實際解決過類似問題,則 可以說一下自己的思路 , 只要大體思路和方向是對的,那 么在遇到類似問題的時候,可以利用網絡上的資料去逐步嘗試解決。
線上接口負載劇增,快扛不住了,你的首選方案是什么
面試點評:這個問題考查的是求職者的臨場應變能力,有相關經驗的程序員回答這個問題并不困難。在回答這個問題的時候,可以分兩種情況:一種是臨時解決方案,就是加服務器;另一種就是增加緩存,但是涉及修改代碼,會增加程序不穩定的風險。
親愛的程序員求職者們,相信你們一定深有體會,求職面試這條路有多難走。
Java 基礎知識,多線程,并發編程,集合原理,JVM 原理……啊!別跟我提這些!面試官一下子拿著這些知識點就沖你扔過來,還有那魔幻的 Java 框架,你要是不懂 Spring 全家桶、Dubbo、Netty、MyBatis 等,就別想踏進這個行業的大門。沒錯,Java 領域可是卷得一塌糊涂啊。