如何关闭CPU核心50上的kworker进程以避免上下文切换
解决核心50上kworker进程抢占的问题
1. 添加workqueue隔离内核启动参数
Linux内核4.15及以上版本支持通过启动参数限制unbound workqueue的运行核心,直接修改/etc/default/grub中的内核启动项:
- 找到
GRUB_CMDLINE_LINUX字段,在现有参数后追加workqueue.wq_unbound_cpumask=0xBFFFFFFFFFFFFF(该掩码对应关闭第50位核心,适配64核系统;若核心数不同,需计算对应掩码:将~(1 << 50)转换为十六进制即可) - 示例配置:
GRUB_CMDLINE_LINUX="isolcpus=50 nohz_full=50 rcu_nocbs=50 workqueue.wq_unbound_cpumask=0xBFFFFFFFFFFFFF" - 更新grub并重启系统:
sudo update-grub sudo reboot
2. 逐个调整workqueue的CPU掩码(适配低版本内核)
若内核版本低于4.15,需手动修改每个workqueue的cpumask:
- 列出所有系统workqueue:
ls /sys/devices/virtual/workqueue/ - 对每个workqueue(如
events、events_power_efficient),设置排除核心50的cpumask:
替换echo 0xBFFFFFFFFFFFFF | sudo tee /sys/devices/virtual/workqueue/<workqueue_name>/cpumask<workqueue_name>为实际的workqueue名称,重复此操作覆盖所有相关队列。
3. 优化隔离参数配置
确保现有隔离参数生效并补充中断隔离:
- 检查当前内核启动参数:
确认cat /proc/cmdlineisolcpus=50 nohz_full=50 rcu_nocbs=50存在 - 若系统支持,将
isolcpus参数改为isolcpus=managed_irq,50,可进一步隔离硬件中断,减少中断触发的kworker
4. 迁移核心50上的硬件中断
若仍有kworker因硬件中断触发,可将对应中断迁移至其他核心:
- 查看核心50关联的中断:
cat /proc/interrupts | grep 50 - 对目标中断号(如
123),设置其CPU亲和掩码为排除核心50:echo 0xBFFFFFFFFFFFFF | sudo tee /proc/irq/123/smp_affinity
验证效果
重启后执行以下命令确认核心50的进程状态:
ps -eLo psr,comm | grep '50'
或使用perf工具验证上下文切换情况:
sudo perf record -e sched:sched_switch -T -p <testprogram_PID> sudo perf report
内容的提问来源于stack exchange,提问作者user22468931
相关产品推荐
相关产品推荐

