वेबसाइटें CPU और बैटरी कैसे बर्बाद करती हैं
(h.43z.one)- Linux लैपटॉप में white noise का पता लगाते हुए यह सामने आया कि असली आवाज़ न होने पर भी Firefox टैब PulseAudio audio sink को लगातार जगाए रखता है
module-suspend-on-idleइस तरह सेट था कि 10 सेकंड बाद audio device रुक जाए, लेकिन अगर कोई वेबसाइट AudioContext बनाती है तो sinkIDLE/SUSPENDEDमें नहीं जाता- Outlook वेब नोटिफिकेशन, x.com पर क्लिक, Google Translate में voice playback, और Discord वेब ऐप में वही व्यवहार दिखा, और सिर्फ
new AudioContext()से भी noise शुरू हो गया - माप में noise न होने पर
pulseaudioका CPU उपयोग 0.0% था, लेकिन noise होने पर 4.7% था और सिस्टम पावर लगभग 1.5W बढ़ी AudioContext.suspend()audio hardware access रोककर CPU/बैटरी उपयोग घटा सकता है, लेकिन Firefox, Chrome की तरह कुछ समय बाद अपने-आप इस बर्बादी को नहीं रोकता
audio sink के sleep में न जाने की समस्या
- नए लैपटॉप में संगीत या audio न चलने पर भी स्पीकर से हल्की लेकिन परेशान करने वाली white noise सुनाई देती थी
- Linux में PulseAudio की स्थिति देखने के लिए
pactl list sinks shortका उपयोग किया गया- audio sink की स्थिति
IDLE,SUSPENDED,RUNNINGमें से एक के रूप में दिखती है - sink
SUSPENDEDहोने पर स्पीकर शांत थे IDLEयाRUNNINGहोने पर असली playback न होने पर भी white noise हो सकती थी
- audio sink की स्थिति
/etc/pulse/default.paऔर/etc/pulse/system.paमेंmodule-suspend-on-idleलोड था- सेटिंग के मुताबिक 10 सेकंड तक निष्क्रिय रहने पर audio sink अपने-आप रुक जाना चाहिए था
- लेकिन कुछ स्थितियों में sink
IDLEमें नहीं जाता था, इसलिएSUSPENDEDतक भी नहीं पहुँच पाता था
idle audio बिजली क्यों खाता है
module-suspend-on-idleकुछ समय तक किसी stream से न जुड़े sink और source को backend से अलग कर देता है- इसका मुख्य प्रभाव पावर बचत है
- अगर PulseAudio idle अवस्था में भी sound card को खाली डेटा भेजता रहे, तो ALSA ज्यादा CPU cycles इस्तेमाल करता है
- अगर हमेशा active stream बनाए रखने की योजना न हो, तो timer को कम रखना पावर बचत के लिए बेहतर है
वजह Firefox टैब और वेबसाइटों तक सीमित हुई
- जब भी white noise सुनाई देती थी,
pactl list sink-inputsसे देखा गया कि कौन-सा प्रोग्राम audio sink का उपयोग कर रहा है - वजह हमेशा Firefox ही निकला
- खुले टैब में ऐसा कोई टैब नहीं था जिसे वास्तव में आवाज़ चलानी चाहिए थी
- कोई muted वीडियो भी नहीं था
- i3 status bar में एक छोटा script जोड़ा गया ताकि audio sink
RUNNINGहोते ही लाल संकेत दिखे - शुरुआत में pinned टैब के रूप में खुले outlook.office.com के notification sound को कारण माना गया
- ईमेल आते ही white noise शुरू हो जाती थी
- टैब refresh करने या Firefox restart करने तक यह बंद नहीं होती थी
- बाद में दूसरे वेबसाइटों में भी यही व्यवहार मिला
- x.com में कहीं भी क्लिक करते ही noise शुरू हो जाती थी
- translate.google.com में अनुवाद की आवाज़ सुनने पर भी noise होती थी
- Discord वेब ऐप केवल खुला रहने पर भी वही असर दिखाता था
CPU और पावर माप के नतीजे
- white noise न होने पर
pulseaudioका CPU उपयोग 0.0% दिखा - उसी माहौल में पावर माप आम तौर पर 4.2~5.1W के बीच था
- white noise होने पर
pulseaudioका CPU उपयोग 4.7% तक बढ़ गया - उस समय पावर माप आम तौर पर 5.8~6.7W के बीच था
- यह अंतर “लगभग कुछ भी नहीं” जैसा नहीं था, बल्कि लगभग 1.5W बढ़ोतरी के रूप में सामने आया
WebAudio API और AudioContext
- HTML/JavaScript में audio चलाने के तरीके broadly
<audio>टैग और WebAudio API में बँटते हैं - Outlook जैसे मामलों में, जहाँ आवाज़ dynamically चलाई जाती है, WebAudio API का उपयोग होता है, और audio काम करने से पहले
AudioContextबनाना पड़ता है - समस्या यह है कि सिर्फ
const audioCtx = new AudioContext();चलाने से भी स्पीकर में white noise आ जाती है - टेस्ट पेज के रूप में https://editor.43z.one/sqare/i दिया गया है
AudioContext.suspend()audio context में समय की प्रगति रोकता है और audio hardware access अस्थायी रूप से बंद कर CPU/बैटरी उपयोग घटाता हैAudioContext.resume()रुके हुए audio context में समय की प्रगति फिर शुरू करता है
Firefox और Chrome का अंतर
- कई वेबसाइटें तुरंत आवाज़ निकालने की जरूरत न होने पर भी
AudioContextबना लेती हैं, और बाद में उसे suspend नहीं करतीं - Chrome कुछ समय बाद CPU/बैटरी की बर्बादी अपने-आप रोक देता है
- Firefox अपने-आप नहीं रुकता और white noise जारी रखने वाली स्थिति में बना रहता है
- सीधा कारण वेबसाइटें हैं, लेकिन शिकायत यह है कि Firefox इस तरह की resource waste से उपयोगकर्ताओं को बचा नहीं पाता
- यह भी शक है कि Bluetooth headphones जुड़े होने पर x.com पर क्लिक के बाद white noise भेजना शुरू हो सकता है, जिससे headphones की बैटरी भी बर्बाद हो सकती है
अस्थायी उपाय: AudioContext Suspender
- समस्या कम करने के लिए एक extension बनाया गया है, जो
AudioContextको अपने-आप suspend करने और वेबसाइट द्वारा आवाज़ चलाने की कोशिश पर उसे फिर शुरू करने की कोशिश करता है - extension पूरी तरह perfect नहीं है
- दोबारा शुरू होने में थोड़ा समय लग सकता है
- audio शुरू करने के कई रास्ते होने के कारण यह हमेशा resume न हो पाए
- फिर भी बताए गए उपयोग के लिए यह काफी है
- संबंधित लिंक
- संबंधित Bugzilla issues
1 टिप्पणियां
Hacker News की टिप्पणियां
जैसा आप कल्पना कर सकते हैं, कुछ समय तक silence रहने पर
AudioContextको pause करने से यह कहीं ज़्यादा जटिल है, लेकिन फिर भी मुझे लगता है कि इसे ठीक किया जा सकता है। क्योंकि दूसरे browsers यह पहले ही कर चुके हैं, और कुछ trade-offs भी हैं जिन्हें स्वीकार किया जा सकता हैस्रोत: मैंने Firefox में इसके आसपास की बहुत-सी functionality implement की है और Web Audio API standard का editor भी हूं
ज़्यादातर लोग यहां बताई गई परिस्थितियां समझते हैं। काम बहुत है और समय सीमित है
मैंने खुद अनुभव किया है कि Firefox developers high-usage sites को users के लिए सही ढंग से चलाने के लिए expected से ज़्यादा मेहनत करते हैं। जब कोई issue users को प्रभावित करता है तो आप लोग कितनी दूर तक जाते हैं, यह पता है, इसलिए हिम्मत बनाए रखें
Browser engines और operating systems में audio handling अलग-अलग तरीके से implement होती है, इसलिए पूरी तरह inaudible sound play करके उसे API से फिर record करने पर एक signature बनता है
उस signature से यह जांचा जा सकता है कि browser user agent spoof कर रहा है या नहीं, headless mode में है या नहीं, या कोई ऐसा odd edge case तो नहीं जहां कोई real user product खरीद नहीं रहा
https://github.com/fingerprintjs/fingerprintjs/blob/3201a7d6...
Tab में playing icon नहीं दिखता, और tab को mute करने पर भी noise बंद नहीं होता
Windows volume mixer में Firefox को mute करने पर भी आवाज़ बंद नहीं होती
सुधार: desktop users के लिए यह extension सच में काफी खराब है। white noise का बार-बार on/off होना उससे कहीं ज़्यादा परेशान करने वाला है
इसलिए मैंने खुद एक program बनाया जो line पर data तो नहीं भेजता, लेकिन output को लगातार open रखता है, ताकि output idle state में न जाए
हालांकि laptop context में यह ज्यादा समझ नहीं आता, इसलिए वहां energy saving उचित है
Windows driver में stream को Always On set करने का option है। काश macOS में भी होता
play -qn &start करा दिया थालगता है कोई news site audio play करते हुए नए ads बार-बार load कर रही थी, और audio की वजह से tab power-saving state में नहीं जा रहा था। Unexpected data charges लगातार आते रहे, इसलिए आखिरकार Chrome पर switch करना पड़ा
यानी white noise नहीं था, लेकिन audio की वजह से power usage था: https://bugzilla.mozilla.org/show_bug.cgi?id=1821102
अभी भी Mac पर कुछ भी play नहीं हो रहा, फिर भी
coreaudiodCPU का 20% इस्तेमाल कर रहा है। यह battery life सच में खराब कर रहा है, इसलिए fix होने तक किसी दूसरे browser पर जाने का मन है, लेकिन ऐसी छोटी दिखने वाली चीज़ की वजह से Firefox छोड़ना नहीं चाहताUpdate: related है, लेकिन अलग bug लगता है
https://source.chromium.org/chromium/chromium/src/+/main:med...
मूल रूप से, करीब 30 seconds की silence detect होने पर यह operating system audio device-backed sink से null sink पर switch कर देता है
संदर्भ के लिए, यह approach audio device से अलग clock इस्तेमाल करती है, इसलिए कुछ reports आई हैं कि context को बाद में सच में इस्तेमाल करने पर कुछ tones में distortion होता है। workaround यह है कि site article में mentioned suspend/resume API का इस्तेमाल करे
audioContextinternally कैसे implement होता है, इसके details नहीं जानता, लेकिन लगता है कि इसमें काफी clever और dynamic handling करने वाली चीज़ें शामिल हैं। Notification sound play करनाimg href *.svgके बजाय D3 से SVG draw करने जैसा लगता हैसोच रहा हूं कि क्या notification handler जैसी simple और repeatable चीज़ों को किसी lower-level efficient API में register करने के लिए कोई Service Worker hook जैसा कुछ है
MacOS के Firefox 134.0.1 में मुझे कोई आवाज़ नहीं सुनाई देती