在Linux中,我們知道可以通過nice、renice命令改變進程的執行優先順序,優先順序高的進程優先執行,從而一定程度上保證重要任務的運行。
除了nice、renice外,可以通過CPU affinity指定進程在哪些處理器上運行。CPU affinity表示進程要在某個給定的 CPU 上盡量長時間地運行而不被遷移到其他處理器的傾向性。
2.6 版本的Linux核心,實現了CPU affinity的介面,
需要說明的說:應用程式顯示指定了CPU affinity的話,表示應用程式只會在指定的處理器上運行,就算其他處理器空閑,也不會切換到別的處理器上運行。
以下兩種情況有可能需要使用自訂進程CPU affinity:
1. 保證高優先順序任務
如有存在一些優先順序高的任務,可以將其他任務都分配到指定的處理器執行,這個高優先順序任務設定CPU affinity到其他處理器,避免非重要任務對高優先順序任務的幹擾。
一個比較好的case是,在分散式運算系統中,在淩晨常常會進行一些資料/索引merge或者導資料的工作,為了避免對服務進程的影響,可以將這些任務都放到一個處理器上執行
2. 測試複雜程式
對於號稱scale out的程式,在資源受限的情況下進行測試,可以通過定義進程的cpu affinity,逐步測試在提供不同數量處理器的情況下,程式的處理能力!
linux下可以通過taskset(需安裝schedutils)顯示指定進程的cpu affinity
taskset功能如下:
$ taskset -help
Usage: taskset [options] [mask | cpu-list] [pid|cmd [args...]]
Options:
-a, --all-tasks operate on all the tasks (threads) for a given pid
-p, --pid operate on existing given pid
-c, --cpu-list display and specify cpus in list format
......
執行個體:
編寫一個簡單的C程式(讓CPU忙起來即可):
#include <stdio.h>void main(int argc, char** argv){ for(int i = 0; i<=10000000000000; i++) { if(i == 100000000) { i = 0; printf("program is running!\n"); } }}
產生可執行檔:gcc -o test test.c -std=c99
啟動兩個執行個體,將進程都綁定到Cpu0:
taskset -c 0 ./test
taskset -c 0 ./test
通過top, 輸入“1”查看系統cpu狀況:
:
Cpu1空閑,Cpu0使用100%
繼續測試,將pid為18057的test遷移到CPU1上運行,執行:
$ taskset -pc 1 18057
pid 18057's current affinity list: 0
pid 18057's new affinity list: 1
觀察CPU狀況:
:
Cpu0及Cpu1都進入忙碌狀態了!
繼續測試!將pid為18210的test也遷移到Cpu1上運行,執行:
:
Cpu0閑著,Cpu1忙碌起來了!
Reference:
Processor affinity
管理處理器的親和性
榨乾伺服器:讓進程運行在指定的CPU