1. 程式人生 > >Linux CPU affinity指定程式執行CU

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忙起來即可):

  1. #include <stdio.h>
  2. void main(int argc, char** argv)  
  3. {  
  4.         for(int i = 0; i<=10000000000000; i++)  
  5.         {  
  6.                 if(i == 100000000)  
  7.                 {  
  8.                         i = 0;  
  9.                         printf("program is running!\n");  
  10.                 }  
  11.         }  
  12. }  
生成可執行檔案: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:

原文地址:http://blog.csdn.net/yfkiss/article/details/7464968