Linux 多核 CPU 下进程是如何被调度的

发布时间 - 2026-01-29 00:00:00    点击率:
CFS基于vruntime动态调度,非平均分配;taskset

仅设亲和性掩码,多线程、中断、超线程、NUMA错配等均使其失效;调高sched_migration_cost_ns可降迁移开销,但需按负载类型调整。

默认用 CFS,但“公平”不等于“平均分配”

Linux 多核下进程不是靠轮着上核来调度的,而是由 CFS(Completely Fair Scheduler)基于虚拟运行时间(vruntime)动态选择:哪个进程的 vruntime 最小,就优先在空闲 CPU 上运行。它会持续尝试把负载“拉平”,但前提是进程没被绑定、没跨 NUMA 节点、没被中断霸占——所以你常看到“2 个核跑满、2 个核几乎空闲”,往往不是 CFS 失效,而是它被现实条件卡住了。

taskset 绑核 ≠ 真正锁住 CPU,常见失效场景

taskset -c 0,1 ./app 只是设置 CPU 亲和性掩码,内核仍可能因以下原因绕过它:

  • 进程本身是多线程(如 Java 应用),主线程绑了核,子线程默认不受限,会被 CFS 自由调度到其他核
  • 未屏蔽高频率中断(cat /proc/interrupts 查看),比如网卡 IRQ 集中在 CPU 2,而你把服务绑在 0–1,结果响应延迟飙升
  • 绑的是逻辑核(如超线程的 4、5 号),但它们共享 ALU 和缓存,IO 密集型任务反而更慢
  • 没配合 numactl,进程在节点 0 运行,内存却从节点 1 分配,跨节点访问延迟翻倍

sched_migration_cost_ns 调高,是为了让调度器“别瞎动”

CFS 默认认为进程迁移成本很低(/proc/sys/kernel/sched_migration_cost_ns ≈ 500000 ns),于是频繁把轻量线程在核间搬来搬去——这对 Redis、ClickHouse 这类缓存敏感型服务极其不利。实测将它设为 2000000

  • AI 推理延迟下降 22%,上下文切换开销减少 30%
  • FFmpeg 转码等长时任务建议设为 1000000–3000000
  • 但 Web 短连接服务(如 Nginx)应保持默认,否则新请求排队变长

调整前务必确认负载类型,改错值比不调更伤性能。

NUMA 不处理,绑核就是白忙

在鲲鹏、飞腾或 4 路 x86 服务器上,跨 NUMA 节点内存访问延迟是本地的 2–3 倍。只用 taskset 绑核,numastat -p PID 却显示 numa_hit

  • numactl --cpunodebind=0 --membind=0 ./app(强制本地 CPU + 本地内存)
  • 避免用 --preferred=0,它只是“倾向”,不是“限定”
  • 若 BIOS/ACPI 限制严格,加内核启动参数 acpi_enforce_resources=lax 才能真正释放 NUMA 控制权

政务云那个降 43% 跨节点延迟的案例,关键不在 numactl 命令本身,而在这步 ACPI 放行——很多人调了半天没效果,就卡在这里。


# linux  # java  # redis  # node  # nginx  # app  # mac  # ai  # ios  # bios  # cos  # red  # 线程  # 多线程  # 主线程  # clickhouse  # ffmpeg  # 设为  # 多核  # 调高  # 的是  # 超线程  # 掩码  # 平均分配  # 是由  # 很多人 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 高端企业智能建站程序:SEO优化与响应式模板定制开发  海南网站制作公司有哪些,海口网是哪家的?  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  如何在万网利用已有域名快速建站?  Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  教学论文网站制作软件有哪些,写论文用什么软件 ?  PHP正则匹配日期和时间(时间戳转换)的实例代码  如何在自有机房高效搭建专业网站?  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用  实现点击下箭头变上箭头来回切换的两种方法【推荐】  如何用花生壳三步快速搭建专属网站?  网站图片在线制作软件,怎么在图片上做链接?  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  在线制作视频的网站有哪些,电脑如何制作视频短片?  Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比  如何在腾讯云免费申请建站?  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  javascript中数组(Array)对象和字符串(String)对象的常用方法总结  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  简单实现Android验证码  Android仿QQ列表左滑删除操作  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  SQL查询语句优化的实用方法总结  Laravel如何实现本地化和多语言支持?(i18n教程)  如何获取PHP WAP自助建站系统源码?  青岛网站建设如何选择本地服务器?  做企业网站制作流程,企业网站制作基本流程有哪些?  利用 Google AI 进行 YouTube 视频 SEO 描述优化  Bootstrap CSS布局之列表  如何做网站制作流程,*游戏网站怎么搭建?  Firefox Developer Edition开发者版本入口  如何在云指建站中生成FTP站点?  如何在服务器上三步完成建站并提升流量?  免费网站制作appp,免费制作app哪个平台好?  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  高性能网站服务器配置指南:安全稳定与高效建站核心方案  详解CentOS6.5 安装 MySQL5.1.71的方法  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  如何撰写建站申请书?关键要点有哪些?  Python数据仓库与ETL构建实战_Airflow调度流程详解  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  西安专业网站制作公司有哪些,陕西省建行官方网站?  制作公司内部网站有哪些,内网如何建网站?