varnish.service:该单元的一个进程已被 OOM 终止程序终止

varnish.service:该单元的一个进程已被 OOM 终止程序终止

我已经在 Ubuntu 服务器 22.04 上安装了 varnish。

环境是Php8.1、Varnish7.3.0。

该服务器有16GB RAM。

对我来说,Varnish 不断间歇性崩溃,并且我收到以下消息。

:~$ sudo service varnish status
× varnish.service - Varnish Cache, a high-performance HTTP accelerator
   Loaded: loaded (/etc/systemd/system/varnish.service; enabled; vendor preset: enabled)
   Active: failed (Result: oom-kill) since Mon 2023-11-20 13:18:05 UTC; 18s ago
   Process: 198053 ExecStart=/usr/sbin/varnishd -a :80 -a localhost:8443,PROXY -p feature=+http2 -p http_resp_hdr_len=35M -p http_resp_size=40M -p workspac>
   Main PID: 198054 (code=exited, status=64)
        CPU: 14min 39.533s

Nov 20 13:18:05    varnishd[198054]: Manager got SIGTERM
Nov 20 13:18:05    systemd[1]: varnish.service: A process of this unit has been killed by the OOM killer.
Nov 20 13:18:05    varnishd[198054]: Stopping Child
Nov 20 13:18:05    varnishd[198054]: Child (198068) died signal=9
Nov 20 13:18:05    varnishd[198054]: Child cleanup complete
Nov 20 13:18:05    varnishd[198054]: manager stopping child
Nov 20 13:18:05    varnishd[198054]: manager dies
Nov 20 13:18:05    systemd[1]: varnish.service: Main process exited, code=exited, status=64/USAGE
Nov 20 13:18:05    systemd[1]: varnish.service: Failed with result 'oom-kill'.
Nov 20 13:18:05    systemd[1]: varnish.service: Consumed 14min 39.533s CPU time.
lines 1-17/17 (END)

我有以下设置/etc/systemd/system/varnish.service

ExecStart=/usr/sbin/varnishd \
      -a :80 \
      -a localhost:8443,PROXY \
      -p feature=+http2 \
      -p http_resp_hdr_len=35M \
      -p http_resp_size=40M \
      -p workspace_backend=40M \
      -p workspace_client=40M \
      -f /etc/varnish/default.vcl \
      -s malloc,512m

我增加了分配给 Varnish 的内存,并创建了交换内存

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

但它仍然崩溃。

我该如何修复此问题?

答案1

-s malloc,512m语句将缓存存储限制为 512 MB,但这并不意味着 Varnish 只会消耗 512 MB 的 RAM。

运行成本

Varnish 的运行时成本会随着活动线程数量的增加而增加。处理请求的每个工作线程都会消耗一些内存。具体数量可通过workspace_client运行时参数定义。

工作区内存

如果发出后端请求,则该workspace_backend值用于设置大小。甚至可以workspace_session设置用于处理新 TCP 连接的内存。

通常workspace_client默认workspace_backend为 64 KB,这意味着每个线程都可以使用该数量的内存。

workspace_client在您的案例中,您已将和的值设置得workspace_backend非常高。如果您允许 40 MB 的工作区内存,则应将该数字乘以活动线程的数量,以确定 Varnish 至少会消耗多少内存。

线程

运行以下varnishstat命令来了解当前有多少个活动线程:

varnishstat -f "MAIN.threads" -1

线程数thread_pool_min在运行时参数的值和thread_pool_max运行时参数之间有所不同。开箱即用,该数字介于 100 到 5000 之间。请记住,有 2 个线程池,因此您必须将该数字乘以 2。

如果我们假设所有线程都使用,则其大小为 40 MB 乘以 10,000 个线程。即 390 GB。

结论

很明显,您设置的工作区参数太高了。根据运行时配置,您需要这个来处理极大的请求和响应标头。

有 3 种方法可以实现这一目标:

  • 减少thread_pool_max,但达到限制时可能会有排队请求的风险
  • 减少工作区内存大小,这也意味着您将无法处理巨大的请求/响应标头
  • 为你的服务器添加更多内存,或者添加多个 Varnish 服务器来分散负载

相关内容