taskset命令:查看、指定進程運行在哪個cpu上

reference:

https://baijiahao.baidu.com/s?id=1592330790387359245&wfr=spider&for=pc

https://www.cnblogs.com/LubinLew/p/cpu_affinity.html

 

1、CPU親和性(cpu affinity)

CPU affinity 是一種調度屬性(scheduler property), 它可以將一個進程"綁定" 到一個或一組CPU上.

在SMP(Symmetric Multi-Processing對稱多處理)架構下,Linux調度器(scheduler)會根據CPU affinity的設置讓指定的進程運行在"綁定"的CPU上,而不會在別的CPU上運行.

Linux調度器同樣支持自然CPU親和性(natural CPU affinity): 調度器會試圖保持進程在相同的CPU上運行, 這意味着進程通常不會在處理器之間頻繁遷移,進程遷移的頻率小就意味着產生的負載小。

因爲程序的作者比調度器更瞭解程序,所以我們可以手動地爲其分配CPU核,而不會過多地佔用CPU0,或是讓我們關鍵進程和一堆別的進程擠在一起,所有設置CPU親和性可以使某些程序提高性能。

 

CPU affinity 使用位掩碼(bitmask)表示, 每一位都表示一個CPU, 置1表示"綁定"。最低位表示第一個邏輯CPU, 最高位表示最後一個邏輯CPU

CPU affinity典型的表示方法是使用16進制,具體如下.

0x00000001 is processor #0

0x00000003 is processors #0 and #1

0xFFFFFFFF is all processors (#0 through #31)

 

2、爲什麼要指定進程在固定的cpu上運行

由於各個cpu都有自己的緩存,如L1,L2等,程序中的指令在CPU內部,往往通過分支預測,提前放到了流水線上。也就是說,一個進程在cpuA上運行時,其未來要執行的指令往往被cpuA預估了,會把未來要執行的指令提前寫到自己的一、二級緩存中。當進程換到了cpuB運行後,除了cpuA上的之前做的緩存白做之外,還要把這些緩存丟棄以避免不要影響新的進程,而且cpuB爲了提速,還需要重新做一次緩存,即使可以把cpuA的緩存拷貝到cpuB中,這樣在電路間也很麻煩,而且也不能保證兩個cpu之間的緩存規格一樣,萬一大小不同,該怎樣截斷,都是問題,因此不如到了那邊重建。

因此,保證進程在同一個cpu上運行,可減少在cpu之間切換時產生的“原來緩存丟棄與重建新緩存”的損失。

 

3、查看進程運行在哪個邏輯cpu上

ps -eo pid,args,psr

(這裏應該顯示的是該進程中,tid(lwp)和pid相等的那個線程運行在哪個cpu上)

 

4、查看某個進程的每個線程運行在哪個邏輯cpu上

ps -To 'pid,lwp,psr,cmd' -p PID

(同一個進程中,不同線程的lwp是唯一的,但是不同進程之間,可能存在相同的lwp;當一個進程只有一個線程時,pid和lwp總是相同的)

 

5、查看和設置CPU親和性

1) 使用指定的CPU親和性運行一個新程序

 taskset [-c] mask command [arg]...

 舉例:使用CPU0運行ls命令顯示/etc/init.d下的所有內容

   taskset -c 0 ls -al /etc/init.d/

 

2) 顯示已經運行的進程的CPU親和性

taskset -p pid

舉例:查看init進程(PID=1)的CPU親和性

taskset -p 1

 

3) 改變已經運行進程的CPU親和力

taskset -p[c] mask pid

舉例:打開2個終端,在第一個終端運行top命令,第二個終端中

   首先運行:[~]# ps -eo pid,args,psr | grep top #獲取top命令的pid和其所運行的CPU號

   其次運行:[~]# taskset -cp 新的CPU號 pid #更改top命令運行的CPU號

   最後運行:[~]# ps -eo pid,args,psr | grep top #查看是否更改成功

 

mast可以是一個cpu號,也可以是多個

taskset -cp 10 pid (運行在10號cpu上)

taskset -cp 10,12 pid (運行在10和12號cpu上)

taskset -cp 10-12 pid (運行在10\11\12號cpu上)

 

(改變已經啓動的進程的cpu affinity,設置之後不是立刻生效的,似乎要等一小會,十幾秒的樣子?)

(固定在不同的線程也可能會造成性能損失,比如https://stackoverflow.com/questions/39495136/why-settting-cpu-affinity-make-threads-run-slower#中提到的情況)

(此外在我的系統(4.15.0-43-generic #46~16.04.1-Ubuntu SMP)上,還觀察到了這個現象:如果通過taskset啓動進程,該進程的所有線程都是跑在指定cpu上的,如果是啓動之後再用taskset去改,就只有主線程的cpu會固定爲指定cpu

 

另外如果想通過隔離cpu達到更好的cpu控制效果,可以參考https://blog.csdn.net/tang05505622334/article/details/96477552

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章