Cache

Varnish 在更大的文件上崩潰

  • August 30, 2020

總的來說,我提供非常小的文件。想想圖片和小影片。用 Varnish 記憶體這些就像輕而易舉,不會給我帶來任何問題。

我遇到的問題是當我下載一個 6 GB 的文件時。這樣做時,我看到 Varnish 使用的記憶體一直在上升,直到它崩潰。然後它重新開始,直到它再次崩潰。

  1. 我想避免 Varnish 崩潰
  2. 下載因此每次都暫停並且非常慢。它應該只下載 6 GB 的文件。時期。

我已經嘗試過文件和 RAM 記憶體儲存,但沒有什麼不同。通過設置瞬態記憶體,我能夠避免崩潰; DAEMON_OPTS="-s Transient=malloc,512m"

但是,這只會導致 Varnish 使用 512MB 的那一刻,之後它會再次崩潰。

vcl_backend_response作為測試案例,我已經嘗試過

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

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

但是,這些都不能確保使用我的瀏覽器很好地下載了文件。

VarnishLog 拋出此錯誤,但我想這只是意味著記憶體已滿並因此崩潰。 FetchError Could not get storage

我在這裡錯過了什麼,以避免下載被停止?清漆是否以某種方式記憶體文件?

注意:HAProxy 執行在 Varnish 前面。Apache 是實際的 Web 伺服器。

計數器

請使用.查看您的儲存計數器varnishstat

這些計數器將幫助您了解正在發生的事情:

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

g_space讓您知道可用空間,並且g_bytes是正在使用的空間字節數。SMA是您的malloc storageTransient是指不屬於您的記憶體大小的臨時儲存。

記憶體大小

如果您正在處理大小為6GB的對象,您的-s malloc設置應至少為6 GB 大小,否則無法分配空間,它會在您身上崩潰。

如果在這種情況下您的記憶體大小僅略大於6 GB,Varnish 將不斷地從記憶體中刪除對像以節省空間。請確保裡面有足夠的東西。

TTL 為 2 分鐘或更短的短期對象永遠不會結束,並且會佔用瞬態儲存

管家檔案

有一個文件 stevedore將使用磁碟來儲存對象。如果記憶體的總大小超過了您願意分配給 Varnish 的記憶體量,則可以使用此選項。

但是,隨著時間的推移,文件 stevedore會減慢您的速度,因為它並沒有真正為此進行優化。它會受到磁碟碎片的影響,並且沒有很好的性能。

海量儲存引擎

為了解決這些儲存問題,Varnish Software 創建了海量儲存引擎 (MSE)。它能夠儲存 PB 級的數據,並且其編寫方式不會受到碎片或延遲的影響。

不幸的是,這不是一個開源的搬運工。它是 Varnish Enterprise 產品的一部分,需要許可證。但是,我們的官方雲映像(在 AWS、Azure、GCP 和 OCI 上)讓您有機會使用 Varnish Enterprise,而無需提前購買許可證。

不要記憶體大文件

另一種選擇是防止大文件被記憶體在一起。

顯然,根據內容長度排除大文件是行不通的。目前,確保大文件不消耗對象儲存記憶體的唯一方法是呼叫return(pipe).vcl_recv

這不是一個理想的解決方案,因為您應該根據傳入的請求提前知道響應將是巨大的。

return(pipe)是 Varnish 中繞過記憶體的一種機制,也可以退出HTTP 模式並進入TCP 模式。這通常用於傳入請求看起來不像 HTTP 的情況。

引用自:https://serverfault.com/questions/1031656