判斷 Linux 程式執行在哪個 CPU 核心上的 4 個方法

linux.cn發表於2015-09-29

問題:我有個 Linux 程式執行在多核處理器系統上。怎樣才能找出哪個 CPU 核心正在執行該程式?

Linux 有問必答:如何知道程式執行在哪個 CPU 核心上?

當你在 多核 NUMA 處理器上執行需要較高效能的 HPC(高效能運算)程式或非常消耗網路資源的程式時,CPU/memory 的親和力是限度其發揮最大效能的重要因素之一。在同一 NUMA 節點上排程最相關的程式可以減少緩慢的遠端記憶體訪問。像英特爾 Sandy Bridge 處理器,該處理器有一個整合的 PCIe 控制器,你可以在同一 NUMA 節點上排程網路 I/O 負載(如網路卡)來突破 PCI 到 CPU 親和力限制。

作為效能優化和故障排除的一部分,你可能想知道特定的程式被排程到哪個 CPU 核心(或 NUMA 節點)上執行。

這裡有幾種方法可以 找出哪個 CPU 核心被排程來執行給定的 Linux 程式或執行緒

方法一

如果一個程式使用 taskset 命令明確的被固定(pinned)到 CPU 的特定核心上,你可以使用 taskset 命令找出被固定的 CPU 核心:

$ taskset -c -p <pid>

例如, 如果你對 PID 5357 這個程式有興趣:

$ taskset -c -p 5357
pid 5357's current affinity list: 5

輸出顯示這個過程被固定在 CPU 核心 5上。

但是,如果你沒有明確固定程式到任何 CPU 核心,你會得到類似下面的親和力列表。

pid 5357's current affinity list: 0-11

輸出表明該程式可能會被安排在從0到11中的任何一個 CPU 核心。在這種情況下,taskset 不能識別該程式當前被分配給哪個 CPU 核心,你應該使用如下所述的方法。

方法二

ps 命令可以告訴你每個程式/執行緒目前分配到的 (在“PSR”列)CPU ID。

$ ps -o pid,psr,comm -p <pid>
  PID PSR COMMAND
 5357  10 prog

輸出表示程式的 PID 為 5357(名為”prog”)目前在CPU 核心 10 上執行著。如果該過程沒有被固定,PSR 列會根據核心可能排程該程式到不同核心而改變顯示。

方法三

top 命令也可以顯示 CPU 被分配給哪個程式。首先,在top 命令中使用“P”選項。然後按“f”鍵,顯示中會出現 “Last used CPU” 列。目前使用的 CPU 核心將出現在 “P”(或“PSR”)列下。

$ top -p 5357

Linux 有問必答:如何知道程式執行在哪個 CPU 核心上?

相比於 ps 命令,使用 top 命令的好處是,你可以連續監視隨著時間的改變, CPU 是如何分配的。

方法四

另一種來檢查一個程式/執行緒當前使用的是哪個 CPU 核心的方法是使用 htop 命令。

從命令列啟動 htop。按 鍵,進入”Columns”,在”Available Columns”下會新增 PROCESSOR。

每個程式當前使用的 CPU ID 將出現在“CPU”列中。

Linux 有問必答:如何知道程式執行在哪個 CPU 核心上?

請注意,所有以前使用的命令 taskset,ps 和 top 分配CPU 核心的 IDs 為 0,1,2,…,N-1。然而,htop 分配 CPU 核心 IDs 從 1開始(直到 N)。

相關文章