如何检测isolcpus是否被激活?

net*_*onk 18 linux kernel

例如,当您第一次在服务器上连接时,如何检测 isolcpus 是否已激活以及在哪个 cpus 上激活。状况:

不产生任何进程来查看它将被迁移到哪里。

用例是isolcpus=1-7一个6个核i7处理器,似乎在启动时不激活isolcpus,我想知道,如果可能的/proc//sys或者可以在用户空间可以读取任何内核内部,提供isolcpus激活的清晰状态和哪个cpu有关。或者甚至读取 isolcpus 首先关注的调度程序的活动设置。

考虑到正常运行时间如此之大,即dmesg不再显示启动日志以检测启动时的任何错误。不接受诸如“查看内核 cmd 行”之类的基本答案:)

LSe*_*rni 24

您要查找的内容应在此虚拟文件中找到:

/sys/devices/system/cpu/isolated
Run Code Online (Sandbox Code Playgroud)

和相反的

/sys/devices/system/cpu/present    // Thanks to John Zwinck
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

并且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;
}
Run Code Online (Sandbox Code Playgroud)

但正如您所观察到的,有人可能修改了进程的亲缘关系,包括守护进程产生的进程cronsystemd等等。如果发生这种情况,新进程将继承修改后的关联掩码,而不是由isolcpus.

因此,以上内容将isolcpus按照您的要求提供,但这可能仍然没有帮助。

假设您发现isolcpus已发出,但尚未“采取”,这种不希望的行为可能是由于某个进程意识到它绑定到 only CPU=0,错误地认为它处于单处理器模式,并有助于尝试“设置事物”正确”通过重置亲和掩码。如果是这种情况,您可以尝试隔离 CPUS 0-5 而不是 1-6,然后看看这是否会起作用。

  • 使用 isolcpus=0 和 4 个内核,我得到 /isolated=0 和 /present=0-3。 (2认同)
  • `/present` 没有按预期工作 - 在我的系统(Ubuntu 20.04/Linux 5.8)上,我得到了处理器的完整列表(16C/32T CPU 上的 0-31)。 (2认同)

Rui*_*iro 12

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

为此,您将使用:

$cat /proc/cmdline 
BOOT_IMAGE=/boot/vmlinuz-4.8.0-1-amd64 root=/dev/sda1 ro isolcpus=2,3 quiet
Run Code Online (Sandbox Code Playgroud)

如您所见,在此特定示例中isolcpus=2,3,它作为参数传递给正在运行的内核。

您也可以使用taskset指向 PID 1。由于 PID 1 是内核启动的第一个任务的标准 PID,我们可以将其视为一个很好的指示,它会反映我们是否isolcpus工作。如:

$taskset -cp 1
pid 1's current affinity list: 0,1
Run Code Online (Sandbox Code Playgroud)

lscpu同一服务器中的命令进行比较:

$lscpu | grep CPU.s
CPU(s):                4
On-line CPU(s) list:   0-3
NUMA node0 CPU(s):     0-3
Run Code Online (Sandbox Code Playgroud)

可以看到,lscpu显示的是 4 个 CPU/核心,而taskset只显示 0,1,所以这个显示isolcpus在这里工作。

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