我使用的是 Varnish 3.0.3(撰写本文时的最新版本),基本是默认安装,使用以下内容进行存储:
# # Cache file location
VARNISH_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin
#
# # Cache file size: in bytes, optionally using k / M / G / T suffix,
# # or in percentage of available disk space using the % suffix.
VARNISH_STORAGE_SIZE=4000M
#
# # Backend storage specification
VARNISH_STORAGE="file,${VARNISH_STORAGE_FILE},${VARNISH_STORAGE_SIZE}"
#
大多数可以缓存的页面都有很长的 TTL。我工作的网站非常庞大,有数百万个页面,不可能容纳在上面列出的存储空间(4 GB)。
设置问题:
假设整个存储空间已满,并且缓存中没有任何内容尚未过期(我的缓存中每个项目的 TTL 为 2 周)。
我认为 Ban Lurker 在这里没用,因为它只会删除已过期的物品,而没有过期的物品。
问题:
在上述情况下,当有其他请求请求缓存中不存在的内容时,Varnish 会发生什么情况?Varnish 是否会尝试从缓存中删除较旧的项目,而不管这些项目的 TTL 是多少?Varnish 会崩溃吗?会挂起吗?
如果 Varnish 无法处理这种情况,我可以做些什么来配置它以更好地处理这种情况?(我显然可以降低缓存中项目的 TTL,但我想知道是否还有其他建议)。
我看到这种情况实际上 Varnish 停止响应请求。发生这种情况时,我的机器上并没有内存或 CPU 不足。
谢谢。
跟进:
我也看到了这个帖子
这让我想到
这似乎表明一切“只是发生了”......但它似乎实际上向 URL 发送了一个 PURGE 请求,这可能需要向 VCL 添加适当的内容(请参阅https://www.varnish-cache.org/docs/3.0/tutorial/purging.html)
我将尝试一下,如果问题得到解决,我会跟进。
答案1
根据您的设置,您似乎使用磁盘来存储 varnish 缓存。
不建议这么做(性能),除非你有充分的理由(比如 sinni800)。
尝试使用 RAM 存储 varnish 缓存(“malloc”而不是“文件”)并重现该问题。