linux 4.19内核使能CONFIG_NO_HZ_FULL编译选项,生成内核之后,在bootloader启动参数指定core 0,4,5,6,7为自适应滴答模式,内核启动之后,发现core0并没有生效
# cat /proc/cmdline
BOOT_IMAGE=(hd0,gpt1)/boot/Image nohz_full=0,4,5,6,7 root=/dev/nvme0n1p3 rw
# cat /sys/devices/system/cpu/nohz_full
4-7
对应的内核源代码为
drivers\base\cpu.c
#ifdef CONFIG_NO_HZ_FULL
static ssize_t print_cpus_nohz_full(struct device *dev,
struct device_attribute *attr, char *buf)
{
int n = 0, len = PAGE_SIZE-2;
n = scnprintf(buf, len, "%*pbl\n", cpumask_pr_args(tick_nohz_full_mask));
return n;
}
static DEVICE_ATTR(nohz_full, 0444, print_cpus_nohz_full, NULL);
#endif
查看内核日志,确认内核将core设置为自适应滴答模式之前,会将启动核core0剔除掉
# dmesg | grep NO_HZ
[ 0.000000] NO_HZ: Clearing 0 from nohz_full range for timekeeping
[ 0.000000] NO_HZ: Full dynticks CPUs: 4-7.
#
对应的内核代码如下
void __init tick_nohz_init(void)
{
int cpu, ret;
... ...
cpu = smp_processor_id(); // 启动core为core0
if (cpumask_test_cpu(cpu, tick_nohz_full_mask)) { // nohz_full存在core0时进入if分支内部,剔除core0
pr_warn("NO_HZ: Clearing %d from nohz_full range for timekeeping\n",
cpu);
cpumask_clear_cpu(cpu, tick_nohz_full_mask);
}
... ...
pr_info("NO_HZ: Full dynticks CPUs: %*pbl.\n",
cpumask_pr_args(tick_nohz_full_mask));
}
参考文档
NO_HZ: 减少调度时钟的滴答
https://blog.csdn.net/zhoudawei/article/details/86427101
有利于提高xenomai/PREEMPT-RT 实时性的一些配置建议
https://blog.csdn.net/qq_22654551/article/details/105475672