如何检测 isolcpus 是否被激活?

如何检测 isolcpus 是否被激活?

例如,当您第一次连接服务器时,如何检测 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

检测是否的更简单方法之一isolcpusproc查看哪些参数在运行时传递给内核。

为此,您可以使用:

$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此处正常工作。

看看:如何确保正在运行的进程独占CPU可用性?

答案3

你可以检查CPU_allowedCPU_allowed_list当前 shell 进程查看保留了哪些 cpu

cat /proc/$$/status|tail -6

例如

Cpus_allowed_list:      0-1, 3-5

意味着 cpu=2 被isolcpus6 cpus 服务器保留

相关内容