...

Brotli-komprimeringsnivå: Prestanda eller CPU-förbrukning?

Brotli-komprimering tvingar mig att göra en tydlig avvägning mellan mindre överföringsstorlek och ökad CPU-användning. Jag visar hur jag för dynamiska svar oftast uppnår den bästa balansen mellan tid och storlek med nivå 4–6, och när nivå 9–11 ger verkliga fördelar för förpackade tillgångar.

Centrala punkter

Följande punkter ger mig en översiktlig vägledning för planering och drift:

  • Val av nivå: Högre nivåer sparar byte, men kräver mer CPU-kapacitet och tid.
  • Dynamik: För livekomprimering ger nivå 4–6 ofta den bästa balansen.
  • Statisk: Förpackade tillgångar drar nytta av nivå 9–11.
  • Jämförelse: Brotli komprimerar ofta texten mer, medan Gzip komprimerar snabbare.
  • Drift: Mätvärden som TTFB, CPU-belastning och felprocent styr valet.

Varför Brotli-nivån är viktig

Det bestämmer jag Kompressionsnivå inte utifrån magkänsla, utan utifrån insats och nytta. För varje nivå ökar beräkningsarbetet, medan den ytterligare besparingen i byte från en viss punkt bara blir marginell. Det är just här som fördelen vänds: En fil som är några procentenheter mindre motiverar inte alltid mer latens och CPU-belastning. Särskilt vid livekomprimering saktar en för hög nivå ner svarstiden, även om dataöverföringen minskar minimalt. Jag använder därför mätningar och tittar på latens, beräkningstid och genomströmning innan jag fastställer nivån.

När jag medvetet väljer att inte komprimera

Det är inte varje byte som ger någon meningsfull tidsbesparing. Mycket små svar (t.ex. under 1–2 KB) och redan komprimerade binära format ger knappt någon vinst, men belastar ändå processorn. Därför använder jag Tröskelvärden per MIME-typ och rutt:

  • Korta textutdrag eller 204/304-svar: leverera utan komprimering.
  • Bilder, videor, PDF-filer, arkivfiler: uteslut generellt (ofta redan komprimerade internt).
  • Svar vid stor strömning: helst med Gzip eller helt utan, för att undvika latensspikar.

Genom tydliga uteslutningar avlastar jag arbetarna och håller P95/P99-TTFB stabilt.

Encoder-parametrar som gör skillnaden

Förutom kvalitetsnivån påverkar Encoder-alternativ Tid och förnuft märks tydligt:

  • Läge (generic, text, font): För HTML/CSS/JS anger jag „text“, för teckensnitt „font“. Det hjälper kodaren att bättre känna igen mönster.
  • Fönsterstorlek (lgwin): Större fönster förbättrar ofta läsbarheten vid långa texter, men kräver mer RAM och CPU-resurser. Jag håller mig till standardinställningarna av praktiska skäl och ökar storleken endast för särskilda textblock.
  • Blockstorlek: För små block försämrar förhållandet, för stora ökar latensen. Jag testar med representativa nyttolaster istället för att göra en generell inställning.
  • Flush-strategi: Aggressiv tömning minskar buffertfördröjningen, men minskar samtidigt komprimeringen. För API:er med serverstreaming väljer jag en återhållsam tömningsfrekvens.

Dynamiskt innehåll: Sweet Spot 4–6

När det gäller HTML-, JSON- eller API-svar komprimerar jag i realtid och är noga med att Svarstid. Nivå 4–6 ger oftast den bästa balansen mellan filstorlek, CPU-användning och latens. Det sänker TTFB, håller belastningen inom rimliga gränser och ökar reservkapaciteten vid toppbelastningar. När jag testar högre nivåer ser jag ofta ökande CPU-tider utan märkbar fördel i nätverket. Den som vill fördjupa sig ytterligare hittar många praktiska detaljer om CPU-belastning jämfört med nivå, som just visar denna kompromiss.

