Komputasi Tekanan API

Dapatkan informasi tentang tekanan komputasi sistem Anda.

Kenneth Christiansen
Kenneth Christiansen
Arnaud (Arno) Mandy

Compute Pressure API menawarkan status tingkat tinggi yang mewakili tekanan pada sistem. Hal ini memungkinkan implementasi menggunakan metrik hardware yang tepat untuk memastikan bahwa pengguna dapat memanfaatkan semua daya pemrosesan yang tersedia selama sistem tidak mengalami stres yang tidak dapat dikelola.

Status saat ini

Langkah Status
1. Membuat penjelasan Selesai
2. Membuat draf awal spesifikasi Selesai
3. Mengumpulkan masukan & melakukan iterasi pada desain Sedang berlangsung
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 untuk uji coba origin

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

Kasus penggunaan

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

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

Secara khusus, versi pertama API ini bertujuan untuk mengaktifkan 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.
  • Menonaktifkan pemrosesan audio yang tidak penting, seperti peredam bising WebRTC.
  • Putar tombol kualitas versus kecepatan dan ukuran versus kecepatan ke "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 non-esensial yang kurang realistis (air, kain, animasi api, luminans kulit, efek silau, atau simulasi fisik yang tidak memengaruhi gameplay).
  • Sesuaikan tombol kualitas versus kecepatan di mesin rendering game (kualitas bayangan, pemfilteran tekstur, jarak pandang).

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 situs. Status termal sistem adalah status global dan dapat dipengaruhi oleh aplikasi dan situs selain situs pengamatan.

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 dari 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 mengamati tren perubahan tekanan secara asinkron dalam sistem.

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

PressureObserver

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

Konstruktor

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

Konstruktor menggunakan fungsi callback wajib.

Telepon Balik

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

Metode

PressureObserver.observe(source, options): Memberi tahu 'PressureObserver' sumber yang akan diamati dan options opsional, sebagai parameter.

Opsi

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

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

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

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

static PressureObserver.knownSources() (hanya baca): Menampilkan jenis sumber yang diketahui agen pengguna dalam urutan abjad.

Parameter

source: Sumber yang akan diamati, misalnya "cpu". Jenis ini harus berupa 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 dicatat.

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

Contoh

Bagian berikut mencantumkan contoh penggunaan.

Menentukan dukungan API

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

Membuat observer tekanan

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

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

Penggunaan observer tekanan

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

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

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".

Interval sampel, sampleInterval, sebesar 2.000 md, berarti akan ada update paling banyak setiap dua detik.

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

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

observer.unobserve('cpu');

Untuk membatalkan pengamatan semua sumber sekaligus, gunakan metode disconnect(), seperti dalam contoh berikut:

observer.disconnect();

Mengambil data tekanan

Data 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);
await observer.observe('cpu', { sampleInterval: 1_000 });

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

Metode takeRecords() antarmuka PressureObserver menampilkan array objek PressureRecords yang disimpan di observer tekanan, sehingga 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 data yang tertunda dapat diproses saat mematikan observer.

Memanggil metode ini akan menghapus daftar data yang tertunda, sehingga callback tidak akan berjalan.

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

Beri masukan

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

Melaporkan masalah terkait penerapan

Apakah Anda menemukan bug pada penerapan Chromium? Atau apakah penerapannya berbeda dengan spesifikasinya? Ajukan bug di new.crbug.com. Pastikan untuk menyertakan detail sebanyak mungkin, petunjuk untuk mereproduksi, dan masukkan Blink>PerformanceAPIs>ComputePressure di kotak Components.

Resource