백그라운드 탭은 브라우저 성능, 특히 배터리 수명에 상당히 부정적인 영향을 미칠 수 있습니다. 이 문제를 완화하기 위해 Chrome은 지난 몇 년 동안 백그라운드 탭에 다양한 제한을 적용해 왔습니다. 최근 추가적인 개선을 위해 많은 노력을 기울였으며 이 문서에서는 Chrome 정책을 개괄적으로 설명합니다. 이 문서에서는 Chrome 57의 현재 정책을 설명하는 데 중점을 둡니다. 장기 전략 및 추가 계획은 이 문서에서 확인할 수 있습니다.
백그라운드용 애플리케이션 최적화
웹 개발자는 사용자가 백그라운드에서 많은 탭을 열어 두는 경우가 많으며 이로 인해 전원 사용량과 배터리 수명에 심각한 영향을 미칠 수 있음을 인식해야 합니다. 특정 사용자 환경을 제공하는 데 절대적으로 필요한 경우가 아니라면 백그라운드 작업은 최소한으로 유지해야 합니다. 페이지 가시성 API를 사용하여 페이지가 백그라운드에 있는지 감지하고 시각적 업데이트와 같은 모든 불필요한 작업을 일시중지해야 합니다.
일부 사이트의 경우 이 간단한 최적화를 통해 CPU 사용량을 최대 75%까지 줄일 수 있습니다.
var doVisualUpdates = true;
document.addEventListener('visibilitychange', function(){
doVisualUpdates = !document.hidden;
});
function update() {
if (!doVisualUpdates) {
return;
}
doStuff();
}
정책
requestAnimationFrame()
문서에 따라 Chrome은 페이지가 백그라운드에 있을 때 requestAnimationFrame()
를 호출하지 않습니다.
이 동작은 2011년부터 이어져 왔습니다.
백그라운드 타이머 정렬
Chrome 11부터 각 독립 타이머는 초당 한 번 이하로 실행됩니다. Chrome은 이러한 타이머를 초당 한 번 일괄 실행하므로 프로세스 wakeup 수가 최소로 유지됩니다. 청취 가능한 오디오를 재생하는 페이지는 사용자에게 표시되는 것으로 간주되며 백그라운드 타이머 제한에서 제외됩니다. 예외는 오디오 재생이 중지된 후 몇 초간 지속되므로 애플리케이션이 다음 오디오 트랙을 대기열에 추가할 수 있습니다.
Chrome에 오디오 아이콘이 표시될 때만 오디오가 청취 가능한 것으로 간주됩니다. 무음 오디오 스트림에는 예외가 적용되지 않습니다.
예산 기반 백그라운드 타이머 제한
Chrome 57에서 제공되는 예산 기반 타이머 제한은 타이머 정렬 메커니즘을 더욱 확장하여 백그라운드 타이머 CPU 사용량에 추가 제한을 적용합니다. 다음과 같이 작동합니다.
- 각 백그라운드 탭에는 백그라운드에서 타이머를 실행하기 위한 시간 예산 (초)이 있습니다.
- 페이지가 백그라운드에서 10초가 지나면 시간 예산 제한이 적용됩니다.
- 타이머 작업은 시간 예산이 음수가 아닌 경우에만 실행할 수 있습니다.
- 타이머가 실행된 후 런타임이 예산에서 공제됩니다.
- 예산은 시간에 따라 지속적으로 재생성됩니다 (현재 초당 0.01초로 설정됨). Chrome에서 제한 동작에 관한 데이터를 더 수집하면 이 예산 재생성 비율을 조정할 수 있습니다.
이 제한에는 몇 가지 자동 예외가 있습니다.
- 오디오를 재생하는 애플리케이션은 포그라운드로 간주되며 제한되지 않습니다.
- 시간 초과로 이러한 연결이 닫히지 않도록 실시간 연결을 사용하는 애플리케이션 (WebSocket 및 WebRTC) 이 경우에도 run-timers-once-a-second 규칙이 계속 적용됩니다.
이 메커니즘은 CPU 시간이 아닌 실제 경과 시간을 사용합니다. CPU 시간의 근사치로 적합하며 기본 스레드를 오랫동안 차단할 경우 페널티를 적용합니다.
마지막으로 백그라운드에서 긴 작업을 사용하는 경우 애플리케이션이 매우 오랜 시간 (작업 기간의 최대 100배) 동안 제한될 수 있습니다.
성능 가이드라인에 따라 작업을 50ms 이하의 청크로 분할하고 visibilityChange
리스너를 사용하여 백그라운드에서 불필요한 작업을 실행하지 않도록 합니다.
선택 해제
Chrome은 테스트 모음 실행 및 기타 사용자가 승인한 과도한 계산과 같은 사용 사례를 위해 --disable-background-timer-throttling
플래그를 제공합니다.