Med Streaming (t.ex. SSE eller Chunked JSON) avstår jag ibland från Brotli eller väljer medvetet lägre nivåer. Bakgrund: Brotli utnyttjar sammanhang över längre avsnitt; frekvent tömning förstör denna fördel och ökar CPU-belastningen. Jag avväger därför för varje rutt om genomströmning eller latens är viktigare och om mikrocacher kan hantera svar med en sekunds intervall.

Statiska tillgångar: Komprimera i förväg

När det gäller CSS, JavaScript och andra resurser komprimerar jag dem innan de levereras och accepterar högre beräkningstid på byggservern. Nivå 9–11 passar bra här, eftersom kostnaden endast uppstår en gång och varje ytterligare besparing ger bestående effekt. Det lönar sig särskilt vid många återkommande nedladdningar och vid långsamma anslutningar. Jag lagrar de komprimerade artefakterna bredvid originalet och låter servern leverera rätt format beroende på klienten. Det är viktigt att planera in tillräckligt med CPU och RAM vid byggningen så att distributionerna går smidigt.

I builden fastställer jag tydliga Uteslutningsregler (t.ex. inga .jpg/.png/.mp4/.zip/.woff2), versionshantering och cache-busting via filnamn. På så sätt förblir ETags konsekventa och jag förhindrar dubbelkomprimering. För stora paket delar jag upp filerna om applikationen tillåter det; mindre, tematiskt sorterade artefakter går bättre att cacha och drar oproportionerligt stor nytta av Brotli-ordlistan.

Brotli kontra Gzip i vardagen

Textformat som HTML, CSS eller JS komprimeras oftast något mer med Brotli, medan Gzip ofta komprimerar snabbare och tar mindre CPU behövs. För livekomprimering på högtrafikerade sidor har jag därför Gzip som reservlösning, ifall CPU-belastningen ökar. För statiska resurser föredrar jag Brotli, eftersom den mindre överföringsstorleken ger effekt vid varje hämtning. På äldre system eller vid proxykedjor är jag flexibel och använder båda formaten. En bra introduktion till den direkta jämförelsen ger Brotli vs. Gzip med typiska styrkor och svagheter.

Det som är viktigt för mig är Kapacitetsplanering: Om genomströmningen (förfrågningar per sekund) är måttet, är Gzip bäst när CPU-resurserna är knappa. Om bandbredd eller CDN-utgående trafik är kostsam, lönar sig Brotli mycket snabbt för tillgångar. Därför kombinerar jag båda: Brotli som standard för statiska resurser och Gzip som en flexibel reserv för live-trafik.

CPU-budget, latens och TTFB

Jag definierar först en tydlig CPU-budget per förfrågan och anpassar nivån därefter. På så sätt förhindrar jag att komprimering dominerar TTFB eller att toppbelastningar leder till fel. Det är användbart att dela in efter användningssyfte och utgå från relativa effekter istället för exakta siffror. Tabellen nedan visar hur jag kopplar samman nivåer och scenarier. Den ersätter inte en benchmark, men ger en tillförlitlig utgångspunkt för tester.

Brotli-nivå CPU-resurser/tidsåtgång Storleksbesparing Lämplig för Ledtråd
1-3 låg måttlig Live-komprimering med begränsade resurser Snabb, men mindre besparing
4-6 Medium bra Dynamiska HTML-/API-svar Ofta den Bra plats för TTFB
7–8 höjd mycket bra Blandade scenarier, delvis live, delvis förinspelade Endast om det finns luft i CPU-budget
9-11 hög högst Förkomprimerade statiska tillgångar Byggtiden ökar, överföringen minskar

Innehållsförhandling, Vary och cache-nycklar

För att kunderna ska kunna få den bästa varianten på ett tillförlitligt sätt anser jag att Förhandling av innehåll ren:

  • Vary: Acceptera-kodning Det är absolut nödvändigt, annars levererar cacher felaktiga format till efterföljande klienter.
  • Spara den förkomprimerade .br-filen bredvid originalfilen; servern hanterar den korrekt Innehållskodning: br och den passande Innehållstyp.
  • När det gäller CDN ser jag till att Cache-nycklar „Ta hänsyn till “Accept-Encoding” och cacha Brotli och Gzip separat.
  • När det gäller ETag/Last-Modified håller jag mig konsekvent: Komprimerade och okomprimerade artefakter får egna validerare för att undvika avvikelser.

