有时我的应用程序会向客户端返回 HTTP 503 错误。我唯一的线索是,当这种情况发生时,Cacti 会报告 Varnish SMS 分配请求的峰值。
经过一番研究,我可能为 Varnish 分配了太多 RAM,与我的 VM 相比。所以我添加了 2GB。Varnish 从那时起就重新加载了,但没有重新启动。
现在,错误很少发生,但仍然存在。
- 应用程序日志中 0 个错误
- 0 Apache 日志中的错误
这里是带有 SMS 峰值的仙人掌图: http://s29.postimg.org/94bu3vvd3/varnish_SMS.png
RHEL 6.3 上的 varnish-3.0.4
Varnish启动参数:
/usr/sbin/varnishd -P /var/run/varnish.pid -a :80 -f /etc/varnish/rc_platform.vcl -T xxx.xxx.xx.xxx:6082 -t 120 -w 1,1000,120 -u varnish -g varnish -S /etc/varnish/secret -s malloc,6G
varnishstat 中有趣的部分
SMA.s0.c_req 14736881 2.26 Allocator requests
SMA.s0.c_fail 4190399 0.64 Allocator failures
SMA.s0.c_bytes 353887517876 54362.00 Bytes allocated
SMA.s0.c_freed 347445180586 53372.37 Bytes freed
SMA.s0.g_alloc 311300 . Allocations outstanding
SMA.s0.g_bytes 6442337290 . Bytes outstanding
SMA.s0.g_space 113654 . Bytes available
SMA.Transient.c_req 15771681 2.42 Allocator requests
SMA.Transient.c_fail 0 0.00 Allocator failures
SMA.Transient.c_bytes 910056978442 139797.31 Bytes allocated
SMA.Transient.c_freed 910056853513 139797.29 Bytes freed
SMA.Transient.g_alloc 52 . Allocations outstanding
SMA.Transient.g_bytes 124929 . Bytes outstanding
SMA.Transient.g_space 0 . Bytes available
我有一个 10GB 的虚拟机,其中 6GB 分配给了 Varnish。
谢谢。
答案1
您的 SMA.s0.c_fail 计数非常高。因此,Varnish 尝试分配内存并失败。您可以通过提高 nuke_limit(即 Varnish 在尝试释放内存时可以终止的对象数)来让 Varnish 更加积极。
您需要重新启动以使内存设置的更改生效。不过,我建议为服务器提供更多内存。为 Varnish 提供更多内存通常既便宜又明智。
为了避免请求失败,Varnish 将分配临时内存来存储对象。临时内存存储不受限制,这意味着如果过度使用,可能会导致服务器瘫痪。您可以根据需要限制它。