varnish故障修复
有时候varnish会出现故障,或者是没有按照你想要的方式运行。为了让你知道怎么去处理故障,这里会告诉你几个你可以检查的地方。varnishlog, /var/log/syslog , /var/log/messages 这几个地方都可以帮助你找到线索。这一节会告诉你一些基本的故障排除方法。
varnish启动不了
有时候varnish会无法启动。造成这种错误的原因并不多。通常我们可以看/dev/null的权限和是否其他软件占用了端口。
可以使用debug模式启动varnish,然后看看发生了什么:
尝试以下命令:
# varnishd -f /usr/local/etc/varnish/default.vcl -s malloc,1G -T 127.0.0.1: 2000 -a 0.0.0.0:8080 -d
注意-d选项,它将给您更多的信息关于接下来发生了什么。让我们看看如果其他程序暂用了varnish的端口,它将显示什么:
# varnishd -n foo -f /usr/local/etc/varnish/default.vcl -s malloc,1G -T 127.0.0.1:2000 -a 0.0.0.0:8080 -d
storage_malloc: max size 1024 MB.
Using old SHMFILE
Platform: Linux,2.6.32-21-generic,i686,-smalloc,-hcritbit
200 193
-----------------------------
Varnish Cache CLI.
-----------------------------
Type 'help' for command list.
Type 'quit' to close CLI session.
Type 'start' to launch worker process.
现在varnish的主程序已经运行,在debug模式中,cache现在还没有启动,现在您在终端中使用“start”命令来让主程序开启cache功能
start
bind(): Address already in use
300 22
Could not open sockets
在这里,我们发现一个问题。Varnish要使用的端口被HTTP使用了。如果这没有什么帮助的话,可以尝试使用strace
或者truss
或者在IRC上面找我们。
varnish崩溃——错误堆栈
当varnish子进程崩溃时,大多数崩溃都会被我们包含的源代码中的很多一致性检查中的某一个捕获。当varnish命中其中一个缓存处理时,这些崩溃都是可控的,都会留下错误堆栈。
你可以在命令行中键入panic.show
来检查所有的错误信息:
panic.show
Last panic at: Tue, 15 Mar 2011 13:09:05 GMT
Assert error in ESI_Deliver(), cache_esi_deliver.c line 354:
Condition(i == Z_OK || i == Z_STREAM_END) not true.
thread = (cache-worker)
ident = Linux,2.6.32-28-generic,x86_64,-sfile,-smalloc,-hcritbit,epoll
Backtrace:
0x42cbe8: pan_ic+b8
0x41f778: ESI_Deliver+438
0x42f838: RES_WriteObj+248
0x416a70: cnt_deliver+230
0x4178fd: CNT_Session+31d
(..)
崩溃可能是因为配置错误或者bug引起的。如果你怀疑是因为bug导致的话,你可以输出一个bug报告。
varnish崩溃——段错误
有时候bug也可能会逃过一致性检查,varnish获取到一个段错误。当发生这种情况的时候,子进程都会被记录,并且会被重启。
在varnish中A core dumped经常被用来解决bug。然而为了能够调试一个段,开发者需要你提供数据。
请确保你已经安装varnish时已经安装了调试模块。确保core dumps在父shell中是被允许的。
只要你有内核,你就可以使用gdb打开它并发出调试命令,来跟踪错误堆栈。
Varnish gives me Guru meditation
首先在varnishlog中找到相关的日志条目。这可能会给你一些线索。由于varnishlog记录了大量的数据,所以可能很难跟踪。你可以使用以下命令设置varnishlog记录所有的503错误:
$ varnishlog -q 'RespStatus == 503' -g request
如果错误是最近发生的,那么处理可能仍然在共享内存段中。为了得到varnishlog所有共享内存段中日志,只需要使用-d参数:
$ varnishlog -d -q 'RespStatus == 503' -g request
具体可以查看vsl-query和varnishlog帮助页面来了解更多的过滤功能和选项。
varnish不缓存数据
可以查看提升缓存命中率。