我正在运行一个桌面系统,经常在后台执行长时间运行的编译任务。我想在运行时玩 CPU 受限的游戏,而不会显着降低 FPS(该游戏仅使用我的 8 个核心中的 <4 个)。
我设置了一个包含两个stress -c $(nproc)
进程的简单测试场景。
Nice 在现代 Linux 发行版上不再有效(尤其是在我的实际用例中),因此确定任务优先级的最佳方法是使用 SCHED_IDLE 调度策略。
因此,我将其中一个设置为 SCHED_IDLE(以及一个无关紧要的 1 用于区分),另一个则使用 SCHED_OTHER 定期运行。
正如预期的那样,CPU 使用情况是0.1 us, 0.1 sy, 99.8 ni, 0.0 id
模拟后台任务运行时以及99.5 us, 0.2 sy, 0.3 ni, 0.0 id
两者都运行时的情况。
然而,这种差异并不能很好地转化为游戏:在没有后台进程的情况下正常运行游戏会导致 83 FPS,使用 SCHED_OTHER 后台任务运行游戏会导致高度可变的 35 FPS,而 SCHED_IDLE 会导致相当稳定的 60 FPS。
为什么游戏的性能会下降这么多,尽管它可以在需要时使用近 100% 的可用 CPU 资源?
我怎样才能让它更接近您预期的 <10% 性能下降,这是由于先前空闲核心上的活动导致的升压频率降低和 L3 缓存拥塞造成的?
(当然,通常不会降低编译性能;当我不做任何其他事情时,我希望尽可能快。make -j1
我知道,从技术上讲,我会做到这一点。)