在 Linux 系統管理與效能調校中,準確掌握 CPU 的物理封裝數、核心數以及邏輯處理器數量至關重要。本文將系統性整理從 C 語言 API 到 Shell 指令的多種判斷方法,並透過實際 /proc/cpuinfo 輸出範例,示範如何識別超執行緒(Hyper-Threading)與多核心架構。
最簡單的方法是呼叫 sysconf:
#include <unistd.h>
long num = sysconf(_SC_NPROCESSORS_ONLN);
回傳值即為目前系統上線的邏輯 CPU 數量。
/proc/cpuinfo 中有兩個關鍵欄位:
physical id 表示屬於同一顆實體 CPU 的執行緒或核心。core id 表示為同一核心內的超執行緒。判斷規則總結:
core id 的邏輯 CPU 為同一核心的超執行緒。physical id 的邏輯 CPU 屬於同一實體 CPU 封裝。以下節錄四筆 processor 記錄:
processor : 0 physical id : 0 core id : 0 cpu cores : 1 siblings : 2
processor : 1 physical id : 0 core id : 0 cpu cores : 1 siblings : 2
processor : 2 physical id : 3 core id : 3 cpu cores : 1 siblings : 2
processor : 3 physical id : 3 core id : 3 cpu cores : 1 siblings : 2
分析結果:
physical id 有 0 和 3 兩組 → 2 顆實體 CPU。core id 唯一且 cpu cores = 1 → 單核心。siblings = 2 且同一 core id 出現兩次 → 啟用超執行緒。Intel(R) Xeon(TM) CPU 3.00GHz,無具體型號數字(如 X3230),且快取 2MB,推測為 NetBurst 微架構的 Xeon(Pentium 4 代),效能較弱。| 目的 | 指令 |
|---|---|
| 邏輯 CPU 總數 | cat /proc/cpuinfo | grep 'processor' | wc -l |
| 實體 CPU 顆數 | cat /proc/cpuinfo | grep 'physical id' | sort | uniq | wc -l |
| 每顆實體 CPU 核心數 | cat /proc/cpuinfo | grep 'cpu cores' | uniq |
| 是否啟用超執行緒 | 若存在相同 core id 的多筆記錄即為啟用 |
| 每顆實體 CPU 邏輯處理器數 | cat /proc/cpuinfo | grep 'siblings' | uniq |
model name 會顯示具體型號數字,例如 Intel(R) Xeon(R) CPU X3230 @ 2.66GHz。Intel(R) Xeon(TM) CPU 3.00GHz,無型號數字,快取通常 1~2 MB。model name 無具體數字、快取 1 MB,大多為 Pentium 系列或假雙核。現代核心已完善支援多路平台,以下六個欄位為核心:
processor:邏輯處理器唯一識別碼。physical id:實體封裝唯一識別碼。core id:核心唯一識別碼。siblings:同一實體封裝內的邏輯處理器總數(含超執行緒)。cpu cores:同一實體封裝內的實體核心數。vendor_id:Intel 處理器為 GenuineIntel。判斷邏輯總結:
physical id = 同一實體插槽。siblings = 該封裝邏輯處理器數。core id = 同一核心。physical id 下出現多個相同 core id → 超執行緒啟用。physical id 下 core id 不同 → 多核心處理器。雙實體封裝、每封裝雙核心、每核心雙超執行緒(共 8 邏輯 CPU)的 /proc/cpuinfo 結構示意:
physical id: 0, core id: 0, siblings: 4, cpu cores: 2 (processor 0,1)
physical id: 0, core id: 1, siblings: 4, cpu cores: 2 (processor 2,3)
physical id: 1, core id: 0, siblings: 4, cpu cores: 2 (processor 4,5)
physical id: 1, core id: 1, siblings: 4, cpu cores: 2 (processor 6,7)