从用户空间我们可以使用cpuset实际隔离系统中的特定核心,并只执行一个特定的核心进程.
我正在尝试使用内核模块做同样的事情.所以我希望模块在一个孤立的核心中执行.换句话说:我如何cpuset
在内核模块中使用?*
在我的内核模块中使用linux/cpuset.h不起作用.所以,我有一个这样的模块:
#include <linux/module.h>
#include <linux/cpuset.h>
...
#ifdef CONFIG_CPUSETS
printk(KERN_INFO, "cpusets is enabled!");
#endif
cpuset_init(); // this function is declared in cpuset.h
...
Run Code Online (Sandbox Code Playgroud)
尝试加载此模块时,我收到dmesg
以下消息cpusets is enabled!
.但我也收到了这条消息Unknown symbol cpu_init (err 0)
.
类似地,我尝试使用sched_setaffinity
from linux/sched.h
来将所有正在运行的procceses移动到特定的核心,然后将我的模块运行到一个隔离的核心.我得到了相同的错误消息:Unknown symbol sched_setaffinity (err 0)
.我想我得到了"未知符号",因为这些函数EXPORT_SYMBOL
在内核中没有.所以我去尝试调用sys_sched_setaffinity
系统调用(基于这个问题),但又得到了这个消息:Unknown symbol sys_sched_setaffinity (err 0)
!
此外,我不是在寻找一个使用的解决方案isolcpus
,它在启动时设置.我想加载模块,然后发生隔离.
我尝试了cpuset(7)手册中的示例并创建了一个cpuset Charlie.在Ubuntu 14.4 LTS和SLES 12上,我在尝试将当前进程放入cpuset时收到以下错误:
/dev/cpuset/Charlie# echo $$ > tasks
bash: echo: write error: No space left on device
有帮助吗?
我通过将 cpuset 指定为 1 个内核来启动一个 docker 容器:
docker run --cpuset-cpus="0"...
Run Code Online (Sandbox Code Playgroud)
第二个通过将 cpuset 指定为 4 个内核:
docker run --cpuset-cpus="0-3"...
Run Code Online (Sandbox Code Playgroud)
我在每个容器内启动了一个加载进程,并监控了两个容器的 CPU 消耗。
加载过程如下:
ffmpeg input > output
Run Code Online (Sandbox Code Playgroud)
我观察到两个容器之间的执行时间没有改善(没有加速)。
你知道为什么没有改进吗?具有 4 个核心的容器应该比 1 个核心容器运行得更快,对吗?
注意:对 1core 容器使用 top
CPU0%=100%
CPU1%=0
CPU2%=0
CPU3%=0
Run Code Online (Sandbox Code Playgroud)
使用 top 作为 4core 容器,docker 随机选择 4 个内核之一来启动进程。有时它会影响每个核心的 30%
CPU0%=0 CPU0%=30% CPU0%=0
CPU1%=100% or CPU0%=30% or CPU0%=0
CPU2%=0 CPU0%=30% CPU0%=0
CPU3%=0 CPU0%=30% CPU0%=100%
Run Code Online (Sandbox Code Playgroud)