是否可以防止 Linux 中的操作系统使用 CPU 核心?maxcpus=<n>
启动参数可防止在操作系统中看到指定数量的核心。我希望所有核心都可见,但只有一些核心可供操作系统用于调度进程。
编辑:这是为了确保关键进程可以在核心上进行调度,而其余不是绝对重要但 CPU 密集度高的进程可以相互竞争其他核心。这是在 CentOS 6 上。
答案1
使用isolcpus
内核命令行上的参数将某些核心与用户空间任务隔离。引用内核启动参数文档:
isolcpus= [KNL,SMP] 将 CPU 与通用调度程序隔离。格式:,..., 或 -(必须是按升序排列的正值范围)或混合 ,...,-
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". This option is the preferred way to isolate CPUs. The alternative -- manually setting the CPU mask of all tasks in the system -- can cause problems and suboptimal load balancer performance.
答案2
您可以使用以下方式禁用处理器(例如 core0),echo 0 > /sys/devices/system/cpu/cpu0/online
并使用以下方式启用echo 1 > /sys/devices/system/cpu/cpu0/online
您可以使用以下方式验证状态cat /proc/cpuinfo
答案3
通用答案...直到您提供更多信息。
您可能希望使用适合您的发行版的 CPU 隔离工具。此外,cgroups 也可能有用,具体取决于您具体想要完成的任务。
编辑:
您正在寻找 CPU 防护罩。在 EL6 上,您可能需要了解有关 cgroups 以及cgred
守护进程和cgconfig
程序包的信息。
例如:
/etc/cgconfig.conf:
mount {
cpuset = /cgroup/cpuset;
cpu = /cgroup/cpu;
cpuacct = /cgroup/cpuacct;
memory = /cgroup/memory;
devices = /cgroup/devices;
freezer = /cgroup/freezer;
net_cls = /cgroup/net_cls;
blkio = /cgroup/blkio;
}
group ppro-users {
cpuset {
cpuset.mems="0-1";
cpuset.cpus="2-7,14-19";
}
cpu {
cpu.shares = 1000;
}
memory {
memory.limit_in_bytes = 40960m;
}
}
上面的代码片段将“ppro-users” cgroup 中的进程限制到某些 CPU。我通过使用 cgred 包来识别和管理应属于该 cgroup 的进程,从而增强了这一功能。
/etc/cgrules.conf
# Example:
#<user> <controllers> <destination>
#@student cpu,memory usergroup/student/
#peter cpu test1/
#% memory test2/
admin cpu,cpuset,memory ppro-users/
@ppro:dbc cpu,cpuset,memory ppro-users/