Udgivet: 03. april 2025 af PerfGrid

Pulse: Uge 14, 2025

Velkommen til den femte udgave af vores Pulse-serie, hvor vi deler indsigter i vores infrastrukturændringer, serviceforbedringer og andre aktiviteter bag kulisserne hos PerfGrid.

Udrulning af Varnish 7.7

Med udgivelsen af Varnish Cache 7.7 den 17. marts begyndte vi at forberede vores builds til at opgradere vores Photon Optimizer-opsætning, herunder at kompilere et par brugerdefinerede pakker mod Varnish 7.7.

Udgivelsen introducerer ikke mange nye funktioner, som er gavnlige for os; i stedet retter den primært nogle fejl, hvoraf den ene havde en bivirkning på vores logning, der bruges til statistik.

Før Varnish 7.7 kunne man stadig tilgå "response headers" i varnishncsa selvom de var fjernet i vcl_deliver VCL.

Vores logformat er let tilpasset til at inkludere detaljer som procentdelen af besparelser, når de går gennem vores Optimizer, samt oplysninger som upstream-domæne-ID, den »sti«, der er taget i vores OpenResty-opsætning, og målinger som TTFB.

For eksempel kunne man tidligere få adgang til domæne-id'et i varnishncsa ved at bruge noget i stil med %{x-dom-id}o til at læse domæne-id "response header". Men Varnish 7.7 anvender nu også set og unset-ændringer lavet i VCL korrekt på varnishncsa, hvilket betyder, at hvis en header er fjernet, vil den ikke længere være tilgængelig i varnishncsa. For at tilpasse os ændrede vi vores konfiguration til at henvise til disse headere via VSL-konteksten, f.eks. %{VSL:RespHeader:x-dom-id}x.

Vi opdagede dette under testning og kunne rette det før udrulning til de første få lokationer.

Photon Optimizer Forbedringer

I visse tilfælde, når billeder konverteres til WebP eller AVIF, kan resultatet være større end det oprindelige format, f.eks. JPEG eller PNG. Det fører til negative besparelser hvilket modvirker formålet med konverteringen. Dette problem opstår typisk med meget små billeder, normalt under 2 kilobyte.

Vi ønskede naturligvis en elegant løsning på dette. Vores første idé var at aflæse svaret, tjekke besparelserne, og hvis negative, udføre et såkaldt "sub-request" i OpenResty for at returnere det originale billede.

Selvom dette ikke er svært - OpenResty's ngx.exec kald gør sådanne "sub-requests" ligetil - betyder det stadig, at vi bruger tid på at optimere et billede til ingen nytte, for derefter at vende tilbage til originalen.

Så vi havde brug for en anden tilgang: udføre den indledende optimering, registrere negative besparelser og derefter huske resultatet for fremtidige anmodninger. Der er mange måder at gøre dette på, f.eks. ved at føre en liste over URL'er med negative besparelser og omgå optimering baseret på denne liste. Dette ville fungere godt i vores tilfælde, da antallet af berørte billeder er meget lille (hundreder), men når vi skalerer, kan dette blive en flaskehals og ville involvere flere Valkey-opslag, hvilket vi gerne vil undgå.

Varnish til Undsætning

En fantastisk ting ved Varnish er dens evne til at tilgå HTTP-headers fra cachelagrede objekter og bruge dem under revalideringer mod Photon Optimizer's origin. Når vi registrerer negative besparelser, gør vi nu to ting:

  • Sæt en lav TTL på objektet men øg dens grace TTL, så Varnish vil revalidere billedet meget hurtigere.
  • Tilføj en særlig request-header under revalidering for at instruere OpenResty om at servere det originale billede.

I OpenResty tjekker vi så blot for denne særlige request header og håndterer logikken i henhold til dette.

Derfor kan vi kortvarigt (mindre end et minut) vise et billede med negative besparelser, men derefter viser vi det originale billede, som er det optimale valg med hensyn til størrelse.

Denne tilgang giver os mulighed for at bygge logikken uden at vedligeholde nogen status eller liste over berørte URL'er. Vi udnytter simpelthen de tilgængelige objektmetadata i Varnish.

nlsh02 Flytning Fuldført

Vi har fuldført flytningen fra nlsh02 til nlsh05. De fleste hjemmesider oplevede kun 10-15 sekunders nedetid, mens hjemmesiden med den længste nedetid var offline i 7 minutter på grund af en stor database, der krævede omhyggelig håndtering for at sikre konsistens under overførslen.

Samlet set har vi observeret en forbedring på ca. 15% i Time to First Byte (TTFB) målinger for de flyttede hjemmesider. Nogle ser lidt højere forbedringer, mens andre er lidt lavere.

Som en del af flytningen har vi også identificeret et par forbedringer af vores interne værktøjer til flytning af Grid Hosting-løsninger. Vi fortsætter med at implementere disse ændringer i løbet af de næste par uger og sigter mod at have de fleste af dem klar til vores næste planlagte flytning.