Jag testar dessutom hur proxyservrar och äldre HTTP/1.1-klienter reagerar. Om det råder osäkerhet prioriterar jag stabilitet och låter Gzip vara aktiverat eller levererar okomprimerat.

Caching, ordböcker och förkomprimering

Jag avlastar servern genom att Caching av komprimerade svar, där innehållet tillåter det. För återkommande mönster i text lönar det sig att titta på ordböcker, som ökar utnyttjandegraden och minskar tiden per förfrågan. När jag använder förkomprimering ser jag till att cache-headers och filnamn med ändelser som .br är korrekta, så att servern kan leverera utan omkodning. För dynamiskt innehåll undersöker jag edge-cacher eller mikrocacher med löptider på några sekunder, vilket avlastar hot paths avsevärt. På så sätt håller jag CPU-användningen förutsägbar och säkerställer jämna svarstider.

Ordböcker Jag använder detta strategiskt när många svar innehåller liknande token (t.ex. namnutrymmen, JSON-nycklar). Jag håller ordböckerna små och versionerar dem så att jag kan byta ut dem utan driftstopp. För dynamiska API:er är vinstmarginalen mindre, men det lönar sig om trafiken är homogen.

Konfiguration: Nginx, Apache, CDN

Jag aktiverar Brotli specifikt per MIME-typ och blockerar binära format som sällan ger någon fördel. I Nginx ställer jag in olika nivåer via map beroende på filstorlek och sökväg för att skona ”hot routes”. I Apache hanterar jag det på liknande sätt med filterkedjor och tydliga undantag. När det gäller CDN:er använder jag förkomprimering och Vary-headers så att klienterna på ett tillförlitligt sätt får rätt format. En bra utgångspunkt för konfigurationer finns i guiden till HTTP-komprimering med praktiska alternativ.

Dessutom definierar jag en minsta storlek (min_length), från och med vilken komprimeringen aktiveras, och se till att omvända proxyservrar inte komprimerar på nytt. Dubbelkodning upptäcker jag omedelbart genom felaktiga Content-Length-rubriker eller klientfel. För Partiellt innehåll (intervallförfrågningar) Jag har originalfilerna tillgängliga; komprimerade versioner är här endast lämpliga i begränsad utsträckning och kan förvirra cachen.

Övervakning och jämförelser

Jag mäter varje förändring av Nivåer med kontrollerade prestandatester och produktionsmått. Viktiga parametrar är TTFB, genomströmning, CPU-belastning per arbetare och felprocent under belastning. För dynamiska rutter testar jag p95/p99-värden, eftersom extremvärden påverkar användarupplevelsen. Jag jämför dessutom trafikmixen och resursstorlekarna före och efter övergången för att upptäcka eventuella bieffekter. Först när värdena förblir stabila under flera dagar fastställer jag profilen som den nya baslinjen.

Min Testämne I korthet:

  • Använd representativa nyttolaster (små/medelstora/stora) och äkta rubriker.
  • Genomför uppvärmning och kör sedan mätfönstret med en stabil belastning.
  • Övervaka konkurrerande systemfaktorer (GC, I/O, TLS-avlastning) separat.
  • Jämför alltid „likt med likt“: identiska seed-värden, identiska datamängder.

Säkerhet och gränsfall

Komprimering kan främja sidokanaler om dolda token hamnar i reflekterade svar. Jag Inaktivera komprimering på känsliga slutpunkter (inloggningsflöden, CSRF-token i HTML) eller separera dessa till egna rutter. När det inte går att undvika minskar jag kontexten (t.ex. genom mer neutrala mallar) för att minimera längdskillnader som beror på data.

