2016-11-19 49 views
0

我有一個簡單的單線程應用程序在做幾乎純加工無法完全分配CPU爲我的過程

  1. 它同樣採用了尺寸
  2. 的兩個int緩衝區它讀取一個逐第一緩衝
    • 每個值之一中的所有值是在所述第二緩衝器中的隨機索引
  3. 它讀取在第二緩衝器中的索引處的值
  4. 它總結從第二緩衝器採取的所有值
  5. 它完成了所有的前面的步驟越來越大
  6. 最後,我打印的份數自願和非自願CPU上下文切換

如果緩衝區的大小變得相當大了,我的電腦開始變慢:爲什麼呢?我有4個超線程核心,所以3個核心都是剩餘的。只有一個是百分之百忙碌。是否因爲我的過程幾乎100%用於「RAM總線」?

然後,我創建了一個CPU集,我想獻給我的過程(我的CPU-集包含相同的核心的兩個CPU線程)

$ cat /sys/devices/system/cpu/cpu3/topology/core_id 
3 
$ cat /sys/devices/system/cpu/cpu7/topology/core_id 
3 

$ cset set -c 3,7 -s my_cpuset 
$ cset set -l 
cset: 
     Name  CPUs-X MEMs-X Tasks Subs Path 
------------ ---------- - ------- - ----- ---- ---------- 
     root  0-7 y  0 y 934 1/
    my_cpuset  3,7 n  0 n  0 0 /my_cpuset 

似乎完全沒有任務在所有正在我的CPU集上運行。我可以重新啓動我的程序,它運行時,我啓動:

$ taskset -c 7 ./TestCpuset # Here, I launch my process 
... 
$ ps -mo pid,tid,fname,user,psr -p 25244 # 25244 being the PID of my process 
    PID TID COMMAND USER  PSR 
25244  - TestCpus phil  - 
    - 25244 -  phil  7 

PSR = 7:我的過程是預期的CPU線程上運行良好。我希望這是唯一一個就可以了,但在運行結束,我的過程顯示:

Number of voluntary context switch: 2 
Number of involuntary context switch: 1231 

如果讓我不由自主的上下文切換,這意味着其他進程在我的核心運行:這怎麼可能?我必須做些什麼才能獲得無意識上下文切換的數量= 0?

最後一個問題:當我的進程正在運行,如果我再次推出

$ cset set -l 
cset: 
     Name  CPUs-X MEMs-X Tasks Subs Path 
------------ ---------- - ------- - ----- ---- ---------- 
     root  0-7 y  0 y 1031 1/
    my_cpuset  3,7 n  0 n  0 0 /my_cpuset 

我讓我的CPU設置0的任務。但我知道有一個過程在運行:似乎任務不是一個過程?

回答

0

如果緩衝區的大小變得很大,我的電腦開始變慢:爲什麼?我有4個超線程核心,所以3個核心都是剩餘的。只有一個是百分之百忙碌。是否因爲我的過程幾乎100%用於「RAM總線」?

您達到了單線程應用程序的硬件性能限制,即分配給該程序的單CPU上的CPU時間爲100%。您的應用程序線程一次不會在多個CPU上運行(reference)

我必須做些什麼才能獲得無意識上下文切換次數= 0?

你不缺少cset set命令--cpu_exclusive選項?順便說一下,如果你想實現更低的執行時間,我建議你製作一個多線程應用程序,讓操作系統和硬件在並行化執行之下。將進程鎖定到CPU集並阻止進行上下文切換可能會降低操作系統的性能,並且不是可移植的解決方案。