Linux 进程迁移(Process Migration)通常指 将进程从一个 CPU、NUMA 节点、容器或甚至一台机器迁移到另一个目标继续执行。不同层面的“迁移”含义不同,下面按常见场景系统说明。
Linux 调度器会在 多核 CPU 之间迁移进程/线程,以平衡负载。
taskset -p <pid>
taskset -pc 0-3 <pid>
taskset -c 0,1 ./app
✅ 适用于:
多 CPU 插槽系统中,内存分节点(node),跨 node 访问慢。
numactl --hardware
numastat
numactl --cpunodebind=0 --membind=0 ./app
numactl --cpunodebind=1 --membind=1 -p <pid>
⚠️ 不一定完全迁移内存,可能仍有跨 node 访问。
Docker 不支持直接迁移运行中的进程。
docker stop old
docker run -d --volumes-from old newimage
✅ 这是 服务迁移,不是进程级迁移
这是真正的进程迁移,Linux 通过 CRIU 实现。
criu dump -t <pid> -D /tmp/checkpoint
criu restore -D /tmp/checkpoint
✅ 可迁移:
❌ 限制:
chrt -r -p 99 <pid>
或
echo 0 > /proc/<pid>/cpuset.cpu_exclusive
cat /proc/<pid>/sched
| 场景 | 是否真正迁移 | 工具 |
|---|---|---|
| CPU 核之间 | ✅ | 调度器 / taskset |
| NUMA 节点 | 部分 | numactl |
| Docker 容器 | ❌(重启) | docker |
| 跨机器 | ✅ | CRIU |
| 内核线程 | ❌ | N/A |
❌ 进程不能“热迁移”到另一台机器像 VM 一样
✅ 只能用 CRIU,且有限制
❌ taskset 不等于 NUMA 迁移
✅ 只影响 CPU,不影响内存
如果你愿意,可以告诉我:
我可以直接给你可落地的方案或脚本。