Zähler

Zähler

Insgesamt liefere ich sehr kleine Dateien. Denken Sie an Bilder und kleine Videos. Diese mit Varnish zwischenzuspeichern ist ein Kinderspiel und bereitet mir keine Probleme.

Das Problem, das ich habe, ist, wenn ich eine 6 GB große Datei herunterlade. Dabei sehe ich, wie der von Varnish verwendete Speicher ansteigt, bis es abstürzt. Dann beginnt es von vorne, bis es erneut abstürzt.

  1. Ich möchte verhindern, dass Varnish abstürzt
  2. Der Download wird daher jedes Mal angehalten und ist sehr langsam. Es sollte nur die 6 GB große Datei heruntergeladen werden. Punkt.

Ich habe es bereits mit Datei- und RAM-Cache-Speicher versucht, aber es hat sich nichts geändert. Ich konnte einen Absturz vermeiden, indem ich den vorübergehenden Speicher eingestellt habe. DAEMON_OPTS="-s Transient=malloc,512m"

Dies führt jedoch nur dazu, dass Varnish 512 MB verwendet und danach erneut abstürzt.

vcl_backend_responseIch habe als Testfall versucht , beide

  if (std.integer(beresp.http.Content-Length, 0) > 5242880) {
        set beresp.do_stream = true;
        return (deliver);
  }

Und

  if (std.integer(beresp.http.Content-Length, 0) > 5242880) {
        set beresp.uncacheable = true;
        return (deliver);
  }

Keines von beiden stellt jedoch sicher, dass die Datei ordnungsgemäß mit meinem Browser heruntergeladen wird.

VarnishLog gibt diesen Fehler aus, aber ich vermute, das bedeutet nur, dass der Speicher voll war und es deshalb abgestürzt ist. FetchError Could not get storage

Was übersehe ich hier, um zu verhindern, dass der Download angehalten wird? Zwischenspeichert Varnish die Datei trotzdem irgendwie?

Hinweis: HAProxy läuft vor Varnish. Apache ist der eigentliche Webserver.

Antwort1

Zähler

Bitte schauen Sie sich IhreLagerthekendurch die Nutzung varnishstat.

Mithilfe dieser Indikatoren können Sie besser verstehen, was vor sich geht:

SMA.s0.g_space
SMA.s0.g_bytes
SMA.Transient.g_bytes

g_spacezeigt Ihnen den verfügbaren Speicherplatz und g_bytesdie Anzahl der Bytes an, die verwendet werden.SMA Ist Ihrmalloc-Speicher,Vorübergehendbezieht sich auf vorübergehenden Speicher, der nicht Teil Ihrer Cachegröße ist.

Cachegröße

Wenn Sie Objekte verarbeiten, die6 GBin der Größe, Ihre -s mallocEinstellungen sollten mindestens6 GB groß, andernfalls kann kein Speicherplatz zugewiesen werden und es stürzt ab.

Wenn Ihre Cache-Größe nur geringfügig größer ist als6 GBIn diesem Fall muss Varnish ständigAtombombeObjekte aus dem Cache, um Platz zu sparen. Bitte stellen Sie sicher, dass genügend Platz vorhanden ist.

Kurzlebige Objekte mit einer TTL von 2 Minuten oder weniger landen nie dort und belegen denvorübergehende Speicherung

Datei-Schaufeler

Da ist einDatei-SchaufelerDabei wird die Festplatte zum Speichern von Objekten verwendet. Dies kann verwendet werden, wenn die Gesamtgröße Ihres Caches die Speichermenge überschreitet, die Sie Varnish zuweisen möchten.

Doch mit der ZeitDatei-Schaufelerwird Sie verlangsamen, da es dafür nicht wirklich optimiert ist. Es wird unter Festplattenfragmentierung leiden und hat keine großartige Leistung.

Massive Speicher-Engine

Um diese Speicherprobleme zu lösen, hat Varnish Software dasMassive Speicher-Engine (MSE). Es kann Petabyte an Daten speichern und ist so geschrieben, dass es nicht unter Fragmentierung oder Verzögerungen leidet.

Leider handelt es sich hierbei nicht um einen Open-Source-Stevedore. Es ist Teil des Varnish Enterprise-Angebots, für das eine Lizenz erforderlich ist. Unsere offiziellen Cloud-Images (auf AWS, Azure, GCP und OCI) bieten Ihnen jedoch die Möglichkeit, mit Varnish Enterprise zu arbeiten, ohne im Voraus eine Lizenz erwerben zu müssen.

Keine großen Dateien im Cache speichern

Eine andere Möglichkeit besteht darin, die Zwischenspeicherung großer Dateien vollständig zu verhindern.

Offenbar funktioniert es nicht, große Dateien aufgrund ihrer Inhaltslänge auszuschließen. Derzeit ist der einzige Weg, um sicherzustellen, dass kein Objektspeicher für große Dateien verbraucht wird, der Aufruf return(pipe)von vcl_recv.

Dies ist keine ideale Lösung, da Sie aufgrund der eingehenden Anfrage bereits im Voraus wissen sollten, dass die Antwort sehr groß sein wird.

return(pipe)ist ein Mechanismus in Varnish, um den Cache zu umgehen, aber auch, um ausHTTP-Modusund gehe inTCP-ModusDies wird normalerweise in Fällen verwendet, in denen eine eingehende Anfrage nicht wie HTTP aussieht.

verwandte Informationen