6 Punkte von GN⁺ 2025-02-17 | 1 Kommentare | Auf WhatsApp teilen
  • Bei der Untersuchung von White Noise auf einem Linux-Laptop zeigte sich ein Problem, bei dem ein Firefox-Tab den PulseAudio-Audiosink ständig aktiv hält, auch wenn tatsächlich kein Ton zu hören ist
  • module-suspend-on-idle war so konfiguriert, dass das Audiogerät nach 10 Sekunden angehalten wird, aber wenn eine Website einen AudioContext erstellt, wechselt der Sink nicht in IDLE/SUSPENDED
  • Dasselbe Verhalten trat bei Outlook-Webbenachrichtigungen, einem Klick auf x.com, der Sprachwiedergabe von Google Translate und in der Discord-Web-App auf; schon new AudioContext() reichte aus, damit das Rauschen begann
  • In Messungen lag die CPU-Auslastung von pulseaudio ohne Rauschen bei 0,0 %, mit Rauschen jedoch bei 4,7 %, und der Stromverbrauch des Systems stieg um etwa 1,5 W
  • AudioContext.suspend() kann den Zugriff auf die Audio-Hardware stoppen und so CPU- und Akkuverbrauch senken, aber Firefox beendet die Verschwendung nicht wie Chrome nach einer gewissen Zeit automatisch

Das Problem: Der Audiosink schläft nicht ein

  • Auf einem neuen Laptop war aus den Lautsprechern ein leises, aber störendes White Noise zu hören, selbst wenn keine Musik oder sonstige Audiodaten abgespielt wurden
  • Um den PulseAudio-Status unter Linux zu prüfen, wurde pactl list sinks short verwendet
    • Der Status eines Audiosinks erscheint als IDLE, SUSPENDED oder RUNNING
    • Wenn der Sink SUSPENDED war, blieben die Lautsprecher ruhig
    • Bei IDLE oder RUNNING konnte White Noise auftreten, auch ohne tatsächliche Audiowiedergabe
  • In /etc/pulse/default.pa und /etc/pulse/system.pa war module-suspend-on-idle geladen
    • Laut Konfiguration sollte der Audiosink nach 10 Sekunden Inaktivität automatisch angehalten werden
    • In manchen Situationen wechselte der Sink jedoch nicht in IDLE und erreichte daher auch nie SUSPENDED

Warum inaktives Audio Strom verbraucht

  • module-suspend-on-idle trennt Sinks und Sources, die eine gewisse Zeit lang mit keinem Stream verbunden sind, vom Backend
  • Der wichtigste Effekt ist Energieeinsparung
    • Wenn PulseAudio auch im Leerlauf leere Daten an die Soundkarte sendet, verbraucht ALSA mehr CPU-Zyklen
    • Wenn nicht geplant ist, dauerhaft einen aktiven Stream zu halten, ist ein kurzer Timer für die Energieeinsparung vorteilhafter

Die Ursache ließ sich auf Firefox-Tabs und Websites eingrenzen

  • Immer wenn White Noise zu hören war, wurde mit pactl list sink-inputs geprüft, welches Programm den Audiosink nutzt
  • Die Ursache war jedes Mal Firefox
    • Unter den offenen Tabs war keiner, der tatsächlich Ton hätte abspielen sollen
    • Es gab auch keine stummgeschalteten Videos
  • Zur i3-Statusleiste wurde ein kleines Skript hinzugefügt, das eine rote Markierung anzeigt, wenn der Audiosink auf RUNNING wechselt
  • Zunächst wirkte es so, als seien die Benachrichtigungstöne von outlook.office.com in einem angehefteten Tab die Ursache
    • Beim Eingang einer E-Mail begann das White Noise
    • Es stoppte erst nach einem Neuladen des Tabs oder einem Neustart von Firefox
  • Später wurde dasselbe Verhalten auch auf anderen Websites bestätigt
    • Auf x.com begann das Rauschen sofort nach einem beliebigen Klick
    • Auch beim Anhören der Übersetzungsausgabe auf translate.google.com trat das Rauschen auf
    • In der Discord-Web-App zeigte sich derselbe Effekt schon dann, wenn sie einfach geöffnet blieb

Ergebnisse der CPU- und Strommessungen

  • Ohne White Noise wurde die CPU-Auslastung von pulseaudio mit 0,0 % angezeigt
  • Im selben Umfeld lagen die Strommesswerte meist im Bereich von 4,2 bis 5,1 W
  • Mit White Noise stieg die CPU-Auslastung von pulseaudio auf 4,7 %
  • Dabei lagen die Strommesswerte meist im Bereich von 5,8 bis 6,7 W
  • Der Unterschied ist nicht vernachlässigbar und lässt sich auf ungefähr 1,5 W mehr zusammenfassen

