Compute Pressure API

시스템 컴퓨팅 압력에 대한 정보를 확인합니다.

Kenneth Christiansen
Kenneth Christiansen
Arnaud (Arno) Mandy

Compute Pressure API는 시스템의 압력을 나타내는 상위 상태를 제공합니다. 이를 통해 구현은 올바른 기본 하드웨어 측정항목을 사용하여 시스템이 관리할 수 없는 스트레스를 받지 않는 한 사용자가 사용 가능한 모든 처리 성능을 활용할 수 있도록 합니다.

현재 상태

단계 상태
1. 설명 동영상 만들기 완전함
2. 사양의 초안 작성 완전함
3. 의견 수집 및 디자인 반복 진행 중
4. 오리진 트라이얼 완료
5. 출시 완료됨 (Chrome 125)

Compute Pressure API 사용해 보기

로컬에서 Compute Pressure API를 실험하려면 이 페이지를 참고하세요.

오리진 트라이얼 등록

Chrome 115부터 Compute Pressure API를 오리진 트라이얼로 사용할 수 있습니다. Chrome 123 (2024년 5월 29일)에서 종료될 예정입니다. 오리진 트라이얼에 등록합니다.

사용 사례

현재 Compute Pressure API로 개선된 주요 사용 사례는 화상 회의와 비디오 게임입니다.

이러한 인기 있는 실시간 애플리케이션은 소프트로 분류됩니다. 즉, 시스템이 특정 상태를 넘어서 실행되면 서비스 품질이 저하되지만 전체 시스템 장애로 이어지지는 않습니다. 이러한 소프트 실시간 애플리케이션은 CPU 사용량이나 부하에 따라 워크로드를 조정할 수 있다는 큰 이점이 있습니다.

특히 이 API의 첫 번째 버전은 다음과 같은 적응 결정을 사용 설정하는 것을 목표로 합니다.

화상 회의

  • 참여자가 많은 통화 중에 동시에 표시되는 동영상 피드 수를 조정합니다.
  • 동영상 처리 품질 (동영상 해상도, 초당 프레임 수)을 낮춥니다.
  • 일부 카메라 필터와 같이 중요하지 않은 동영상 처리를 건너뜁니다.
  • WebRTC 주변 소음 제거와 같은 비필수 오디오 처리를 사용 중지합니다.
  • 동영상 및 오디오 인코딩 (WebRTC, WebCodecs 또는 소프트웨어 인코딩)에서 품질 대 속도 및 크기 대 속도 노브를 '속도'쪽으로 돌립니다.

비디오 게임

  • 품질이 낮은 애셋을 사용하여 게임의 동영상 (3D 모델, 텍스처, 셰이더)과 오디오 (음성, 음향 효과)를 구성합니다.
  • 중요하지 않은 세부정보 (물, 옷, 불 애니메이션, 피부 밝기, 섬광 효과 또는 게임플레이에 영향을 주지 않는 물리적 시뮬레이션)가 덜 사실적으로 표시되는 효과를 사용 중지합니다.
  • 게임의 렌더링 엔진에서 품질과 속도 옵션을 조정합니다 (그림자 품질, 텍스처 필터링, 시야 거리).

기술적으로는 사이트에서 사용 중인 기본 스레드와 작업자의 열 (예: 시스템이 수동으로 냉각되고 있는지) 및 CPU 압력 상태를 알면 이를 실행할 수 있습니다. 시스템 열 상태는 전역 상태이며 관찰 사이트 이외의 앱과 사이트의 영향을 받을 수 있습니다.

인터페이스

Compute Pressure API는 다음 컨텍스트에서 실행할 수 있습니다.

  • 창 또는 기본 스레드
  • 전용 작업자
  • 공유 작업자

Compute Pressure API는 두 가지 새로운 인터페이스를 정의합니다.

PressureObserver: 사전 정의된 샘플 간격으로 임의 개수의 소스의 컴퓨팅 압력을 관찰하는 객체입니다. Chromium의 첫 번째 반복에서는 "cpu"source로 노출합니다. 자세한 내용은 매개변수 섹션을 참고하세요. 각 관찰자는 시스템의 압력 변화 추세를 비동기식으로 관찰할 수 있습니다.

PressureRecord: 전환의 특정 시점의 압력 동향을 설명합니다. 이 유형의 객체는 두 가지 방법으로만 가져올 수 있습니다. PressureObserver 콜백의 입력으로 가져오거나 PressureObserver 인스턴스에서 takeRecords() 메서드를 호출하는 것입니다.

PressureObserver

PressureObserver 객체가 생성되면 지정된 샘플 간격으로 지원되는 소스의 압력을 관찰하도록 구성됩니다. 지원되는 소스는 PressureObserver 객체의 전체 기간 동안 언제든지 개별적으로 관찰 또는 관찰 해제할 수 있습니다. 객체를 만든 후에는 샘플 간격을 변경할 수 없습니다.

생성자

PressureObserver(callback): 관찰 중인 소스의 값 변경이 감지되면 지정된 콜백 함수를 호출하는 새 PressureObserver 객체를 만듭니다.

생성자는 필수 콜백 함수를 사용합니다.

콜백

callback(): 콜백은 읽지 않은 PressureRecord 객체 배열로 호출됩니다.

메서드

