Bagaimana Situs Web Membuang CPU dan Baterai
(h.43z.one)- Saat menelusuri white noise pada laptop Linux, terungkap masalah bahwa tab Firefox terus membuat sink audio PulseAudio tetap aktif meski tidak ada suara nyata
module-suspend-on-idletelah dikonfigurasi untuk menghentikan perangkat audio setelah 10 detik, tetapi ketika situs web membuat AudioContext, sink tidak turun keIDLE/SUSPENDED- Fenomena yang sama muncul pada notifikasi web Outlook, klik di x.com, pemutaran suara Google Translate, dan aplikasi web Discord; bahkan
new AudioContext()saja sudah memulai noise - Dalam pengukuran, saat tidak ada noise penggunaan CPU
pulseaudioadalah 0,0%, tetapi saat ada noise menjadi 4,7%, dan daya sistem naik sekitar 1,5W AudioContext.suspend()dapat menghentikan akses ke hardware audio dan mengurangi penggunaan CPU/baterai, tetapi Firefox tidak otomatis menghentikan pemborosan setelah beberapa waktu seperti Chrome
Masalah sink audio yang tidak tidur
- Pada laptop baru, bahkan saat musik atau audio tidak diputar, terdengar white noise yang samar tetapi mengganggu dari speaker
- Untuk memeriksa status PulseAudio di Linux, digunakan
pactl list sinks short- Status sink audio muncul sebagai salah satu dari
IDLE,SUSPENDED, atauRUNNING - Saat sink berada di
SUSPENDED, speaker senyap - Saat
IDLEatauRUNNING, white noise bisa muncul meski tidak ada suara yang benar-benar diputar
- Status sink audio muncul sebagai salah satu dari
- Di
/etc/pulse/default.padan/etc/pulse/system.pa,module-suspend-on-idletelah dimuat- Berdasarkan konfigurasi, sink audio seharusnya otomatis dihentikan jika tidak aktif selama 10 detik
- Namun dalam beberapa situasi, sink tidak masuk ke
IDLEsehingga juga tidak bisa mencapaiSUSPENDED
Mengapa audio idle mengonsumsi daya
module-suspend-on-idlememutus sink dan source yang tidak terhubung ke stream selama jangka waktu tertentu dari backend- Efek utamanya adalah penghematan daya
- Jika PulseAudio mengirim data kosong ke sound card meski dalam keadaan idle, ALSA menggunakan lebih banyak siklus CPU
- Jika tidak berencana mempertahankan stream yang selalu aktif, mengatur timer lebih rendah lebih menguntungkan untuk penghematan daya
Penyebab dipersempit ke tab Firefox dan situs web
- Setiap kali white noise terdengar,
pactl list sink-inputsdigunakan untuk memeriksa program mana yang memakai sink audio - Penyebabnya selalu Firefox
- Tidak ada tab terbuka yang seharusnya memutar suara nyata
- Tidak ada video yang di-mute
- Sebuah skrip kecil ditambahkan ke status bar i3 agar menampilkan penanda merah ketika sink audio menjadi
RUNNING - Awalnya, bunyi notifikasi dari outlook.office.com yang dibuka sebagai tab tetap tampak seperti penyebabnya
- Saat menerima email, white noise mulai muncul
- Tidak berhenti sampai tab di-refresh atau Firefox di-restart
- Setelah itu, fenomena yang sama juga dikonfirmasi di situs web lain
- Di x.com, noise mulai muncul begitu mengklik di mana saja
- Noise juga muncul saat mendengarkan suara terjemahan di translate.google.com
- Aplikasi web Discord menimbulkan efek yang sama hanya dengan membiarkannya terbuka
Hasil pengukuran CPU dan daya
- Saat tidak ada white noise, penggunaan CPU
pulseaudioditampilkan sebagai 0,0% - Dalam lingkungan yang sama, nilai pengukuran daya umumnya berada di kisaran 4,2–5,1W
- Saat ada white noise, penggunaan CPU
pulseaudionaik menjadi 4,7% - Pada saat itu, nilai pengukuran daya umumnya berada di kisaran 5,8–6,7W
- Perbedaannya bukan “nyaris tidak berarti”, dan dapat dirangkum sebagai kenaikan sekitar 1,5W
WebAudio API dan AudioContext
- Cara memutar audio di HTML/JavaScript terbagi menjadi dua: tag
<audio>dan WebAudio API - Untuk kasus pemutaran suara secara dinamis seperti Outlook, digunakan WebAudio API, dan untuk melakukan pekerjaan audio harus membuat
AudioContextterlebih dahulu - Masalahnya, hanya dengan menjalankan
const audioCtx = new AudioContext();, white noise sudah muncul dari speaker - Halaman uji disediakan di https://editor.43z.one/sqare/i
AudioContext.suspend()menghentikan progres waktu audio context dan menangguhkan akses ke hardware audio, sehingga mengurangi penggunaan CPU/bateraiAudioContext.resume()memulai kembali progres waktu audio context yang dihentikan
Perbedaan Firefox dan Chrome
- Banyak situs web membuat
AudioContextmeski tidak perlu segera mengeluarkan suara, lalu setelah itu tidak melakukan suspend - Chrome otomatis menghentikan pemborosan CPU/baterai setelah beberapa waktu
- Firefox tidak berhenti secara otomatis dan tetap mempertahankan kondisi yang terus menghasilkan white noise
- Situs web memang menjadi penyebab langsung, tetapi masih ada keluhan bahwa Firefox gagal melindungi pengguna dari pemborosan resource seperti ini
- Ada dugaan bahwa ketika headphone Bluetooth terhubung, setelah klik di x.com transmisi white noise juga mulai terjadi dan dapat memboroskan baterai headphone
Penanganan sementara: AudioContext Suspender
- Untuk meredakan masalah ini, dibuat ekstensi yang otomatis menghentikan
AudioContext, lalu memulainya kembali ketika situs web mencoba memutar suara - Ekstensi ini tidak sempurna
- Butuh sedikit waktu untuk memulai kembali
- Karena ada berbagai jalur untuk memulai audio, tidak selalu bisa dilanjutkan kembali
- Meski begitu, cukup untuk tujuan penggunaannya
- Tautan terkait
- Isu Bugzilla terkait
1 komentar
Komentar Hacker News
Seperti yang bisa dibayangkan, ini jauh lebih rumit daripada sekadar menjeda
AudioContextsetelah beberapa waktu hening, tetapi saya rasa tetap bisa diperbaiki. Alasannya, browser lain sudah melakukannya, dan ada kompromi yang bisa diterimaSumber: saya banyak mengimplementasikan fitur di sekitar ini di Firefox dan juga editor standar Web Audio API
Sebagian besar orang memahami kondisi yang dijelaskan di sini. Banyak yang harus dikerjakan dan waktu terbatas
Saya sendiri pernah mengalami bahwa developer Firefox berusaha melampaui ekspektasi agar situs yang banyak dipakai berjalan dengan benar untuk pengguna. Saya tahu sejauh apa mereka akan bergerak ketika masalah berdampak pada pengguna, jadi semoga tetap semangat
Karena tiap mesin browser dan sistem operasi mengimplementasikan pemrosesan audio secara berbeda, jika memutar suara yang sepenuhnya tidak terdengar lalu merekamnya kembali melalui API, akan muncul sebuah signature
Dengan signature itu bisa diperiksa apakah browser memalsukan user agent, berjalan dalam mode headless, atau berbagai kasus aneh lain yang bukan situasi pengguna sungguhan sedang membeli produk
https://github.com/fingerprintjs/fingerprintjs/blob/3201a7d6...
Tidak ada ikon sedang memutar di tab, dan meski tab di-mute, bunyinya tidak berhenti
Meski Firefox di-mute lewat Windows Volume Mixer, suaranya tetap tidak berhenti
Koreksi: untuk pengguna desktop, ekstensi ini sebenarnya cukup buruk. White noise yang terus menyala dan mati justru jauh lebih mengganggu
Jadi saya membuat sendiri program yang tidak mengalirkan data ke line, tetapi tetap membiarkan output terbuka agar output tidak masuk ke kondisi idle
Namun dalam konteks laptop ini kurang masuk akal, jadi penghematan energi memang tepat di sana
Di driver Windows ada opsi untuk mengatur stream menjadi Always On. Andai ada juga di macOS
play -qn &dijalankan saat loginSepertinya sebuah situs berita memutar audio sambil berulang-ulang memuat iklan baru, dan karena audio itu tab tidak masuk mode hemat daya. Karena terus muncul biaya data tak terduga, akhirnya saya harus pindah ke Chrome
Artinya tidak ada white noise, tetapi ada konsumsi daya akibat audio: https://bugzilla.mozilla.org/show_bug.cgi?id=1821102
Bahkan sekarang di Mac, saat tidak ada apa pun yang diputar,
coreaudiodmemakai CPU 20%. Ini benar-benar merusak daya tahan baterai, jadi saya sempat berpikir pindah ke browser lain sampai diperbaiki, tetapi saya tidak ingin meninggalkan Firefox hanya karena hal yang tampak sepele seperti iniPembaruan: sepertinya terkait, tetapi merupakan bug yang berbeda
https://source.chromium.org/chromium/chromium/src/+/main:med...
Pada dasarnya, setelah mendeteksi keheningan sekitar 30 detik, ia beralih dari sink yang didukung perangkat audio sistem operasi ke null sink
Sebagai catatan, karena cara ini memakai clock yang berbeda dari perangkat audio, beberapa kali ada laporan bahwa distorsi muncul pada nada tertentu ketika context kemudian benar-benar dipakai. Solusinya adalah situs memakai suspend/resume API yang disebutkan dalam artikel
audioContextdiimplementasikan secara internal, tetapi tampaknya ada banyak elemen yang mencoba menanganinya secara cukup cerdas dan dinamis. Memutar suara notifikasi terasa mirip seperti menggambar SVG dengan D3 alih-alihimg href *.svgSaya penasaran apakah ada semacam hook Service Worker untuk mendaftarkan hal-hal sederhana dan berulang seperti handler notifikasi ke API lapisan lebih rendah yang efisien
Di Firefox 134.0.1 pada MacOS, saya tidak mendengar suara apa pun