我有一个 AMD 7950X3D CPU,共有 32 个逻辑核心,其中 16 个 (0-15) 可以访问额外的缓存。为了在多任务处理时优化我的游戏系统,我想运行 Steam 及其在核心 0-15 上生成的所有进程,同时将系统的其余部分限制在核心 16-31 上,这样就不会干扰游戏。我希望能够在运行时设置此限制,以便在我不运行游戏时系统拥有所有资源。分解一下,工作流程如下:
- 将所有正在运行的和新生成的进程(steam 除外)固定到核心 16-31。
- 运行蒸汽固定在 0-15。
- 完成游戏后,允许所有正在运行的进程和新生成的进程再次在 0-31 上运行。
第 2 步很清楚,我只是运行taskset -c 0-15 steam
,这有效。但我不清楚如何执行步骤 1 和 3。
这是我尝试过的:
sudo taskset -apc 16-31 1
。通过使用标志设置 PID 1 的亲和力,-a
我希望它将将此应用到它生成的所有进程(这就是一切),但它并没有这样做,它似乎只是将固定应用于 a 的所有线程。进程,而不是已经运行的子进程。在系统监视器中,我仍然看到核心 0-15 偶尔会跳至 2% 的负载。如果我运行stress -c 32
来测试它,它还会将所有 32 个核心加载到 100%,而不仅仅是 16-31 个。
我在其他类似线程中发现的所有建议要么不适用于运行时但在启动时适用(更改 systemd 配置文件),或者不处理所有已经运行的进程,所以我认为这不是重复的。
有什么建议么?
答案1
for pid in /proc/[0-9]*;do taskset -apc 16-31 ${pid##*/};done
答案2
还查看 https://serverfault.com/questions/625146/difference- Between-taskset-and-cpuset
Taskset 用于将进程绑定到一个或多个 CPU;本质上指定它在初始执行时或运行时可以在哪里运行。如果在现代服务器设备上使用 RHEL/CentOS,推荐使用 numactl 而不是任务集。
中央处理器组/cset 用于 CPU 屏蔽,是围绕 Linux cgroup 构建的框架。 Cset 在某些发行版(如 RHEL)上从未流行,因为还有其他工具可用于进程管理。
评论:请注意,应用程序可以在使用时重置其关联性
taskset
。如果您使用cpuset
它,则无法更改 cpuset 授予您的亲和力;numactl
并且taskset
都调用相同的底层系统调用sched_setaffinity
还,
使用 TASKSET 或 sched_setaffinity() 设置进程与使用 CPUSET 隔离的处理器核心的亲和力