2025年1月7日 星期二

Linux Tool, taskset 可以用來限制程式,只去使用特定 CPU

 Linux 當中有個Tool,叫做 taskset,可以限制某個Daemon只跑在規定的CPU編號之下,這邊會先簡單介紹 taskset使用方式,不免俗的,最後會附上一個實際操作

首先簡單寫一個 while迴圈,打印test的字樣,但不顯示在螢幕上,這支來當我們的Daemon,並且使用以下command,讓他在背景執行
=> sh loop_test.sh &
======= loop_test.sh 小程式 =========
#!/bin/sh
while [ 1 ]
do
   echo "test" > /dev/null
done



======= 使用方式 =======

首先我們可以用以下的指令,來得知目前設備的 CPU核心數目
=> cat /proc/cpuinfo

查詢目前的 Daemon,所配置的 CPU編號,這有兩種查詢方式
1. 直接列出,此Daemon使用的CPU編號,這邊Daemon的 PID=5622 (ps -aux | grep loop_test.sh)
=>
root:~# taskset -cp 5622
pid 5622's current affinity list: 0,1

2. 以mask方式列出,此Daemon使用的CPU編號,這邊Daemon的 PID=5622
=>
root:~# taskset -p 5622
pid 5622's current affinity mask: 3

這邊的3,為Hex,需要把他換成二進制來解讀,所以為 0x11,表示CPU0,CPU1目前會讓此Daemon使用(如果CPU為8 core,得到的數值為FF(hex),則表示 CPU0~7都會分配)


======= 使用方式 & 實驗 =======
設置目前的 Daemon,只分配CPU1 來做

=>
root:~# taskset -cp 1 5622
pid 5622's current affinity list: 0,1
pid 5622's new affinity list: 1

"top -d 1" 觀察一下cpu 與 process 狀態

=> 可以看到 CPU1 的 idle為0%,loop_test.sh 把整個CPU1用盡了,而CPU0是完全閒置的











這時候,我們再使用指令把 loop_test.sh 平均分配給 CPU0 & CPU1
=>
root@auto2735evb-ivt-vp2:~# taskset -cp 0,1 5622
pid 5622's current affinity list: 1
pid 5622's new affinity list: 0,1

"top -d 1" 觀察一下cpu 與 process 狀態
=> 可以看到 CPU0與CPU1,都有分配給 loop_test.sh使用



沒有留言:

張貼留言