为什么 Varnish 尽管有瞬时和 malloc 限制,但仍然会耗尽所有内存?

为什么 Varnish 尽管有瞬时和 malloc 限制,但仍然会耗尽所有内存?

我使用 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";
    }
}

相关内容