例如,当您第一次在服务器上连接时,如何检测 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)
但正如您所观察到的,有人可能修改了进程的亲缘关系,包括守护进程产生的进程cron
,systemd
等等。如果发生这种情况,新进程将继承修改后的关联掩码,而不是由isolcpus
.
因此,以上内容将isolcpus
按照您的要求提供,但这可能仍然没有帮助。
假设您发现isolcpus
已发出,但尚未“采取”,这种不希望的行为可能是由于某个进程意识到它绑定到 only CPU=0
,错误地认为它处于单处理器模式,并有助于尝试“设置事物”正确”通过重置亲和掩码。如果是这种情况,您可以尝试隔离 CPUS 0-5 而不是 1-6,然后看看这是否会起作用。
Rui*_*iro 12
检测是否的一种更简单的方法isolcpus
是proc
查看在运行时传递给内核的参数。
为此,您将使用:
$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
在这里工作。
归档时间: |
|
查看次数: |
36389 次 |
最近记录: |