總的來說,我提供的文件非常小。考慮圖像和小視頻。使用 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
為了避免下載被停止,我在這裡缺少什麼? varnish 是否以某種方式快取檔案?
注意:HAProxy 在 Varnish 之前運行。 Apache 是實際的 Web 伺服器。
答案1
櫃檯
請看看你的儲存櫃檯透過使用varnishstat
。
這些計數器將幫助您了解正在發生的情況:
SMA.s0.g_space
SMA.s0.g_bytes
SMA.Transient.g_bytes
g_space
讓您知道可用空間,以及g_bytes
正在使用的空間的位元組數。SMA
是你的malloc存儲,短暫的指的是不屬於快取大小的暫存。
快取大小
如果您正在處理的物件是6GB在大小上,您的-s malloc
設定至少應為大小 6 GB,否則無法分配空間,就會崩潰。
如果您的快取大小僅略大於6GB在這種情況下,Varnish 將不得不不斷地核子武器將物件從快取中取出以節省空間。請確保裡面有足夠的東西。
TTL 為 2 分鐘或更短的短命物件永遠不會在那裡結束,並且會佔用瞬間儲存
文件裝卸工
有一個文件裝卸工將使用磁碟來存儲物件。如果快取的總大小超過了您願意分配給 Varnish 的記憶體量,則可以使用此選項。
然而,隨著時間的推移文件裝卸工會減慢你的速度,因為它並沒有真正優化。它將遭受磁碟碎片的困擾,並且效能不佳。
海量儲存引擎
為了解決這些儲存問題,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
- 天藍色:https://azuremarketplace.microsoft.com/en-us/marketplace/apps/varnish.varnish-enterprise?tab=概述
- 通用控制點: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 的情況。