linux内核参数isolcpus的作用是隔离一定数量的CPU,使其独立于内核的平衡调度算法,也就是内核本身不会将进程分配到被隔离的CPU上运行。之后用户可将指定的进程绑定到被隔离的CPU上运行,让进程独占CPU,使其实时性得到一定程度的提高。
一、参数isolcpus的说明
在linux内核源码linux-4.2.1\Documentation\kernel-parameters.txt中关于isolcpus的作用和使用说明如下:
isolcpus= [KNL,SMP] Isolate CPUs from the general scheduler.
Format:
<cpu number>,...,<cpu number>
or
<cpu number>-<cpu number>
(must be a positive range in ascending order)
or a mixture
<cpu number>,...,<cpu number>-<cpu number>
This option can be used to specify one or more CPUs
to isolate from the general SMP balancing and scheduling
algorithms. You can move a process onto or off an
"isolated" CPU via the CPU affinity syscalls or cpuset.
<cpu number> begins at 0 and the maximum value is
"number of CPUs in system - 1".
二、使用isolcpus隔离cpu
树莓派3B使用的芯片为BCM2837,包含4个ARM Cortex-A53 CPU,在Raspbian操作系统boot\cmdline.txt文件的末尾添加isolcpus=3,隔离第4个cpu:
三、使用cyclictest进行测试
使用cyclictest工具分别对树莓派3B的4个CPU进行实时性行测试。
下载和安装cyclictest:
#git clone git://git.kernel.org/pub/scm/linux/kernel/git/clrkwllms/rt-tests.git
#cd rt-tests
#git checkout testing
#make NUMA=0
在cpu0上运行cyclictest:
#./cyclictest -t1 -p 80 -n -i 1000 -a 0
在cpu1上运行cyclictest:
#./cyclictest -t1 -p 80 -n -i 1000 -a 1
在cpu2上运行cyclictest:
#./cyclictest -t1 -p 80 -n -i 1000 -a 2
在cpu3上运行cyclictest:
#./cyclictest -t1 -p 80 -n -i 1000 -a 3
其中的参数-a 0表示绑定cyclictest到cpu0上运行,类似的-a 1, -a 2 - a3分别表示绑定到cpu1,cpu2,cpu3上运行。
测试结果如下:
从上图可以看出,被隔离的CPU3最大延迟为99us,而没有隔离的CPU0、CPU1和CPU2最大延迟明显偏大。
使用ps命令查看各CPU上的进程个数:
从上图可以看出,CPU0有63个进程,CPU1有98个进程,CPU2有88个进程,而被隔离的CPU3上只有8个进程。
进一步查看CPU3上具体有哪些进程:
可以看出,CPU3上只有少数守护进程和测试程序cyclictest。