这个场景解决什么
跑压测、编码、批量计算这类会干扰业务的作业之前,用 taskset 把进程圈定在指定 CPU 上,把影响限制在预留核范围内,核心业务所在的核心就基本不受冲击。它属于轻量手段,子进程默认继承亲和性;要长期稳定的隔离,仍应使用 cgroup 的 cpuset。
基本信息
| 场景 | 隔离高负载任务对业务的 CPU 影响 |
|---|---|
| 组合方式 | taskset -c 核列表,叠加 nice 与 ionice |
| 查看方式 | ps -o psr 查看进程当前所在核 |
| 局限 | 重启与新起进程需重新绑定(子进程默认继承) |
典型使用场景
- 压测前把压力任务限制在预留核上
- 批处理任务与在线业务混部时的隔离
- 排查某个进程实际运行在哪个核上
- 复现单核瓶颈问题时限定运行范围
- 临时降低干扰任务的调度优先级
- 演示多核调度对性能的实际影响
组合使用
组合使用
nproc # 先看核数,例如 8 核
taskset -c 6,7 nice -n 19 ionice -c3 ./stress-test.sh # 限定在 6、7 核
ps -o pid,psr,ni,cmd -p $(pgrep -f stress-test | head -1) # 查看所在核与优先级
taskset -cp $(pgrep -f stress-test | head -1) # 查看现有进程的亲和性
taskset -c 0-5 ./low-latency.sh # 让低延迟任务避开被占用的核
taskset -c 2 bash -c './worker.sh' # 只绑定,不叠加其它控制手段对照
| 手段 | 粒度 | 适用场景 |
|---|---|---|
| taskset | 进程或线程级 | 临时隔离与验证 |
| nice | CPU 调度优先级 | 降低份额,不限定核 |
| cgroup cpuset | 资源组级 | 长期稳定的核隔离 |
| systemd AllowedCPUs | 单元级 | 服务化之后的正式做法 |
| PSR 字段 | 观察当前所在核 | 核对绑定是否生效 |
taskset 只约束启动时的 CPU 亲和性:程序内部如果自行修改亲和性,或 fork 出的新进程被显式指定,绑定就可能不成立,默认情形下子进程会继承。
钉核之后负载更集中:绑定前先确认目标核上是否跑着关键服务,用 ps -o psr 核对现状再动手。
更彻底的隔离应交给 cgroup 的 cpuset 或 systemd 的 AllowedCPUs:它们对资源组生效,服务重启后依然有效。
压测结束记得复查进程是否真的留在预留核上:用 ps -o psr 核对一次,比相信启动时的绑定更可靠,也能发现程序内部改过亲和性的情况。