API Áp suất tính toán

Nhận thông báo về áp lực điện toán của hệ thống.

Kenneth Christiansen
Kenneth Christiansen
Arnaud (Arno) Mandy

API Áp suất tính toán cung cấp các trạng thái cấp cao đại diện cho áp lực lên hệ thống. Việc này cho phép quá trình triển khai sử dụng các chỉ số phần cứng cơ bản phù hợp nhằm đảm bảo người dùng có thể tận dụng tất cả sức mạnh xử lý có sẵn, miễn là hệ thống không phải chịu tình trạng áp lực không thể quản lý.

Trạng thái hiện tại

Bước Trạng thái
1. Tạo thông báo giải thích Hoàn tất
2. Tạo bản nháp ban đầu của quy cách Hoàn tất
3. Thu thập ý kiến phản hồi và cải tiến thiết kế Đang tiến hành
4. Bản dùng thử theo nguyên gốc Hoàn chỉnh
5. Chạy Hoàn tất (Chrome 125)

Dùng thử Compute Compute API

Để thử nghiệm với Compute Compute API cục bộ, hãy đọc trang này.

Đăng ký dùng thử theo nguyên gốc

Từ Chrome 115, Compute Compute API được cung cấp dưới dạng bản dùng thử theo nguyên gốc. Dự kiến phiên bản này sẽ kết thúc trong Chrome 123 (ngày 29 tháng 5 năm 2024). Đăng ký dùng thử theo nguyên gốc.

Trường hợp sử dụng

Các trường hợp sử dụng chính được tăng cường bởi Compute Compute API hiện tại là hội nghị truyền hình và trò chơi điện tử.

Các ứng dụng theo thời gian thực phổ biến này được phân loại là ứng dụng mềm. Tức là chất lượng dịch vụ sẽ giảm nếu hệ thống thực thi vượt quá một số trạng thái nhất định, nhưng không gây ra lỗi toàn bộ hệ thống. Các ứng dụng mềm theo thời gian thực này hưởng lợi rất nhiều từ khả năng điều chỉnh khối lượng công việc dựa trên mức tiêu thụ hoặc áp lực CPU.

Cụ thể, phiên bản đầu tiên của API này nhằm hỗ trợ các quyết định điều chỉnh sau đây.

Hội nghị truyền hình

  • Điều chỉnh số lượng nguồn cấp dữ liệu video hiển thị đồng thời trong cuộc gọi có nhiều người tham gia.
  • Giảm chất lượng xử lý video (độ phân giải video, số khung hình/giây).
  • Bỏ qua bước xử lý video không thiết yếu, chẳng hạn như một số bộ lọc của máy ảnh.
  • Tắt tính năng xử lý âm thanh không thiết yếu, chẳng hạn như tính năng khử tiếng ồn WebRTC.
  • Chuyển các nút chất lượng so với tốc độ và kích thước so với tốc độ thành "tốc độ" trong phương thức mã hoá video và âm thanh (trong WebRTC, WebCodecs hoặc mã hoá phần mềm).

Trò chơi video

  • Sử dụng các thành phần có chất lượng thấp hơn để soạn video (mô hình 3D, hoạ tiết, chương trình đổ bóng) và âm thanh (giọng nói, hiệu ứng âm thanh) của trò chơi.
  • Tắt các hiệu ứng dẫn đến các chi tiết không cần thiết ít thực tế hơn (nước, vải, ảnh động đám cháy, độ sáng da, hiệu ứng ánh sáng loá hoặc mô phỏng vật lý không ảnh hưởng đến lối chơi).
  • Các nút chỉnh sửa so với chất lượng so với tốc độ trong công cụ kết xuất của trò chơi (chất lượng bóng, lọc hoạ tiết, khoảng cách xem).

Về mặt kỹ thuật, việc này có thể được thực hiện bằng cách biết nhiệt (ví dụ: hệ thống được làm mát thụ động) và trạng thái áp suất CPU cho luồng chính và trình thực thi mà trang web đang sử dụng. Trạng thái nhiệt của hệ thống là một trạng thái chung và có thể chịu ảnh hưởng của các ứng dụng cũng như trang web không phải trang web quan sát.

Giao diện

Bạn có thể chạy Compute Compute API trong các ngữ cảnh sau:

  • Cửa sổ hoặc luồng chính
  • Nhân viên chuyên trách
  • Trình sử dụng chung

API Áp suất tính toán xác định 2 giao diện mới.

PressureObserver: Một đối tượng để quan sát áp lực tính toán của số lượng nguồn bất kỳ tại một khoảng thời gian lấy mẫu xác định trước. Vòng lặp đầu tiên trong Chromium hiển thị "cpu" dưới dạng source. Hãy xem phần về tham số để biết thêm thông tin chi tiết. Mỗi đối tượng tiếp nhận dữ liệu có thể quan sát một cách không đồng bộ các xu hướng thay đổi áp lực trong một hệ thống.

PressureRecord: Mô tả xu hướng áp lực tại một thời điểm chuyển đổi cụ thể. Bạn chỉ có thể lấy các đối tượng thuộc loại này theo 2 cách: dưới dạng dữ liệu đầu vào cho lệnh gọi lại FrequencyObserver hoặc bằng cách gọi phương thức takeRecords() trên thực thể PressureObserver.

PressureObserver

Khi được tạo, đối tượng PressureObserver được định cấu hình để theo dõi áp suất của các nguồn được hỗ trợ tại một khoảng thời gian mẫu nhất định. Bạn có thể quan sát hoặc quan sát riêng các nguồn được hỗ trợ bất cứ lúc nào trong suốt thời gian hoạt động của đối tượng PressureObserver. Bạn không thể thay đổi khoảng thời gian lấy mẫu sau khi tạo đối tượng.

