我使用 Varnish 在 Apache2 网络服务器前缓存静态文件。它混合了小文件(CSS/JS/图像)和大文件(从 200 MB 到 2 GB)。
我已将守护进程中的临时存储和 malloc 存储分别限制为 8/12 GB:
ExecStart=/usr/sbin/varnishd -j unix,user=vcache -F -a :8000,PROXY -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,12G -s Transient=malloc,8G
检查时似乎尊重这一点varnishstat
:
SMA.s0.g_bytes 2.67G
SMA.s0.g_space 9.33G
12.00G (total)
SMA.Transient.g_bytes 3.26G
SMA.Transient.g_space 4.74G
8.00G (total)
但检查时却并非如此top
:
MiB Mem : 32169.8 total, 274.4 free, 30405.1 used, 1490.3 buff/cache
MiB Swap: 16382.0 total, 9683.5 free, 6698.5 used. 1360.4 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3118 vcache 20 0 51.4g 29.3g 1.3m S 7.9 93.2 3:30.05 /usr/sbin/varnishd
这种内存使用会导致服务器交换,然后崩溃,最终调用oom-killer
并销毁 Varnish 守护进程。
该服务器是具有 32 GB 内存的虚拟机。我还尝试了其他瞬态/malloc 限制并传输大文件,但行为没有任何变化。
可能是什么问题?
视窗语言:
backend default {
.host = "127.0.0.1";
.port = "8001";
}
sub vcl_recv {
unset req.http.X-Cache-Request;
// Unset cookies and indicate that this request should be cached
if (req.http.host ~ "^static.example.com(:\d+)?$"){
unset req.http.Cookie;
set req.http.X-Cache-Request = "1";
}
}
sub vcl_backend_response {
// Set TTL if request that should be cached and status code is 2xx, 3xx or 4xx
if (
bereq.http.X-Cache-Request
&& beresp.status >= 200 && beresp.status < 500
&& beresp.http.Cache-Control !~ "no-cache"
){
unset beresp.http.Set-Cookie;
set beresp.ttl = 1w;
}
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT";
} else {
set resp.http.X-Cache = "MISS";
}
}