全体的に、私は非常に小さなファイルを提供しています。画像や小さなビデオについて考えてみましょう。これらを 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 の前で実行されています。実際の Web サーバーは Apache です。
答え1
カウンター
ぜひご覧ください収納カウンターを使用しますvarnishstat
。
何が起こっているかを理解するのに役立つカウンターは次のとおりです。
SMA.s0.g_space
SMA.s0.g_bytes
SMA.Transient.g_bytes
g_space
g_bytes
使用可能なスペースと、使用中のスペースのバイト数を知ることができますSMA
。malloc ストレージ、一時的キャッシュ サイズの一部ではない一時的なストレージを指します。
キャッシュサイズ
オブジェクトを処理する場合、6GBサイズが小さい場合は、-s malloc
設定は少なくともサイズは6GBそうしないと、スペースを割り当てることができず、クラッシュしてしまいます。
キャッシュサイズが6GBこの場合、Varnishは常に核兵器スペースを節約するために、キャッシュからオブジェクトを削除します。十分な量があることを確認してください。
TTLが2分以下の短命オブジェクトはそこに保存されることはなく、一時保存
ファイル スティーブドア
そこにはファイル スティーブドアディスクを使用してオブジェクトを保存します。これは、キャッシュの合計サイズが Varnish に割り当てるメモリの量を超える場合に使用できます。
しかし、時間が経つにつれて、ファイル スティーブドア実際には最適化されていないため、速度が低下します。ディスクの断片化が発生し、パフォーマンスも低下します。
大規模ストレージエンジン
これらのストレージの問題に対処するために、Varnish Softwareは大規模ストレージエンジン (MSE)ペタバイト規模のデータも保存可能で、断片化や遅延が発生しないような方法で書き込まれています。
残念ながら、これはオープンソースの港湾労働者ではありません。これはライセンスを必要とする 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=概要
- GCP:https://console.cloud.google.com/marketplace/details/varnish-public/varnish-cache-6-payg-ubuntu?q=varnish&id=6a56f7aa-357c-4032-95c9-ce008bbe534f
- OC:https://cloudmarketplace.oracle.com/marketplace/en_US/listing/73388855
大きなファイルをキャッシュしない
もう 1 つのオプションは、大きなファイルがすべてキャッシュされないようにすることです。
どうやら、コンテンツの長さに基づいて大きなファイルを除外することは機能しないようです。現在、巨大なファイルに対してオブジェクト ストレージ メモリが消費されないようにする唯一の方法は、 を呼び出すことreturn(pipe)
ですvcl_recv
。
これは理想的な解決策ではありません。受信リクエストに基づいて、応答が膨大になることを事前に知っておく必要があるためです。
return(pipe)
Varnishのメカニズムはキャッシュをバイパスするだけでなく、HTTP モードそして入るTCPモードこれは通常、受信リクエストが HTTP のように見えない場合に使用されます。