报告错误

Varnish可能是一个很难调试的野兽,可能会有数千个线程挤在几个数据结构中,这有助于 interesting 核心转储。

实际上,让我重新表述一下,不带讽刺意味:你厌倦了“不,也不是438,那么让我们看看439……”动作真的很快。

因此,如果您遇到错误,花一点时间收集正确的信息,帮助我们修复错误,这一点很重要。

你能给我们的最有价值的信息是 always 如何触发和重现问题。如果你能告诉我们,我们几乎不需要任何其他东西来解决它。需要注意的是,我们没有办法模拟真实生活中的高水平网络流量,所以告诉我们“一次有10.000个客户端被点击”并不能真正让我们重现。

要报告错误,请按照文档(上面)的“故障票证”部分中所述的建议步骤进行操作。

我们使用Varnish将错误大致分类为三种错误(如下所述)。我们调试它们所需的信息取决于我们面临的是哪种错误。

Varnish崩塌

简单明了: boom

Varnish被分成两个进程,经理和孩子。所有的工作都是由孩子来做的,如果它崩溃了,经理会在附近徘徊,让它复活。

因此,如果您看到Varnish崩溃,首先要做的是检查syslog,看看以前是否发生过这种情况。(有传言称,有一个网站每10分钟重新启动一次Varnish, still 提供比他们的CMS系统更好的服务。)

当它崩溃时,Varnish将发出一个崩溃转储文件,如下所示:

Child (32619) died signal=6 (core dumped)
Child (32619) Panic message: Assert error in ccf_panic(), cache_cli.c line 153:
  Condition(!strcmp("", "You asked for it")) not true.
errno = 9 (Bad file descriptor)
thread = (cache-main)
ident = FreeBSD,9.0-CURRENT,amd64,-sfile,-hcritbit,kqueue
Backtrace:
  0x42bce1: pan_ic+171
  0x4196af: ccf_panic+4f
  0x8006b3ef2: _end+80013339a
  0x8006b4307: _end+8001337af
  0x8006b8b76: _end+80013801e
  0x8006b8d84: _end+80013822c
  0x8006b51c1: _end+800134669
  0x4193f6: CLI_Run+86
  0x429f8b: child_main+14b
  0x43ef68: start_child+3f8
[...]

如果您能将该信息提供给我们,我们通常能够准确地看到哪里出了问题,这将大大加快错误修复的速度。

除此之外,崩溃转储中还会有更多信息,在将其全部发送给我们之前,您应该隐藏任何敏感/机密数据/cookie/密码/IP#等。请确保在这样做时保持上下文,即:不要将所有IP#更改为“X.X”,而是将每个IP#更改为某些唯一的东西,否则我们可能会更困惑而不是知情。

最重要的一句话是“恐慌信息”,一般有两种形式:

“中缺少错误处理代码...”

这是一种我们可以设想Varnish结束的情况,我们(还没有)为它编写填充框错误处理代码。

最有可能的原因是您需要一个更大的工作区来存放HTTP头和Cookie。

请在报告错误之前尝试此操作。

“断言错误...”

这是一件永远不应该发生的坏事,而且几乎可以肯定,错误报告是正确的。一如既往,如果有疑问,请在开票前向我们咨询IRC。

在您的系统日志中,它们可能都连接到一行中,但如果您可以重现崩溃,请在运行时执行此操作 华而不实 手动:

varnishd -d <your other arguments> |& tee /tmp/_catch_bug

这将把整个恐慌消息保存到一个文件中。

(记得要打字 start 要启动工作进程,在以下情况下不是自动的 -d 已使用。)

Varnish去度假

这种错误很难调试,因为通常情况下,人们倾向于终止进程并向我们发送一封电子邮件,上面写着“Varnish挂起,我重新启动了它”,这只给我们提供了大约1.01比特的可用调试信息。

我们这里需要的是您可以从您的操作系统中挤出的所有信息 before 你就扼杀了瓦尼什进程。

最有价值的信息之一是,如果所有Varnish的线程都在等待某个东西,或者其中一个线程在某个徒劳的条件下疯狂旋转。

命令,如 top -Hps -Haxlwps -efH 应该能够弄清楚这一点。

如果一个或多个线程正在旋转,请使用 stracektracetruss (或您的操作系统提供的任何其他功能)以跟踪哪个系统调用了Varnish进程问题。请注意,这可能会生成大量非常重复的数据,通常一秒钟的数据就绰绰有余。

此外,还可以运行 Varnishlog 一秒钟,并为我们收集输出,如果 Varnish状态 显示任何活动,也将其捕获。

当你做完这件事,杀了瓦尼什 child 进程,并让 master 进程重新启动它。记住告诉我们这是否有效。如果没有,请终止所有Varnish进程,然后从头开始。如果这也不起作用,告诉我们,那意味着我们已经把你的内核塞进去了。

Varnish做错了事

以下是简单的错误:通常我们只需要您记录的相关交易 Varnishlog 以及你对瓦尼什所作所为的错误之处的解释。

请注意,Varnish通常完全按照您的要求行事,而不是按您的意图行事。如果它听起来像是一个错误,会绊倒其他所有人,花点时间通读一下你的VCL,看看它是否真的像你认为的那样。

您也可以尝试将 vsl_mask=+VCL_trace 参数(或使用 varnishadm param.set vsl_mask +VCL_trace 在运行的实例上),这将为您的VCL程序中执行的每个语句生成带有LIKE和字符号的日志记录。