Varnish 在更大的文件上崩潰
總的來說,我提供非常小的文件。想想圖片和小影片。用 Varnish 記憶體這些就像輕而易舉,不會給我帶來任何問題。
我遇到的問題是當我下載一個 6 GB 的文件時。這樣做時,我看到 Varnish 使用的記憶體一直在上升,直到它崩潰。然後它重新開始,直到它再次崩潰。
- 我想避免 Varnish 崩潰
- 下載因此每次都暫停並且非常慢。它應該只下載 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 storage,Transient是指不屬於您的記憶體大小的臨時儲存。記憶體大小
如果您正在處理大小為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,而無需提前購買許可證。
- AWS:https ://aws.amazon.com/marketplace/pp/B07L7HVVMF?ref_=srh_res_product_title
- Azure:https ://azuremarketplace.microsoft.com/en-us/marketplace/apps/varnish.varnish-enterprise?tab=Overview
- GCP:https ://console.cloud.google.com/marketplace/details/varnish-public/varnish-cache-6-payg-ubuntu?q=varnish&id=6a56f7aa-357c-4032-95c9-ce008bbe534f
- OCI:https ://cloudmarketplace.oracle.com/marketplace/en_US/listing/73388855
不要記憶體大文件
另一種選擇是防止大文件被記憶體在一起。
顯然,根據內容長度排除大文件是行不通的。目前,確保大文件不消耗對象儲存記憶體的唯一方法是呼叫
return(pipe)
.vcl_recv
這不是一個理想的解決方案,因為您應該根據傳入的請求提前知道響應將是巨大的。
return(pipe)
是 Varnish 中繞過記憶體的一種機制,也可以退出HTTP 模式並進入TCP 模式。這通常用於傳入請求看起來不像 HTTP 的情況。