Andra fallgropar i praktiken:

  • Skadade föremål på grund av misslyckade kompileringar: Kontrollera kontrollsummorna före distribution och se till att filändelserna (.br) och MIME-typerna är korrekta.
  • Inkompatibla proxyservrar: Vid oförklarliga 206/Content-Encoding-fel ska fallback till Gzip aktiveras.
  • Tidsfrister Vid höga nivåer: Sänk nivåerna eller öka antalet arbetare/CPU-kvoter.
  • Saknade Vary-rubriker: Leder till „felaktiga“ svar i CDN-cachen, vilket visar sig som visningsfel i vissa webbläsare.

Prioriteringar efter projektfas

I de tidiga faserna håller jag nivån låg till medelhög, så att Iteration och se till att driftsättningarna förblir snabba. Så snart trafiken ökar optimerar jag statiska tillgångar mer aggressivt och finjusterar dynamiska svar för att hitta den optimala balansen. När trafiktoppar hotar föredrar jag att skala upp antalet arbetare och cachekapaciteten istället för att tanklöst höja nivån. För internationella målgrupper investerar jag i förkomprimering och edge-caching, eftersom varje millisekund på nätet räknas. På så sätt förblir plattformen pålitlig utan att slösa bort resurser.

WordPress och webbhotell i praktiken

I WordPress-Stacks aktiverar jag Brotli på serversidan, inte via Plugin i PHP-sökvägen för att undvika CPU-överbelastning. Jag låter byggpipelines packa tillgångarna i förväg och kombinerar detta med cache-ogiltigförklaring efter driftsättningen. Objektcache och sidcache minskar dessutom den dynamiska komprimeringen. Som fallback-lösning håller jag Gzip aktiverat så att även ovanliga klienter får korrekta svar. Den som planerar att komma igång kan använda den här praktiska guiden som riktlinje och stegvis gå vidare till högre nivåer så snart telemetrin tillåter det.

När det gäller multisite-konfigurationer och headless-teman anser jag att pro‑Route olika profiler tillgängliga: API-rutter med nivå 4–5, HTML-renderingsvägar med 5–6 och statiska paket som strikt förbereds i förväg med 10–11. Det är viktigt att jag kopplar cachenycklar och rensningslogik korrekt till de nya artefaktnamnen, så att inga föråldrade .br-filer finns kvar i omlopp.

Felsökning och vanliga fallgropar

Om något hackar går jag tillväga på ett strukturerat sätt:

  • Dubbel kompression: Kontrollera om uppströms (app-servern) redan komprimerar och om edge-servern omkodar på nytt. Lösning: Låt endast en instans sköta detta.
  • Felaktig Content-Length: Vid Transfer-Encoding: chunked ska ingen fast längd anges; annars avbryter webbläsarna nedladdningen.
  • Saknade original: För Range-förfrågningar, Alt-klienter och felsökning måste okomprimerade filer finnas tillgängliga.
  • För aggressiv svårighetsgrad: Symtomen är stigande p99-TTFB, sporadiska 5xx-fel och CPU-överbelastning. Åtgärd: Sänk nivån eller öka cachelagringen.
  • Förändring i tillgångssammansättningen: Efter uppdateringar av ramverket förändras tokenfrekvenserna – förhållandet kan plötsligt försämras. Gör en ny jämförelse och anpassa ordlistorna.

Kortfattat sammanfattat

Jag väljer nivåerna medvetet och kopplar dem till svåra Mätetal. För dynamiskt innehåll använder jag oftast nivå 4–6, eftersom TTFB är avgörande och CPU-toppar blir kostsamma. Statiska tillgångar komprimerar jag i förväg med nivå 9–11, eftersom varje ytterligare procentenhet i besparing ger mångfaldig effekt här. Brotli ger ofta de bästa filstorlekarna, medan Gzip utmärker sig när det gäller hastighet och som reservlösning. Det avgörande är fortfarande den egna telemetrin: den som mäter och itererar hittar snabbt rätt profil för trafik, hårdvara och användarupplevelse.

Aktuella artiklar