例如,当您第一次连接服务器时,如何检测 isolcpus 是否已激活以及在哪个 cpu 上激活。状况:
不产生任何进程来查看它将被迁移到哪里。
用例是,isolcpus=1-7
在 6 核 i7 上,似乎不会在启动时激活 isolcpus,我想知道是否可以从/proc/
或/sys
任何可以在用户空间中读取的内核内部,提供 isolcpus 激活的清晰状态以及涉及哪些CPU。或者甚至读取 isolcpus 首先关注的调度程序的活动设置。
考虑到正常运行时间是如此之长,以至于dmesg
不再显示启动日志来检测启动时的任何错误。基本答案如“查看内核命令行“将不被接受:)
答案1
您要查找的内容应该可以在此虚拟文件中找到:
/sys/devices/system/cpu/isolated
以及相反的情况
/sys/devices/system/cpu/present // Thanks to John Zwinck
从drivers/base/cpu.c
我们看到显示的源是内核变量cpu_isolated_map
:
static ssize_t print_cpus_isolated(struct device *dev,
n = scnprintf(buf, len, "%*pbl\n", cpumask_pr_args(cpu_isolated_map));
...
static DEVICE_ATTR(isolated, 0444, print_cpus_isolated, NULL);
这cpu_isolated_map
正是启动时设置的kernel/sched/core.c
:
/* Setup the mask of cpus configured for isolated domains */
static int __init isolated_cpu_setup(char *str)
{
int ret;
alloc_bootmem_cpumask_var(&cpu_isolated_map);
ret = cpulist_parse(str, cpu_isolated_map);
if (ret) {
pr_err("sched: Error, all isolcpus= values must be between 0 and %d\n", nr_cpu_ids);
return 0;
}
return 1;
}
但正如您所观察到的,有人可能修改了进程的亲和力,包括守护进程生成的进程,cron
等等systemd
。如果发生这种情况,将生成继承修改后的亲和力掩码的新进程,而不是isolcpus
.
因此,上面的内容将isolcpus
按照您的要求提供给您,但这可能仍然没有帮助。
假设你发现isolcpus
已经发出,但还没有“采取”,这种不受欢迎的行为可以是由某些进程派生的,该进程意识到它只能绑定到CPU=0
,错误地认为它处于单处理器模式,并通过重置亲和性掩码来帮助尝试“纠正错误”。如果是这种情况,您可以尝试隔离 CPUS 0-5 而不是 1-6,然后看看这是否有效。
答案2
检测是否的更简单方法之一isolcpus
是proc
查看哪些参数在运行时传递给内核。
为此,您可以使用:
$cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-4.8.0-1-amd64 root=/dev/sda1 ro isolcpus=2,3 quiet
正如您所看到的,在这个特定的示例中,isolcpus=2,3
它作为参数传递给正在运行的内核。
您还可以使用taskset
指向 PID 1。由于 PID 1 是内核启动的第一个任务的标准 PID,因此我们可以将其视为一个很好的指示,它将反映我们是否正在isolcpus
工作。如:
$taskset -cp 1
pid 1's current affinity list: 0,1
lscpu
与同服务器中的命令对比:
$lscpu | grep CPU.s
CPU(s): 4
On-line CPU(s) list: 0-3
NUMA node0 CPU(s): 0-3
可以看出,lscpu
显示的是 4 个 CPU/核心,而taskset
仅显示 0,1 个,因此这表明isolcpus
此处正常工作。
答案3
你可以检查CPU_allowed和CPU_allowed_list当前 shell 进程查看保留了哪些 cpu
cat /proc/$$/status|tail -6
例如
Cpus_allowed_list: 0-1, 3-5
意味着 cpu=2 被isolcpus
6 cpus 服务器保留