櫃檯

櫃檯

總的來說,我提供的文件非常小。考慮圖像和小視頻。使用 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

為了避免下載被停止,我在這裡缺少什麼? 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,而無需事先購買授權。

不要緩存大文件

另一種選擇是防止大檔案一起快取。

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

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

return(pipe)是Varnish中的一種機制,可以繞過緩存,也可以走出去HTTP模式並進入TCP模式。這通常用於傳入請求不像 HTTP 的情況。

相關內容