目錄
2、檢查思路" >2、檢查思路
##2.1 定位高負載程序 pid" >##2.1 定位高負載程序 pid
2.2 定位具體的例外業務" >2.2 定位具體的例外業務
2.3 定位例外執行緒及具體程式碼行" >2.3 定位例外執行緒及具體程式碼行
3、根因分析" >3、根因分析
4、解決方案" >4、解決方案
5、總結" >5、總結
首頁 系統教程 Linux 我去,Linux 系統 CPU 100% 打滿了!

我去,Linux 系統 CPU 100% 打滿了!

Feb 13, 2024 pm 11:27 PM
linux linux教程 linux系統 linux指令 shell腳本 嵌入式linux linux入門 linux學習

昨天下午,我突然收到了維運部門的郵件警報,顯示資料平台伺服器的CPU利用率高達98.94%。最近一段時間,這個利用率持續在70%以上。乍一看,似乎是硬體資源到達了瓶頸,需要擴容。但仔細思考後,我發現我們的業務系統並不是一個高並發或CPU密集的應用。這個利用率實在太誇張了,硬體瓶頸不可能這麼快就到達。肯定是某處的業務代碼邏輯出現了問題。

2、檢查思路

##2.1 定位高負載程序 pid

先登入伺服器使用top指令確認伺服器的具體情況,根據具體情況再進行分析判斷。

我去,Linux 系统 CPU 100% 打满了!

透過觀察load average,以及負載評判標準(8核心),可以確認伺服器存在負載較高的情況;

我去,Linux 系统 CPU 100% 打满了!

觀察各個進程資源使用情況,可以看出進程id為682的進程,有著較高的CPU佔比

2.2 定位具體的例外業務

這裡咱們可以使用 pwdx 指令根據 pid 找到業務進程路徑,進而定位到負責人和專案:

我去,Linux 系统 CPU 100% 打满了!

可下結論:此進程對應的就是資料平台的web服務。

2.3 定位例外執行緒及具體程式碼行

傳統的方案一般是4步驟:

1、top oder by with P:1040 // 先依行程負載排序找到 maxLoad(pid)

2、top -Hp 進程PID:1073 // 找到相關負載 執行緒PID

3、printf “0x%x ”線程PID: 0x431 // 將線程PID轉換為 16進制,為後面查找 jstack 日誌做準備

4、jstack 程序PID | vim /十六進位執行緒PID – // 例如:jstack 1040|vim /0x431 –

但對於線上問題定位來說,分秒必爭,上面的4 步還是太繁瑣耗時了,之前介紹過淘寶的oldratlee 同學就將上面的流程封裝為了一個工具:show-busy-java-threads. sh,可以很方便的定位線上的這類問題:

我去,Linux 系统 CPU 100% 打满了!

可下結論:是系統中一個時間工具類別方法的執行cpu佔比較高,定位到具體方法後,查看程式碼邏輯是否有效能問題。

※ 如果線上問題比較緊急,可以省略 2.1、2.2 直接執行 2.3,這裡從多角度剖析只是為了給大家呈現一個完整的分析思路。

3、根因分析

#經過前面的分析與排查,最後定位到一個時間工具類別的問題,造成了伺服器負載以及cpu使用率的過高。

  • 異常方法邏輯:是把時間戳轉成對應的具體的日期時間格式;
  • 上層呼叫:計算當天凌晨至目前時間所有秒數,轉換成對應的格式放入到set中傳回結果;
  • 邏輯層:對應的是資料平台即時報表的查詢邏輯,即時報表會按照固定的時間間隔來,並且在一次查詢中有多次(n次)方法呼叫。

那麼可以得到結論,如果現在時間是當天上午10點,一次查詢的計算次數就是106060n次=36,000n次計算,而且隨著時間成長,越接近午夜單次查詢次數會線性增加。由於即時查詢、即時警報等模組大量的查詢請求都需要多次呼叫該方法,導致了大量CPU資源的佔用與浪費。

4、解決方案

