Varnish间歇性出现大量未完成请求(返回504)求助
Varnish间歇性大量未完成请求(504错误)排查
问题现象
Varnish中间歇性出现大量未完成请求,这类请求未建立后端连接,最终返回504状态码。
异常日志示例
问题发生时,访问日志中出现不完整的日志条目,缺少请求方法、URL、状态码等核心字段:
20241218211542 - - - 0 - Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.6778.108 Mobile Safari/537.36 (compatible; Googlebot/2.1; )
当前Varnish配置
# Backend storage specification, see Storage Types in the varnishd(5) # man page for details. #VARNISH_STORAGE="malloc,700G" VARNISH_STORAGE="file,/cache-data/varnish_cache.bin,2750G" # User and group for the varnishd worker processes VARNISH_USER=varnish VARNISH_GROUP=varnish # Other options, see the man page varnishd(1) DAEMON_OPTS="-p thread_pools=4 -p thread_pool_min=150 -p thread_pool_max=3000 -p thread_pool_timeout=300 -p thread_pool_stack=96k -l 4000M -p timeout_idle=70 -p backend_idle_timeout=300"
排查与优化建议
- 线程池资源校验:当前配置4个线程池,每个池最大3000线程,总线程数达12000。需检查系统文件句柄限制(
ulimit -n),若系统允许的最大文件句柄数低于线程数+预留资源,会导致Varnish无法创建新连接,请求排队超时。可适当调小thread_pool_max,或提升系统文件句柄上限。 - 超时参数补全:当前配置未设置
first_byte_timeout(默认60秒),若请求因线程耗尽无法分配到处理资源,会触发504。建议添加-p first_byte_timeout=120延长等待时间,同时结合timeout_idle调整闲置连接回收策略。 - 存储性能排查:采用文件存储(2750G)需检查存储磁盘的IO负载,若磁盘IO瓶颈会导致Varnish处理缓存读写时阻塞,占用线程资源。可通过
iostat、vmstat监控磁盘性能,必要时切换为malloc存储或升级存储介质。 - 爬虫流量管控:日志中出现Googlebot请求,大量爬虫并发可能瞬间占满线程池。建议在VCL中添加爬虫流量限速规则,或通过
thread_pool_add_delay参数控制线程创建速率,避免突发流量压垮线程池。 - 日志完整性排查:不完整日志说明请求处理过程被中断,可能是客户端提前断开连接,或Varnish线程崩溃。可开启Varnish的
varnishlog实时监控请求生命周期,定位中断环节。
内容的提问来源于stack exchange,提问作者Vinay Singh
相关产品推荐
相关产品推荐

