Komputasi Tekanan API

Dapatkan informasi tentang tekanan komputasi sistem Anda.

Kenneth Christiansen
Kenneth Christiansen
Arnaud (Arno) Mandy

Compute Pressure API menawarkan status level tinggi yang mewakili tekanan pada sistem. Solusi ini memungkinkan implementasi menggunakan metrik hardware dasar yang tepat untuk memastikan pengguna dapat memanfaatkan semua daya pemrosesan yang tersedia selama sistem tidak sedang mengalami tekanan yang tidak terkendali.

Status saat ini

Langkah Status
1. Buat pesan penjelasan Selesai
2. Membuat draf awal spesifikasi Selesai
3. Mengumpulkan masukan & mengulangi desain Dalam proses
4. Uji coba origin Selesai
5. Peluncuran Selesai (Chrome 125)

Mencoba Compute Pressure API

Untuk bereksperimen dengan Compute Pressure API secara lokal, baca halaman ini.

Mendaftar ke uji coba origin

Mulai Chrome 115, Compute Pressure API tersedia sebagai uji coba origin. Update ini diperkirakan akan berakhir pada Chrome 123 (29 Mei 2024). Daftar di sini.

Kasus penggunaan

Kasus penggunaan utama yang ditingkatkan oleh Compute Pressure API saat ini adalah konferensi video dan video game.

Aplikasi real-time populer ini diklasifikasikan sebagai soft. Artinya, kualitas layanan akan menurun jika sistem dilakukan di luar status tertentu, tetapi tidak menyebabkan kegagalan sistem total. Aplikasi soft real-time ini sangat diuntungkan karena dapat menyesuaikan workload berdasarkan konsumsi atau tekanan CPU.

Secara khusus, versi pertama API ini bertujuan untuk memungkinkan keputusan adaptasi berikut.

Konferensi video

  • Sesuaikan jumlah feed video yang ditampilkan secara bersamaan selama panggilan dengan banyak peserta.
  • Mengurangi kualitas pemrosesan video (resolusi video, frame per detik).
  • Lewati pemrosesan video yang tidak penting, seperti beberapa filter kamera.
  • Nonaktifkan pemrosesan audio yang tidak penting, seperti peredam bising WebRTC.
  • Ubah tombol kualitas, kecepatan, dan kecepatan ke arah “kecepatan” dalam encoding video dan audio (di WebRTC, WebCodecs, atau encoding software).

Game video

  • Gunakan aset berkualitas lebih rendah untuk menyusun video game (model 3D, tekstur, shader) dan audio (suara, efek suara).
  • Nonaktifkan efek yang menghasilkan detail yang kurang realistis (air, kain, animasi api, luminans kulit, efek pantulan cahaya, atau simulasi fisik yang tidak memengaruhi gameplay).
  • Sesuaikan tombol kecepatan dengan kualitas vs. kecepatan di mesin rendering game (kualitas bayangan, pemfilteran tekstur, jarak tampilan).

Secara teknis, hal ini dapat dilakukan dengan mengetahui termal (misalnya, apakah sistem didinginkan secara pasif) dan status tekanan CPU untuk thread utama dan pekerja yang digunakan di situs. Status termal sistem adalah status global dan dapat dipengaruhi oleh aplikasi dan situs selain situs yang mengamati.

Antarmuka

Compute Pressure API dapat dijalankan dalam konteks berikut:

  • Jendela atau thread utama
  • Pekerja Khusus
  • Pekerja Bersama

Compute Pressure API menentukan dua antarmuka baru.

PressureObserver: Objek untuk mengamati tekanan komputasi sejumlah sumber pada interval sampel yang telah ditentukan. Iterasi pertama di Chromium mengekspos "cpu" sebagai source. Lihat bagian tentang parameter untuk mengetahui detail selengkapnya. Setiap observer dapat secara asinkron mengamati tren perubahan tekanan dalam sistem.

PressureRecord: Menjelaskan tren tekanan pada momen transisi tertentu. Objek dengan jenis ini hanya dapat diperoleh dengan dua cara: sebagai input untuk callback PressureObserver, atau dengan memanggil metode takeRecords() pada instance PressureObserver.

PressureObserver

Saat dibuat, objek PressureObserver akan dikonfigurasi untuk mengamati tekanan sumber yang didukung, pada interval sampel tertentu. Sumber yang didukung dapat diamati satu per satu atau tidak diamati kapan saja selama masa aktif objek PressureObserver. Interval sampel tidak dapat diubah setelah pembuatan objek.

Konstruktor

PressureObserver(callback, options): Membuat objek PressureObserver baru yang akan memanggil fungsi callback yang ditentukan saat mendeteksi bahwa perubahan nilai sumber yang diamati telah terjadi.