PressureObserver.observe(source, options): 'PressureObserver'에 관찰할 소스와 선택적 options를 매개변수로 전달합니다.

옵션

PressureObserverOptions: 사용자가 업데이트를 요청하는 샘플 간격(sampleInterval, 밀리초)을 포함합니다.

PressureObserver.unobserve(source): 'PressureObserver'에 소스 관찰을 중지하도록 지시합니다.

PressureObserver.disconnect(): 'PressureObserver'에 모든 소스의 관찰을 중지하도록 지시합니다.

PressureObserver.takeRecords(): 마지막 콜백 호출 이후의 레코드 시퀀스를 반환합니다.

static PressureObserver.knownSources() (읽기 전용): 사용자 에이전트의 알려진 소스 유형을 알파벳 순서로 반환합니다.

매개변수

source: 관찰할 소스입니다(예: "cpu"). 지원되는 소스 유형 중 하나여야 합니다.

현재 버전의 Compute Pressure에서는 "cpu"만 지원됩니다.

PressureRecord

Compute Pressure API의 PressureRecord 인터페이스는 특정 전환 시점의 소스의 압력 동향을 설명합니다.

인스턴스 속성

PressureRecord.source (읽기 전용): 레코드가 제공되는 출처 소스를 나타내는 문자열을 반환합니다.

PressureRecord.state (읽기 전용): 기록된 압력 상태를 나타내는 문자열을 반환합니다.

PressureRecord.time (읽기 전용): 고해상도 타임스탬프를 나타내는 숫자를 반환합니다.

다음 섹션에는 사용 예가 나와 있습니다.

API 지원 확인

if ('PressureObserver' in globalThis) {
  // The Compute Pressure API is supported.
}

압력 관찰자 만들기

압력 업데이트가 있을 때마다 실행할 콜백 함수를 사용하여 생성자를 호출하여 압력 관찰자를 만듭니다.

const observer = new PressureObserver((records) => {
  /* ... */
});

압력 관찰자 사용

압력 관찰자를 시작하는 방법은 하나뿐입니다. 각 소스에 대해 observer.observe(source)을 호출합니다.

observer.observe("cpu" { sampleInterval: 2_000 });

이 예에서 "cpu"는 관심 있는 압력 소스입니다. 현재로서는 유일한 소스입니다. 향후 "gpu", "power", "thermals"와 같은 다른 소스가 있을 수 있습니다.

샘플 간격 sampleInterval이 2,000밀리초이면 최대 2초마다 업데이트가 발생합니다.

요청된 샘플 간격을 시스템에서 제공할 수 없는 경우 시스템은 가장 적합한 간격으로 샘플을 제공합니다. 예를 들어 2, 000ms 간격이 요청되었지만 시스템에서 최대 1, 000ms의 샘플만 제공할 수 있는 경우 1, 000ms가 선택됩니다.

소스 관찰을 중지하려면 다음 예와 같이 unobserve() 메서드를 사용합니다.

observer.unobserve('cpu');

모든 소스를 한 번에 관찰 중지하려면 다음 예와 같이 disconnect() 메서드를 사용합니다.

observer.disconnect();

압력 레코드 검색

압력 레코드는 압력 상태가 변경될 때마다 호출되는 콜백 함수를 사용하여 검색할 수 있습니다.

function callback(records) {
  const lastRecord = records[records.length - 1];
  console.log(`Current pressure ${lastRecord.state}`);
  if (lastRecord.state === 'critical') {
    // Reduce workers load by 4.
  } else if (lastRecord.state === 'serious') {
    // Reduce workers load by 2.
  } else {
    // Do not reduce.
  }
}

const observer = new PressureObserver(callback);
await observer.observe('cpu', { sampleInterval: 1_000 });

사용자는 takeRecords() 메서드를 호출하여 PressureRecord 읽기를 강제할 수도 있습니다.

PressureObserver 인터페이스의 takeRecords() 메서드는 압력 관찰자에 저장된 PressureRecords 객체 배열을 반환하여 비웁니다.

가장 일반적인 사용 사례는 관찰자를 연결 해제하기 전에 관찰자의 콜백 함수에서 아직 처리되지 않은 대기 중인 모든 압력 레코드를 즉시 가져와 관찰자를 종료할 때 대기 중인 레코드를 처리할 수 있도록 하는 것입니다.

이 메서드를 호출하면 대기 중인 레코드 목록이 삭제되므로 콜백이 실행되지 않습니다.

const observer = new PressureObserver((records) => {
  /* Do something with records. */
});

await observer.observe('cpu', { sampleInterval: 1_000 });

setTimeout(() => {
  // Forced records reading.
  const records = observer.takeRecords();
  observer.disconnect();
  // Do something with last records if any.
}, 2000);

의견 공유하기

API에 예상대로 작동하지 않는 부분이 있나요? API 사용 시 누락된 메서드나 속성이 있나요? 해당 GitHub 저장소에서 사양 문제를 제출하거나 기존 사양 문제에 관한 의견을 작성합니다.

구현 문제 신고

Chromium 구현에 버그가 있나요? 아니면 구현이 사양과 다른가요? new.crbug.com에서 버그를 신고합니다. 최대한 자세한 내용과 재현 안내를 포함하고 구성요소 상자에 Blink>PerformanceAPIs>ComputePressure를 입력합니다.

리소스