저는 백그라운드에서 장기 실행 컴파일 작업을 자주 수행하는 데스크탑 시스템을 실행하고 있습니다. FPS를 크게 낮추지 않고 런타임에 CPU 기반 게임을 플레이하고 싶습니다(게임은 8개 코어 중 <4개만 사용함).
stress -c $(nproc)
두 가지 프로세스로 간단한 테스트 시나리오를 설정했습니다 .
Nice는 더 이상 최신 Linux 배포판에서 작동하지 않으므로(특히 실제 사용 사례에서) 작업 우선 순위를 지정하는 가장 좋은 방법은 SCHED_IDLE 예약 정책을 사용하는 것입니다.
그래서 하나는 SCHED_IDLE(구별을 위해 중요하지 않은 1)로 설정하고 다른 하나는 SCHED_OTHER를 사용하여 주기적으로 실행하도록 설정했습니다.
예상한 대로 0.1 us, 0.1 sy, 99.8 ni, 0.0 id
백그라운드 작업이 실행 중일 때와 99.5 us, 0.2 sy, 0.3 ni, 0.0 id
둘 다 실행 중일 때 CPU 사용량이 시뮬레이션됩니다.
그러나 이 차이는 게임에 잘 적용되지 않습니다. 백그라운드 프로세스 없이 게임을 정상적으로 실행하면 83FPS가 되고, SCHED_OTHER 백그라운드 작업으로 게임을 실행하면 매우 가변적인 35FPS가 되며, SCHED_IDLE에서는 상당히 안정적인 60FPS가 생성됩니다. .
필요할 때 사용 가능한 CPU 리소스를 거의 100% 사용할 수 있음에도 불구하고 게임 성능이 이렇게 떨어지는 이유는 무엇입니까?
이전 유휴 코어의 활동으로 인한 낮은 부스트 빈도 및 L3 캐시 정체로 인해 예상되는 10% 미만의 성능 저하에 가까워지려면 어떻게 해야 합니까?
(물론 일반적으로 컴파일 성능 저하가 없습니다. 다른 작업을 하지 않을 때 가능한 한 빨리 작업을 수행하고 싶습니다. make -j1
기술적으로는 그렇게 할 수 있다는 것을 알고 있습니다.)