WebAudio API und AudioContext

  • In HTML/JavaScript gibt es zwei Wege, Audio wiederzugeben: das <audio>-Tag und die WebAudio API
  • Für dynamische Klangwiedergabe wie bei Outlook wird die WebAudio API verwendet; um Audioverarbeitung zu nutzen, muss zunächst ein AudioContext erzeugt werden
  • Das Problem ist, dass schon die Ausführung von const audioCtx = new AudioContext(); White Noise aus den Lautsprechern verursachen kann
  • Als Testseite wird https://editor.43z.one/sqare/i angegeben
  • AudioContext.suspend() hält den Zeitfortschritt des Audiokontexts an und pausiert den Zugriff auf die Audio-Hardware, wodurch CPU- und Akkuverbrauch sinken können
  • AudioContext.resume() startet den Zeitfortschritt eines angehaltenen Audiokontexts wieder

Unterschiede zwischen Firefox und Chrome

  • Viele Websites erstellen einen AudioContext, obwohl sie nicht sofort Ton ausgeben müssen, und setzen ihn anschließend nicht auf suspend
  • Chrome beendet die Verschwendung von CPU und Akku nach einer gewissen Zeit automatisch
  • Firefox stoppt nicht automatisch und behält den Zustand bei, in dem es weiterhin White Noise erzeugt
  • Die unmittelbare Ursache liegt zwar bei den Websites, doch es bleibt die Kritik, dass Firefox seine Nutzer nicht vor dieser Ressourcenverschwendung schützt
  • Es besteht außerdem der Verdacht, dass bei verbundenen Bluetooth-Kopfhörern nach einem Klick auf x.com ebenfalls die Übertragung von White Noise beginnt und so deren Akku verschwendet wird

Vorläufige Gegenmaßnahme: AudioContext Suspender

