Process 與 CPU 基礎指南
Process 與 CPU 基礎指南
1. CPU Time:user / system / real
用 time some_command 執行會看到三個數字:
real 0m2.140s
user 0m1.820s
sys 0m0.300s
- real:牆上時鐘時間,從開始到結束實際經過多久(包含等待 I/O、被其他 process 搶走 CPU 的時間)
- user:CPU 在「使用者模式」執行你程式碼的時間(純運算)
- sys:CPU 在「核心模式」執行的時間(因為你的程式呼叫了系統呼叫,例如讀寫檔案、網路 I/O,核心代替你做事)
怎麼解讀:
user + sys遠小於real→ 你的程式大部分時間在等(等 I/O、等網路、等 lock),不是 CPU bounduser + sys接近real(單核心情況下)→ CPU bound,程式一直在算- 多核心程式:
user + sys可能大於real(因為多個核心平行跑,時間加總起來會超過牆上時間)— 這是正常的,不是 bug
2. Process 生命週期:fork / exec
Linux 建立新 process 幾乎都是這個套路:
fork() → 複製目前的 process(子 process 是父 process 的完整拷貝,包含記憶體)
exec() → 子 process 用新的程式碼「替換」自己(不是再開一個 process)
例如在 shell 打 ls:shell fork 出一個子 process,子 process 再 exec 成 ls 這個程式。這也是為什麼 fork() 之後常常馬上接 exec() — 先複製一份執行環境,再換上真正要跑的程式。
Zombie process:子 process 執行完畢,但父 process 還沒呼叫 wait() 去「收屍」讀取結束狀態,這個子 process 就變成 zombie(ps 裡狀態顯示 Z)。zombie 不佔用記憶體或 CPU,但佔一個 PID,殺不掉(因為它已經死了),只能等父 process 收屍或父 process 自己死掉讓 zombie 被 init/systemd 收養並清掉。
Orphan process:父 process 先死掉,子 process 還活著 → 子 process 被 PID 1(init/systemd)收養。
3. 訊號 (Signals)
SIGTERM(15):預設的kill訊號,禮貌地要求 process 結束——process 可以攔截這個訊號,做清理(存檔、關連線)再退出SIGKILL(9):kill -9,作業系統直接強制終止,process 完全來不及做任何清理SIGHUP(1):原本代表「終端機斷線」,現在常被拿來當作「請重新讀取設定檔」的訊號(很多 daemon 這樣用,例如 nginx)
為什麼 kill -9 有時候會有問題: 如果程式正在寫檔案、持有 lock、或子 process 還沒收拾乾淨,SIGKILL 直接讓它斷氣,這些狀態都來不及清——這就是為什麼資料庫類程式特別怕被 -9。正確做法是先 SIGTERM 給程式機會善終,等幾秒還沒死再 -9(systemd、docker stop 都是這個邏輯)。
4. 常用診斷工具
| 工具 | 用途 |
|---|---|
top / htop |
即時看 CPU、記憶體使用率,htop 互動性更好 |
ps aux |
列出所有 process 的快照(PID、CPU%、MEM%、狀態) |
ps -eLf |
連 thread 也列出來 |
strace -p <pid> |
追蹤某個 process 正在呼叫哪些系統呼叫(診斷「卡住在哪」很有用) |
lsof -p <pid> |
看某個 process 開了哪些檔案 / socket |
/proc/<pid>/status |
直接讀 kernel 暴露的 process 資訊(狀態、記憶體、thread 數) |
/proc/<pid>/ 底下值得知道的幾個檔案:
status— 人類可讀的摘要(State、VmRSS 記憶體用量等)cmdline— 啟動時的完整指令fd/— 這個 process 開了哪些檔案描述符(symlink 指向實際檔案)cwd— 目前工作目錄
5. Scheduler 概念(CFS)
Linux 預設用 CFS (Completely Fair Scheduler):不是固定時間片輪流跑,而是追蹤每個 process「應得的 CPU 時間比例」,誰欠得最多就先排誰上去跑,讓所有 process 長期下來拿到公平的 CPU 份額。
nice值:範圍 -20(最高優先權)到 19(最低),一般使用者只能調高自己 process 的 nice 值(讓自己讓道),要調低(搶更多 CPU)需要 root- 指令:
nice -n 10 some_command(啟動時設定)、renice -n 5 -p <pid>(動態調整已在跑的 process)
延伸閱讀
- Hard Link、Symbolic Link 與 find 指令指南 — 同屬 Linux 系統層知識,inode 是連結 file descriptor 與檔案系統的下一步。
- shell 快捷鍵指南 — 終端機日常操作。
- tmux 常用指南 — 在 tmux pane 中監控 process 與 CPU 使用率很常見的場景。