isolcpus在樹莓派3上的使用
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。