Konstruktor menggunakan fungsi callback wajib dan opsi opsional, sebagai parameter.

Telepon Balik

callback(): Callback dipanggil dengan array objek PressureRecord yang belum dibaca.

Opsi

PressureObserverOptions: Berisi interval sampel,sampleInterval dalam milidetik, saat pengguna meminta pembaruan.

Metode

PressureObserver.observe(source): Memberi tahu 'PressureObserver' sumber mana yang akan diamati.

PressureObserver.unobserve(source): Memberi tahu 'PressureObserver' untuk berhenti mengamati suatu sumber.

PressureObserver.disconnect(): Memberi tahu 'PressureObserver' untuk berhenti mengamati semua sumber.

PressureObserver.takeRecords(): Menampilkan urutan data, sejak pemanggilan callback terakhir.

static PressureObserver.supportedSources() (hanya baca): Menampilkan jenis sumber yang didukung oleh hardware.

Parameter

source: Sumber yang akan diamati, misalnya "cpu". Sumber ini harus merupakan salah satu jenis sumber yang didukung.

Dalam versi Compute Pressure saat ini, hanya "cpu" yang didukung.

PressureRecord

Antarmuka PressureRecord Compute Pressure API menjelaskan tren tekanan sumber pada momen transisi tertentu.

Properti Instance

PressureRecord.source (Hanya baca): Menampilkan string yang mewakili sumber asal tempat data berasal.

PressureRecord.state (Hanya baca): Menampilkan string yang mewakili status tekanan yang direkam.

PressureRecord.time (Hanya baca): Menampilkan angka yang mewakili stempel waktu resolusi tinggi.

Contoh

Apakah Compute Pressure API didukung?

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

Membuat pengamat tekanan

Buat observer tekanan dengan memanggil konstruktornya beserta fungsi callback yang akan dijalankan setiap kali ada pembaruan tekanan:

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

Interval sampel, sampleInterval, sebesar 2000 md, berarti akan ada pembaruan maksimal setiap dua detik.

Jika interval sampel yang diminta tidak dapat dilayani oleh sistem. Sistem akan memberikan sampel pada interval yang paling sesuai dan ada. Misalnya, jika interval 2.000 md diminta, tetapi sistem hanya dapat memberikan sampel dengan kecepatan maksimum 1.000 md, maka 1.000 md akan dipilih.

Menggunakan pengamat tekanan

Hanya ada satu cara untuk memulai pengamat tekanan. Untuk setiap sumber, panggil observer.observe(source).

observer.observe("cpu");

Dalam contoh ini, "cpu" adalah sumber tekanan yang kita minati. Untuk saat ini, ini adalah satu-satunya sumber yang tersedia. Di masa mendatang, mungkin ada sumber lain seperti "gpu", "power", atau "thermals".

Untuk berhenti mengamati sumber, gunakan metode unobserve(), seperti pada contoh berikut:

observer.unobserve("cpu");

Untuk tidak mengamati semua sumber sekaligus, gunakan metode disconnect(), seperti dalam contoh berikut:

observer.disconnect();

Mengambil catatan tekanan

Catatan tekanan dapat diambil dengan fungsi callback, yang akan dipanggil setiap kali perubahan terjadi dalam status tekanan.

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

Pengguna juga dapat memaksa pembacaan PressureRecord dengan memanggil metode takeRecords().

Metode takeRecords() dari antarmuka PressureObserver menampilkan array objek PressureRecords yang disimpan dalam observer tekanan, yang mengosongkannya.

Kasus penggunaan yang paling umum untuk hal ini adalah segera mengambil semua data tekanan yang tertunda, yang belum diproses oleh fungsi callback observer, sebelum memutuskan koneksi observer, sehingga setiap kumpulan data yang tertunda dapat diproses saat menonaktifkan observer.

Memanggil metode ini akan menghapus daftar catatan yang tertunda, sehingga callback tidak akan dijalankan.

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

Beri tahu kami tentang desain API

Apakah ada sesuatu pada API yang tidak berfungsi seperti yang Anda harapkan? Apakah Anda melihat metode atau properti yang hilang untuk penggunaan API? Laporkan masalah spesifikasi atau komentari masalah yang sudah ada di repo GitHub yang sesuai.

Melaporkan masalah terkait penerapan

Apakah Anda menemukan bug pada implementasi Chromium? Atau apakah implementasinya berbeda dengan spesifikasi? Laporkan bug di new.crbug.com. Pastikan Anda menyertakan detail sebanyak mungkin, petunjuk sederhana untuk mereproduksi, dan masukkan Blink>PerformanceAPIs>ComputePressure di kotak Components.

Link bermanfaat