Linux CPU affinity指定程式執行CU
在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");
- }
- }
- }
啟動兩個例項,將程序都繫結到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:
原文地址:http://blog.csdn.net/yfkiss/article/details/7464968