如何检测isolcpus是否被激活?


15

例如,当您首次在服务器上连接时,如何检测isolcpus是否被激活以及在哪个cpus上被激活。条件:

不会产生任何进程以查看将在何处进行迁移。

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

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


1
你能用pidstat -C isolcpus。pidstat来自sysstat软件包。
蒂莫西·普里亚姆

2
可能是愚蠢的,但我看不到pidstat和之间的任何链接isolcpus。您能详细说明一下吗?
netmonk

您说您需要知道命令在哪些CPU上运行。我不知道这isolcpus是什么,但是pidstat如果您通过-C process_name标志,可以告诉您进程正在运行哪个CPU 。例如,pidstat -C top产生以下内容。 10:56:52 AM PID %usr %system %guest %CPU CPU Command 10:56:52 AM 3457 0.00 0.00 0.00 0.00 6 top
蒂莫西·普里亚姆

2
好的,谢谢您的回复。isolcpus是一个内核参数,如果调度程序是隔离的,则强制调度程序自己不迁移任何进程。例如,在8个cpu服务器上,isolcpus=1-7在内核命令行中,将强制由init和shell中的任何类型的命令派生的所有生成的进程仅在CPU0上运行。要在隔离的cpu上运行任务,您需要使用例如启动它taskset。因此,关于我要问的问题,您的回答似乎不合时宜。无论如何,感谢您尝试回答我
netmonk '17

1
像这样的东西真的不应该不难....
user997112

Answers:


17

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

/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;
}

但是正如您观察到的,有人可能已经修改了进程的亲和力,包括守护程序生成的进程cronsystemd等等。如果发生这种情况,将继承继承的修改后的相似性掩码,而不是由设置的亲和力掩码,生成新的进程isolcpus

因此,以上内容将按isolcpus您的要求提供,但这可能仍然无济于事。

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


1
在Centos 7.x上进行了测试,请注意,/sys/devices/system/cpu/possible根据您解释“反向”的方式,它似乎不是“反向”。例如,如果.../cpu/isolated回报2,4,因为他们已经被隔离,.../cpu/possible将返回0-191
bgura

1
我认为大多数人都希望/sys/devices/system/cpu/present哪个显示哪些CPU存在,而不是/sys/devices/system/cpu/possible哪个显示可能存在(但当前可能不存在)。在某些系统上,它们是相同的,但是即使在我检查过的非常基本的台式机上,它们也不相同。
John Zwinck

@JohnZwinck好抓。修改答案
LSerni

1
使用isolcpus = 0和4个内核,我得到/ isolated = 0和/ present = 0-3。
Stefan Reich

10

一种更简单的检测方法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在这里起作用。

看一下:如何确保正在运行的进程的专用CPU可用性?


先生,谢谢您的回答,但我不接受。我指定不接受谈论内核命令行的答案。我显然知道/proc/cmdline哪个是grub.conf文件内容的确切副本。这不是我问的!还是要谢谢你 !
netmonk

我已经添加了答案。
Rui F Ribeiro

1
有人以前修改过进程与任务集的亲和力是什么?如果有人仅将初始化亲和力设置为cpu 0会怎样,它是否给我有关激活isol cpu的任何信息?
netmonk

1

您可以检查Cpus_allowedCpus_allowed_list以获取当前的shell进程,以了解保留了哪些cpus

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

例如

Cpus_allowed_list:      0-1, 3-5

表示cpu = 2由isolcpus6 cpus服务器保留


2
其实...不 它显示了当前Shell进程继承的相似性掩码中的CPU 。如果是,ssh并且手动限制了父级sshd对CPU 1 的亲和力,那么您将始终看到CPU 1,无论是否isolcpus“被占用”。该$$分支给你的过程中继承的值,而不是原来的系统的。
LSerni
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.