定位到問題之後,首先考慮是要減少計算次數,優化異常方法。排查後發現,在邏輯層使用時,並沒有使用此方法傳回的set集合中的內容,而是簡單的用set的size數值。確認邏輯後,透過新方法簡化計算(當前秒數-當天凌晨的秒數),取代呼叫的方法,解決計算過多的問題。上線後觀察伺服器負載和cpu使用率,對比異常時間段下降了30倍,恢復至正常狀態,至此問題得已解決。

![昨天下午,我突然收到了維運部門的郵件警報,顯示數據平台伺服器的CPU利用率高達98.94%。最近一段時間,這個利用率持續在70%以上。乍一看,似乎是硬體資源到達了瓶頸,需要擴容。但仔細思考後,我發現我們的業務系統並不是一個高並發或CPU密集的應用。這個利用率實在太誇張了,硬體瓶頸不可能這麼快就到達。肯定是某處的業務代碼邏輯出現了問題。

2、檢查思路

##2.1 定位高負載程序 pid

先登入伺服器使用top指令確認伺服器的具體情況,根據具體情況再進行分析判斷。

我去,Linux 系统 CPU 100% 打满了!

透過觀察load average,以及負載評判標準(8核心),可以確認伺服器存在負載較高的情況;

我去,Linux 系统 CPU 100% 打满了!

觀察各個進程資源使用情況,可以看出進程id為682的進程,有著較高的CPU佔比

2.2 定位具體的例外業務

這裡咱們可以使用 pwdx 指令根據 pid 找到業務進程路徑,進而定位到負責人和專案:

我去,Linux 系统 CPU 100% 打满了!

可下結論:此進程對應的就是資料平台的web服務。

2.3 定位例外執行緒及具體程式碼行

傳統的方案一般是4步驟:

1、top oder by with P:1040 // 先依行程負載排序找到 maxLoad(pid)

2、top -Hp 進程PID:1073 // 找到相關負載 執行緒PID

3、printf “0x%x ”線程PID: 0x431 // 將線程PID轉換為 16進制,為後面查找 jstack 日誌做準備

4、jstack 程序PID | vim /十六進位執行緒PID – // 例如:jstack 1040|vim /0x431 –

但對於線上問題定位來說,分秒必爭,上面的4 步還是太繁瑣耗時了,之前介紹過淘寶的oldratlee 同學就將上面的流程封裝為了一個工具:show-busy-java-threads. sh,可以很方便的定位線上的這類問題:

我去,Linux 系统 CPU 100% 打满了!

可下結論:是系統中一個時間工具類別方法的執行cpu佔比較高,定位到具體方法後,查看程式碼邏輯是否有效能問題。

※ 如果線上問題比較緊急,可以省略 2.1、2.2 直接執行 2.3,這裡從多角度剖析只是為了給大家呈現一個完整的分析思路。

3、根因分析

#經過前面的分析與排查,最後定位到一個時間工具類別的問題,造成了伺服器負載以及cpu使用率的過高。

  • 異常方法邏輯:是把時間戳轉成對應的具體的日期時間格式;
  • 上層呼叫:計算當天凌晨至目前時間所有秒數,轉換成對應的格式放入到set中傳回結果;
  • 邏輯層:對應的是資料平台即時報表的查詢邏輯,即時報表會按照固定的時間間隔來,並且在一次查詢中有多次(n次)方法呼叫。

那麼可以得到結論,如果現在時間是當天上午10點,一次查詢的計算次數就是106060n次=36,000n次計算,而且隨著時間成長,越接近午夜單次查詢次數會線性增加。由於即時查詢、即時警報等模組大量的查詢請求都需要多次呼叫該方法,導致了大量CPU資源的佔用與浪費。

4、解決方案

定位到問題之後,首先考慮是要減少計算次數,優化異常方法。排查後發現,在邏輯層使用時,並沒有使用此方法傳回的set集合中的內容,而是簡單的用set的size數值。確認邏輯後,透過新方法簡化計算(當前秒數-當天凌晨的秒數),取代呼叫的方法,解決計算過多的問題。上線後觀察伺服器負載和cpu使用率,對比異常時間段下降了30倍,恢復至正常狀態,至此問題得已解決。

我去,Linux 系统 CPU 100% 打满了!

5、總結

  • # 在編碼的過程中,除了實現業務的邏輯,也要注重程式碼效能的最佳化。一個業務需求,能實現,和能實現的更有效率、更優雅其實是兩種截然不同的工程師能力和境界的體現,而後者也是工程師的核心競爭力。
  • 在程式碼寫完成之後,多做 review,多思考是不是可以用更好的方式來實現。
  • 線上問題不放過任何一個小細節!細節是魔鬼,技術的同學需要有刨根問題的求知慾和追求卓越的精神,只有這樣,才能不斷的成長和提升。

以上是我去,Linux 系統 CPU 100% 打滿了!的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

vscode需要什麼電腦配置 vscode需要什麼電腦配置 Apr 15, 2025 pm 09:48 PM

VS Code 系統要求:操作系統:Windows 10 及以上、macOS 10.12 及以上、Linux 發行版處理器:最低 1.6 GHz,推薦 2.0 GHz 及以上內存:最低 512 MB,推薦 4 GB 及以上存儲空間:最低 250 MB,推薦 1 GB 及以上其他要求:穩定網絡連接,Xorg/Wayland(Linux)

Linux體系結構:揭示5個基本組件 Linux體系結構:揭示5個基本組件 Apr 20, 2025 am 12:04 AM

Linux系統的五個基本組件是:1.內核,2.系統庫,3.系統實用程序,4.圖形用戶界面,5.應用程序。內核管理硬件資源,系統庫提供預編譯函數,系統實用程序用於系統管理,GUI提供可視化交互,應用程序利用這些組件實現功能。

notepad怎麼運行java代碼 notepad怎麼運行java代碼 Apr 16, 2025 pm 07:39 PM

雖然 Notepad 無法直接運行 Java 代碼,但可以通過借助其他工具實現:使用命令行編譯器 (javac) 編譯代碼,生成字節碼文件 (filename.class)。使用 Java 解釋器 (java) 解釋字節碼,執行代碼並輸出結果。

vscode 無法安裝擴展 vscode 無法安裝擴展 Apr 15, 2025 pm 07:18 PM

VS Code擴展安裝失敗的原因可能包括:網絡不穩定、權限不足、系統兼容性問題、VS Code版本過舊、殺毒軟件或防火牆干擾。通過檢查網絡連接、權限、日誌文件、更新VS Code、禁用安全軟件以及重啟VS Code或計算機,可以逐步排查和解決問題。

vscode 可以用於 mac 嗎 vscode 可以用於 mac 嗎 Apr 15, 2025 pm 07:36 PM

VS Code 可以在 Mac 上使用。它具有強大的擴展功能、Git 集成、終端和調試器,同時還提供了豐富的設置選項。但是,對於特別大型項目或專業性較強的開發,VS Code 可能會有性能或功能限制。

git怎麼查看倉庫地址 git怎麼查看倉庫地址 Apr 17, 2025 pm 01:54 PM

要查看 Git 倉庫地址,請執行以下步驟:1. 打開命令行並導航到倉庫目錄;2. 運行 "git remote -v" 命令;3. 查看輸出中的倉庫名稱及其相應的地址。

VSCode怎麼用 VSCode怎麼用 Apr 15, 2025 pm 11:21 PM

Visual Studio Code (VSCode) 是一款跨平台、開源且免費的代碼編輯器,由微軟開發。它以輕量、可擴展性和對眾多編程語言的支持而著稱。要安裝 VSCode,請訪問官方網站下載並運行安裝程序。使用 VSCode 時,可以創建新項目、編輯代碼、調試代碼、導航項目、擴展 VSCode 和管理設置。 VSCode 適用於 Windows、macOS 和 Linux,支持多種編程語言,並通過 Marketplace 提供各種擴展。它的優勢包括輕量、可擴展性、廣泛的語言支持、豐富的功能和版

vscode終端使用教程 vscode終端使用教程 Apr 15, 2025 pm 10:09 PM

vscode 內置終端是一個開發工具,允許在編輯器內運行命令和腳本,以簡化開發流程。如何使用 vscode 終端:通過快捷鍵 (Ctrl/Cmd ) 打開終端。輸入命令或運行腳本。使用熱鍵 (如 Ctrl L 清除終端)。更改工作目錄 (如 cd 命令)。高級功能包括調試模式、代碼片段自動補全和交互式命令歷史。

See all articles