我已经在 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 服务器来分散负载