The following script which is a starting point for investigating willmove all the processes to a specific cpuset with one cpu.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
if [ ! -d /sys/fs/cgroup ]then
echo "cgroup not supported by the kernel"
else
mkdir /sys/fs/cgroup/cpuset
mount -t cgroup -ocpuset cpuset /sys/fs/cgroup/cpuset
echo 1 >/sys/fs/cgroup/cpuset/cgroup.clone_children
mkdir /sys/fs/cgroup/cpuset/cpu0
mkdir /sys/fs/cgroup/cpuset/cpu1
# assign a cpu for cgroup cpu0
echo 0 >/sys/fs/cgroup/cpuset/cpu0/cpuset.cpus
# move outself to this new cgroup
echo $$ >/sys/fs/cgroup/cpuset/cpu0/tasks
for i in $(cat /sys/fs/cgroup/cpuset/tasks)do
echo $i >/sys/fs/cgroup/cpuset/cpu0/tasks || echo "failed to add pid $i/$(cat /proc/$i/comm)"
done
# assign a cpu for cgroup cpu1
echo 1 >/sys/fs/cgroup/cpuset/cpu1/cpuset.cpus
# make cpu1 exclusive so processes belonging
# to the other cgroup won't use it
echo 1 >/sys/fs/cgroup/cpuset/cpu1/cpuset.cpu_exclusive
fi
把系统中的进程与CPU0绑定,然后把CPU1设置 exclusive属性,这样其它cgroup不会使用这个CPU。
开启stress压力测试
在此基础上再开启一个CPUhot:
可见新启动的任务不会占用CPU1。
将CPUhot进程与 CPU1绑定:
此时观察CPU使用率:
另外还有一个问题就是怎样禁止一个中断打断cpu?
内核提供了中断的affinity,但要使用这个还需要关闭 irq balancer 进程。
如下脚本可以设置中断的cpu affinity。
for i in $(find /proc/irq -name "smp_affinity")do echo 1 >$idone
以上脚本把所有中断的CPU Affinity都设置为CPU0。
这样在/proc/irq目录下的每一个中断其CPU Affinity都被设置为CPU0。
此时仍有一系列的中断会打断CPU1:
Single function call interrupts
Local timer interrupts
另外要让中断的CPU Affinity起作用,irq balance 服务必须被关闭。但这样中断负载平衡就被打断,能不能修改irq balance 代码,让其在规定的若干个CPU核心上负责中断平衡
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)