Hàm dựng

PressureObserver(callback): Tạo một đối tượng PressureObserver mới sẽ gọi một hàm callback được chỉ định khi phát hiện thấy có sự thay đổi về giá trị của nguồn đang được quan sát.

Hàm khởi tạo có một hàm callback bắt buộc.

Số nhận cuộc gọi lại

callback(): Lệnh gọi lại được gọi bằng một mảng các đối tượng PressureRecord chưa đọc.

Phương thức

PressureObserver.observe(source, options): Cho "PressureObserver" biết nguồn nào cần quan sát và options không bắt buộc dưới dạng tham số.

Tùy chọn

PressureObserverOptions: Chứa khoảng thời gian mẫu (sampleInterval tính bằng mili giây) mà người dùng yêu cầu cập nhật.

PressureObserver.unobserve(source): Yêu cầu "PressureObserver" ngừng quan sát một nguồn.

PressureObserver.disconnect(): Yêu cầu "PressureObserver" ngừng quan sát tất cả các nguồn.

PressureObserver.takeRecords(): Trả về một chuỗi bản ghi, kể từ lệnh gọi lại gần đây nhất.

static PressureObserver.knownSources() (chỉ có thể đọc): Trả về loại nguồn đã biết của tác nhân người dùng theo thứ tự bảng chữ cái.

Thông số

source: Nguồn cần quan sát, ví dụ: "cpu". Đây phải là một trong các loại nguồn được hỗ trợ.

Trong phiên bản hiện tại của Áp suất tính toán, chỉ có "cpu" được hỗ trợ.

PressureRecord

Giao diện PressureRecord của API Áp suất tính toán mô tả xu hướng áp suất của một nguồn tại một thời điểm chuyển đổi cụ thể.

Thuộc tính thực thể

PressureRecord.source (Chỉ đọc): Trả về một chuỗi đại diện cho nguồn gốc nơi bản ghi đến.

PressureRecord.state (Chỉ đọc): Trả về một chuỗi biểu thị trạng thái áp lực đã ghi.

PressureRecord.time (Chỉ đọc): Trả về một số đại diện cho dấu thời gian có độ phân giải cao.

Ví dụ

Các phần sau đây liệt kê các ví dụ về cách sử dụng.

Xác định khả năng hỗ trợ API

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

Tạo trình quan sát áp lực

Tạo trình quan sát áp lực bằng cách gọi hàm khởi tạo với hàm callback sẽ chạy bất cứ khi nào có cập nhật về áp lực:

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

Sử dụng trình quan sát áp lực

Chỉ có một cách để khởi động trình quan sát áp lực. Đối với mỗi lệnh gọi nguồn observer.observe(source).

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

Trong ví dụ này, "cpu" là nguồn áp lực mà chúng ta quan tâm. Hiện tại, đây là nguồn duy nhất có sẵn. Trong tương lai, có thể có các nguồn khác như "gpu", "power" hoặc "thermals".

Khoảng thời gian mẫu (sampleInterval) là 2000 mili giây có nghĩa là cứ mỗi 2 giây sẽ có cập nhật tối đa.

Nếu không thể phân phát khoảng thời gian lấy mẫu đã yêu cầu, thì hệ thống sẽ cung cấp các mẫu ở khoảng thời gian phù hợp nhất hiện có. Ví dụ: nếu yêu cầu khoảng thời gian 2000 mili giây, nhưng hệ thống chỉ có thể cung cấp mẫu ở tốc độ tối đa 1000 mili giây, thì 1000 mili giây sẽ được chọn.

Để dừng quan sát một nguồn, hãy sử dụng phương thức unobserve(), như trong ví dụ sau:

observer.unobserve('cpu');

Để quan sát tất cả các nguồn cùng một lúc, hãy sử dụng phương thức disconnect() như trong ví dụ sau:

observer.disconnect();

Truy xuất bản ghi áp lực

Các bản ghi áp suất có thể được truy xuất bằng hàm callback. Hàm này sẽ được gọi mỗi khi có thay đổi về trạng thái áp lực.

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 });

Người dùng cũng có thể buộc đọc PressureRecord bằng cách gọi phương thức takeRecords().

Phương thức takeRecords() của giao diện PressureObserver sẽ trả về một mảng các đối tượng PressureRecords được lưu trữ trong trình quan sát áp lực, làm trống đối tượng đó.

Trường hợp sử dụng phổ biến nhất cho việc này là tìm nạp ngay tất cả các bản ghi áp lực đang chờ xử lý, chưa được chức năng gọi lại của trình quan sát xử lý, trước khi ngắt kết nối đối tượng tiếp nhận dữ liệu, để mọi bản ghi đang chờ xử lý đều có thể được xử lý trong khi dừng trình quan sát.

Khi gọi phương thức này, danh sách bản ghi đang chờ xử lý sẽ xoá, do đó lệnh gọi lại sẽ không chạy.

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);

Chia sẻ ý kiến phản hồi của bạn

Có điều gì về API không hoạt động như bạn mong đợi không? Bạn có thấy bất kỳ phương thức hoặc thuộc tính nào bị thiếu khi sử dụng API không? Gửi vấn đề về thông số kỹ thuật hoặc nhận xét về vấn đề hiện có trong kho lưu trữ GitHub tương ứng.

Báo cáo sự cố với quá trình triển khai

Bạn có phát hiện thấy lỗi khi triển khai Chromium không? Hay cách triển khai có khác với thông số kỹ thuật không? Hãy báo cáo lỗi tại new.crbug.com. Hãy nhớ cung cấp nhiều thông tin chi tiết nhất có thể, hướng dẫn tái tạo và nhập Blink>PerformanceAPIs>ComputePressure vào hộp Components.

Tài nguyên