Chrome 57의 백그라운드 탭

백그라운드 탭은 브라우저 성능, 특히 배터리 수명에 상당한 부정적인 영향을 미칠 수 있습니다. 이 문제를 완화하기 위해 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부터 각 독립 타이머는 초당 1회 이하로 실행됩니다. Chrome은 이러한 타이머를 1초에 한 번 일괄 실행하여 프로세스 wakeup 수를 최소한으로 유지합니다. 오디오 오디오를 재생하는 페이지는 사용자에게 표시되는 것으로 간주되며 백그라운드 타이머 제한에서 제외됩니다. 예외는 애플리케이션이 다음 오디오 트랙을 대기열에 추가할 수 있도록 오디오 재생이 중지된 후 몇 초 동안 지속됩니다.

Chrome에 오디오 아이콘이 표시될 때에만 오디오가 청취 가능한 것으로 간주됩니다. 무음 오디오 스트림은 예외를 허용하지 않습니다.

예산 기반 백그라운드 타이머 제한

Chrome 57에서 제공. 예산 기반 타이머 제한은 타이머 정렬 메커니즘의 추가 확장으로, 백그라운드 타이머 CPU 사용량에 관한 추가 제한을 적용합니다. 다음과 같이 작동합니다.

  • 각 백그라운드 탭에는 백그라운드에서 타이머를 실행하기 위한 시간 예산 (초)이 있습니다.
  • 백그라운드에서 10초가 지나면 페이지에 시간 제한이 적용됩니다.
  • 타이머 작업은 시간 예산이 음수가 아닌 경우에만 실행될 수 있습니다.
  • 타이머가 실행된 후 실행 시간은 예산에서 차감됩니다.
  • 예산은 시간이 지남에 따라 지속적으로 재생성됩니다 (현재 초당 0.01초 속도로 설정됨). Chrome이 제한 동작에 관한 데이터를 더 많이 수집하므로 이러한 예산 재생성 비율은 조정할 수 있습니다.

이러한 제한에는 여러 가지 자동 예외가 있습니다.

  • 오디오를 재생하는 애플리케이션은 포그라운드로 간주되며 제한되지 않습니다.
  • 실시간 연결을 사용하는 애플리케이션 (WebSocket 및 WebRTC)은 시간 초과로 연결이 닫히지 않도록 합니다. 이 경우 run-timers-a-second 규칙이 계속 적용됩니다.

이 메커니즘은 CPU 시간이 아닌 실제 경과 시간을 사용합니다. 이는 CPU 시간에 대한 근사치이며 오랫동안 기본 스레드를 차단하는 데 페널티를 적용합니다.

마지막으로 백그라운드에서 장기 작업을 사용하는 경우 애플리케이션이 매우 긴 시간 동안 (작업 기간의 최대 100배) 제한될 수 있습니다. 성능 가이드라인에 따라 작업을 50밀리초 이하의 청크로 분할하고 visibilityChange 리스너를 사용하여 백그라운드에서 불필요한 작업을 방지합니다.

수신 거부

Chrome은 테스트 모음 및 사용자가 승인한 기타 고부하 계산 실행과 같은 사용 사례에 --disable-background-timer-throttling 플래그를 제공합니다.