1 Kommentare

 
GN⁺ 2025-02-17
Hacker-News-Kommentare
  • Das ist geplant und wichtig, und ich werde es hoffentlich bald beheben. Es ist schon lange überfällig, und es tut mir leid, dass es noch nicht erledigt ist. Es ist immer ein Kampf um Prioritäten, daher ist es schwer, alle rechtzeitig zufriedenzustellen, aber auf meiner persönlichen Prioritätenliste steht es ziemlich weit oben.
    Wie man sich vorstellen kann, ist es deutlich komplizierter, als einen AudioContext nach einer gewissen Zeit der Stille zu pausieren, aber ich denke, es lässt sich trotzdem beheben. Andere Browser haben es bereits getan, und es gibt auch Kompromisse, die vertretbar sind.
    Quelle: Ich habe in Firefox viel von der Funktionalität in diesem Bereich implementiert und bin außerdem Editor des Web-Audio-API-Standards.
    • Ich hoffe, du nimmst solche Kritik nicht persönlich. Kürzlich gab es einen Fall, in dem ein Open-Source-Maintainer solche Kritik als Frust aufgefasst hat und die Sache ziemlich eskaliert ist.
      Die meisten verstehen die hier beschriebenen Umstände. Es gibt viel zu tun, und die Zeit ist begrenzt.
      Ich habe selbst erlebt, dass Firefox-Entwickler mehr tun als erwartet, damit viel genutzte Websites für Nutzer korrekt funktionieren. Ich weiß, wie weit ihr geht, wenn ein Problem Nutzer betrifft, also bitte weiter so.
    • Ich möchte ein besserer Firefox-Nutzer werden und lokal gefundene Probleme debuggen. Ich bräuchte einen Hinweis, wo ich anfangen sollte.
  • Wenn eine Website einen Audio Context öffnet, ohne tatsächlich etwas abzuspielen, liegt das wahrscheinlich an Bot-Erkennung.
    Da Audioverarbeitung je nach Browser-Engine und Betriebssystem unterschiedlich implementiert ist, entsteht eine Signatur, wenn man einen völlig unhörbaren Ton abspielt und ihn über die API wieder aufnimmt.
    Mit dieser Signatur lässt sich prüfen, ob der Browser den User-Agent fälscht, im Headless-Modus läuft oder zu allen möglichen Sonderfällen gehört, die nicht nach einem echten Nutzer aussehen, der gerade ein Produkt kauft.
    https://github.com/fingerprintjs/fingerprintjs/blob/3201a7d6...
    • Die Browser-/Webstandard-Seite hat APIs viel zu freigiebig ausgebaut und offenbar nicht ausreichend bedacht, dass die Welt sie auf diese Weise missbrauchen würde.
    • Unter den tatsächlich kursierenden Bot-Plugins gibt es bereits welche, die einen Audio Context simulieren, um Bot-Erkennung auszutricksen. Verrückt.
    • Ich freue mich schon auf den Tag, an dem Cloudflare das einführt, um die Freiheit beim Browsen weiter einzuschränken und CPU-Zyklen zu verschwenden.
  • Wegen dieses weißen Rauschens bin ich lange fast wahnsinnig geworden, ohne die Ursache zu finden.
    Im Tab erscheint kein Wiedergabe-Icon, und selbst wenn man den Tab stummschaltet, hört das Geräusch nicht auf.
    Selbst wenn man Firefox im Windows-Lautstärkemixer stummschaltet, hört der Ton nicht auf.
    Korrektur: Für Desktop-Nutzer ist diese Erweiterung eigentlich ziemlich schlecht. Es ist noch viel störender, wenn das weiße Rauschen ständig an- und ausgeht.
    • Wenn es nicht aufhört, obwohl Firefox im Windows-Lautstärkemixer stummgeschaltet ist, klingt das eher nach einem Bug unterhalb von Firefox.
    • Ich nutze die Erweiterung auf dem Desktop ohne Probleme. Es scheint von den besuchten Websites abzuhängen. Bei Websites, die häufig Ton abspielen und stoppen, kann man die Erweiterung wohl deaktivieren.
  • Wenn die Ausgabe in den Idle-Zustand geht, verliert das digitale SPDIF-Signal die Synchronisation. Beim Start der Wiedergabe erfolgt die Neusynchronisierung nicht sofort, und man verliert ungefähr die erste Sekunde des Audios.
    Deshalb habe ich mir selbst ein Programm geschrieben, das die Ausgabe offen hält, ohne Daten über die Leitung zu schicken, damit die Ausgabe nicht in den Idle-Zustand wechselt.
    Im Laptop-Kontext ergibt das allerdings wenig Sinn; dort ist Energiesparen angebracht.
    • Mit einem FiiO K3 DAC am MacBook war das endlos nervig. Systemtöne wie Benachrichtigungen wurden wegen der Verzögerung praktisch nicht abgespielt.
      Im Windows-Treiber gibt es eine Option, den Stream auf Always On zu setzen. Ich wünschte, macOS hätte das auch.
    • Früher habe ich dasselbe mit einem USB-DAC gemacht. Ich habe lediglich beim Login play -qn & starten lassen.
  • Das scheint zu erklären, warum Firefox auf Android bei mir manchmal zufällig 10 GB Daten an einem Tag verbraucht hat. Die Mobilfunkrechnung war absurd hoch.
    Eine Nachrichtenseite hat offenbar Audio abgespielt und dabei immer wieder neue Anzeigen geladen, und wegen des Audios ging der Tab nicht in den Energiesparzustand. Wegen unerwarteter Datenkosten musste ich am Ende zu Chrome wechseln.
  • Unter macOS habe ich früher dasselbe oder ein sehr ähnliches Verhalten gesehen. Ich bin nicht sicher, ob die Website tatsächlich einen Audio Context offengehalten hat oder ob es ein internes Firefox-Problem war, weil es auch auf Websites wie Youtube auftrat, die die Web Audio API nicht verwenden.
    Es gab also kein weißes Rauschen, aber audio-bedingten Stromverbrauch: https://bugzilla.mozilla.org/show_bug.cgi?id=1821102
    Selbst jetzt nutzt coreaudiod auf dem Mac 20 % CPU, obwohl nichts abgespielt wird. Das ruiniert die Akkulaufzeit wirklich, und ich überlege, bis zur Behebung auf einen anderen Browser umzusteigen, aber ich möchte Firefox nicht wegen etwas aufgeben, das so nebensächlich wirkt.
    Update: Scheint ein verwandter, aber anderer Bug zu sein.
  • Der Code in Chromium, der diese Pausierung behandelt, ist hier:
    https://source.chromium.org/chromium/chromium/src/+/main:med...
    Im Grunde wird nach etwa 30 Sekunden erkannter Stille von einer vom Audio-Gerät des Betriebssystems gestützten Sink auf eine Null-Sink umgeschaltet.
    Zur Einordnung: Da diese Methode eine andere Uhr als das Audio-Gerät verwendet, gab es einige Berichte, dass bei bestimmten Tönen Verzerrungen auftreten, wenn der Kontext später tatsächlich genutzt wird. Der Workaround besteht darin, dass die Website die im Artikel erwähnte suspend/resume API verwendet.
  • Ich weiß nicht genau, wie audioContext intern implementiert ist, aber offenbar steckt darin einiges, das ziemlich clever und dynamisch arbeiten soll. Einen Benachrichtigungston abzuspielen wirkt ähnlich, als würde man statt img href *.svg mit D3 ein SVG zeichnen.
    Ich frage mich, ob es so etwas wie einen Service-Worker-Hook gibt, mit dem man einfache, wiederholbare Dinge wie Benachrichtigungs-Handler bei einer effizienteren API auf niedrigerer Ebene registrieren kann.
  • Sollte man tatsächlich etwas hören?
    In Firefox 134.0.1 unter macOS höre ich gar nichts.
    • Bei mir ist ebenfalls nichts zu hören, aber wenn ich auf der Demo-Seite des Autors den Button zur Tonwiedergabe drücke, steigt der Stromverbrauch um etwa 1 W.
    • In Firefox auf Android hört man ein leises weißes Rauschen.
  • Damit wurde das Problem auf der Startseite von https://www.dr.dk/ behoben.