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를 오리진 트라이얼로 사용할 수 있습니다. 2024년 5월 29일에 Chrome 123에서 지원이 종료될 예정입니다. 여기에서 등록하세요.

사용 사례

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

이러한 인기 있는 실시간 애플리케이션은 soft로 분류됩니다. 즉, 시스템이 특정 상태를 넘어서 작동하면 서비스 품질이 저하되지만 전체 시스템 장애로 이어지지는 않습니다. 이러한 소프트 실시간 애플리케이션은 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, options): 관찰되는 소스 값의 변경이 발생한 것을 감지하면 지정된 콜백 함수를 호출하는 새 PressureObserver 객체를 만듭니다.

생성자는 필수 콜백 함수와 선택적 옵션을 매개변수로 사용합니다.

콜백

callback(): 콜백이 읽지 않은 PressureRecord 객체의 배열과 함께 호출됩니다.

옵션

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

방법

PressureObserver.observe(source): 'PressureObserver'에 관찰할 소스를 알려줍니다.

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

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

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

static PressureObserver.supportedSources() (읽기 전용): 하드웨어에서 지원되는 소스 유형을 반환합니다.

매개변수

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

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

PressureRecord

Compute Pressure API의 PressureRecord 인터페이스는 특정 전환 순간에 소스의 압력 추세를 설명합니다.

인스턴스 속성

PressureRecord.source (읽기 전용): 레코드를 가져오는 원본 소스를 나타내는 문자열을 반환합니다.

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

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

Compute Pressure API가 지원되나요?

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

압력 관찰자 만들기

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

const observer = new PressureObserver(
  (records) => { /* ... */ },
  { sampleInterval: 2000 }
);

샘플 간격 sampleInterval인 2,000밀리초는 최대 2초마다 업데이트가 있음을 의미합니다.

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

압력 관찰자 사용

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

observer.observe("cpu");

이 예에서 "cpu"는 우리가 관심이 있는 압력원입니다. 현재 유일하게 사용할 수 있는 소스입니다. 앞으로 "gpu", "power", "thermals" 등 다른 소스가 있을 수 있습니다.

소스 관찰을 중지하려면 다음 예와 같이 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, { sampleInterval: 1000 });
await observer.observe("cpu");

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

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

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

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

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

await observer.observe("cpu");

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

API 설계에 대해 알려주세요.

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

구현 관련 문제 신고

Chromium 구현에서 버그를 발견하셨나요? 아니면 구현이 사양과 다른가요? new.crbug.com에서 버그를 신고합니다. 최대한 많은 세부정보와 간단한 재현 안내를 포함하고 Components 상자에 Blink>PerformanceAPI>ComputePressure를 입력합니다.

유용한 링크