用 htop 航行大數據海洋 — 船長的 CPU 與記憶體監控筆記


分類:Spark 航行日誌 / 系統監控基礎
前言
啟航前,船長一定會檢查引擎狀態與油箱油量。
對我們做 Spark 和大數據分析的人來說,啟航前的檢查,就是先了解 CPU 與記憶體 的情況,確保運算全速前進時,不會中途熄火。
這篇文章會用 htop
這個工具,帶你看懂 CPU、記憶體與系統負載的狀態,並用「廚房模式」的生活化比喻,讓你一眼就能判斷機器的健康度。
什麼是 htop?
htop
是 Linux 下的互動式系統監控工具,比傳統的 top
更直觀:
顏色化顯示 CPU / 記憶體使用情況
即時更新且可互動排序
支援同時顯示多核心的狀態(對多執行緒運算特別好用)
傳統的top
新的htop
htop 介面解讀 — 廚房模式對照表
htop 項目 | 技術意義 | 廚房比喻 |
CPU 條 | 每個邏輯核心(含 HT)使用率與狀態顏色 | 爐台火力條 |
Mem | 記憶體使用狀況 | 冰箱食材容量 |
Swp | Swap 使用量 | 後巷倉庫 |
Tasks | 進程與執行緒數 | 廚師與助手人數 |
Load Average | 系統平均負載 | 廚房排班壓力 |
Uptime | 系統運行時間 | 廚房營業時間 |
1. CPU 條 → 爐台火力條
技術解釋:
每條代表一個邏輯核心
- 1 到 8 代表這台機器有 8 個邏輯 CPU 核心(可能是 4 核心 + HT*,或 8 核心)
顏色代表狀態:
綠色:使用者程式(例如 Spark 任務)
紅色:系統核心(作業系統運作)
藍色:低優先序工作
HT(Hyper-Threading)補充:
Intel 的技術,讓一個實體核心模擬成兩個邏輯核心,提升多工效能。
例如 4 核心 + HT → 系統顯示 8 核心。
提升幅度通常 20~30%,視工作負載而定。
廚房比喻:
爐台的火力條顯示廚師在煮菜(綠)、廚房管理員在安排流程(紅)、助手在慢工出菜(藍)。
HT 就像讓每個爐台同時能煮兩鍋菜,但速度提升有限。
2. Mem → 冰箱食材容量
技術解釋:
顯示記憶體總量與已使用量。
記憶體不足會啟用 Swap(速度慢)。
廚房比喻:
- 冰箱存放食材,如果快滿,就得跑去後巷倉庫拿貨,耗時耗力。
3. Swp → 後巷倉庫
技術解釋:
用磁碟模擬記憶體,速度遠比 RAM 慢。
0 代表沒用到,屬於健康狀態。
廚房比喻:
- 倉庫很遠,去一次浪費很多時間,最好不要動用。
4. Tasks → 廚師與助手人數
技術解釋:
顯示當前進程數與執行緒數。
Spark 任務通常會啟動大量執行緒。
廚房比喻:
- 廚房有多少廚師(進程)與助手(執行緒)在忙,如果爐台不夠,就得排隊。
5. Load Average → 廚房排班壓力
技術解釋:
三個數字代表系統在不同時間範圍內的平均運算負載:
第一個數字:1 分鐘平均負載(最近的瞬時壓力)
第二個數字:5 分鐘平均負載(短期趨勢)
第三個數字:15 分鐘平均負載(長期趨勢)
解讀方式
有 8 個邏輯核心 → 數字 = 核心數 時代表 CPU 完全滿載
如果 Load Average \> 核心數 → 表示有任務在等待 CPU(排隊中)
廚房比喻
- 如果廚房有 8 個爐台(核心),但排班表上同時有 15 位廚師要用爐台,就會有人等
6. Uptime → 廚房營業時間
技術解釋:
- 系統自開機到現在的運行時間。
廚房比喻:
- 餐廳今天開門到現在的營業時長。
Spark 實戰例子 — CPU 滿載觀察
這張圖顯示的是 Spark 執行時 CPU 幾乎被「吃滿」的狀況:
CPU 使用率
1 到 8 代表這台機器有 8 個邏輯 CPU 核心(可能是 4 核心 + HT*,或 8 核心)。
幾乎每個核心都在 98%~99% 使用率(紅色表示接近滿載),這說明 Spark 任務是 CPU 密集型的。
廚房比喻:廚房有 8 個爐台(邏輯核心),幾乎每個爐台火力都全開在煮菜,表示這場宴會是非常耗火力的工作。
記憶體(Mem/Memory)
19.7G / 30.7G 表示已使用約 64% 記憶體,還有一些剩餘空間,但 Spark 任務大多會吃更多記憶體,如果 dataset 很大,可能會觸發 GC 或 spill 到磁碟。
廚房比喻:冰箱容量是 30.7G,現在放了約 64% 的食材,還有空間,但如果來更多客人(大 dataset),可能要趕緊清冰箱或暫時把食材放到其他地方(磁碟)。
Swap
0K/0K 表示沒有啟用 Swap(或 Swap 空間為 0),所以記憶體不足時不會自動用磁碟緩衝,會直接 OOM。
廚房比喻:後巷倉庫完全沒啟用,一旦冰箱爆滿,就沒有臨時倉庫可用,廚房可能直接停擺(OOM)。
Load Average*
17.82(1 分鐘)、12.72(5 分鐘)、7.33(15 分鐘)
1 分鐘:17.82 → 幾乎是 2 倍於核心數 (8),CPU 過載嚴重,很多任務在等
5 分鐘:12.72 → 最近幾分鐘也一直是高負載
15 分鐘:7.33 → 長期負載接近滿載,但還沒到排隊很多的程度
在 8 核 CPU 上,Load Average 如果超過 8,就代表系統任務排隊中,CPU 壓力很大。現在 1 分鐘的 load 是 15.52,表示有不少任務在等 CPU。
廚房比喻
1 分鐘:17.82
- 就像廚房只有 8 個爐台,但這一分鐘突然有 17 位廚師同時要用爐台,超過兩倍滿載,廚師們只能在旁邊乾等,現場非常擁擠。
5 分鐘:12.72
- 過去 5 分鐘,廚房一直保持「人比爐台多」的狀態,雖然沒有像 1 分鐘前那麼誇張,但依舊有不少廚師在排隊。
15 分鐘:7.33
- 長期來看,廚房幾乎一直在滿載工作(爐台幾乎沒空過),但廚師排隊的情況沒有短期那麼嚴重,算是穩定的高壓運作。
任務數
Tasks: 12, 346 thr; 5 running
12 個進程(process),總共有 346 個執行緒(threads),其中有 5 個在同時執行。Spark Executor 通常會開很多執行緒處理 task。
廚房比喻:廚房裡有 12 位廚師(進程)和 346 位助手(執行緒)忙著各種工作,其中 5 位廚師正在爐台上全力煮菜。
小結:
此時的 Spark Job 是 CPU 滿載 + 高 Load 的狀態,說明計算很密集,可能需要:
調整 Spark 的
executor-cores
或num-executors
,讓資源利用更均衡如果 CPU 長期滿載導致任務等待,可考慮加機器或改用更快的演算法
留意記憶體使用,避免溢出
CPU 長期 100% 的影響與對策
影響:
互動延遲增加(SSH、系統回應變慢)
溫度過高可能降頻(Thermal Throttling)
Spark 任務排隊變長
對策:
監控溫度(<85°C)
留 1~2 核心給系統
適度調整
executor-cores
、num-executors
長任務建議 checkpoint、中繼輸出
使用
tmux
/screen
避免斷線中斷任務
航行提醒
如果沒有其他重要任務,CPU 長時間 100% 是可以的,只要:
溫度安全
記憶體不逼頂(或有適當 Swap)
磁碟空間與 I/O 正常
系統可互動
小結
在啟航之前,船長必須清楚掌握廚房與引擎的即時狀態。
透過 htop
,我們能:
看見爐台(CPU)是否滿載或閒置
判斷冰箱(記憶體)是否還有足夠食材
確認後巷倉庫(Swap)有沒有被動用
觀察廚房排班(Load Average)是否過於擁擠
這些觀察讓我們在跑 Spark 或任何大數據任務時,能提前發現資源瓶頸,避免「航行到一半停船」的尷尬。
下一篇,我們會走進船艙的食材倉庫,用 vmstat
檢查「食材供應」——也就是硬碟與 I/O 狀態,確保船隊在大數據海洋上能長時間高速航行。
Subscribe to my newsletter
Read articles from Captain Milktea 奶茶船長 directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by

Captain Milktea 奶茶船長
Captain Milktea 奶茶船長
🌊 嗨,我是奶茶船長 Captain Milktea 一手握著奶茶,一手拿著好奇心的羅盤,在數據的海洋中航行。 從 Python、Spark 到 AI,我探索各種 dataset,尋找隱藏的 patterns,並繪製專屬的資料航海圖。 這裡是我的個人航海日誌(Captain’s Log),記錄從港灣邊的小實驗到穿越數據風暴的遠航。 無論你是資料探索的同好,還是路過的旅人,都歡迎登船—— 一起航向未知。 Sail into the unknown, one insight at a time.