程序员

这是 Hacker News 官方网站上的一篇声明,解释为什么 Hacker News 昨晚上宕机一夜。

昨天 Hacker News 宕机了一晚上。问题不是由于我们新上的服务器。事实上,其中的原因愚蠢的让人不好意思说。

有一个评论贴,一个新用户想在里面发表回复,但发布出去的内容没有成为目标评论的子评论,反而成为与它平级的评论。我回复了一个评论来解释 Hacker News 是如何工作的。但我觉得该帮这个人修复一下,在他的回复上做个小手术。不幸的是,我用错了评论的 ID,使评论的树结构里出现了一个循环;我使一条评论成为了它自己的下级评论。这样一来,任何一个人试图浏览这个帖子时,服务器都会生成一个无限长的长页面。因为这个评论所属的文章正处在首页,所以这个动作被大量的执行。

不知什么原因,我在修改这个评论后并没有去查看这个评论是否留在了它正确的位置。一定是有什么事情让我分心了。所以我没有发现任何异常,直到不久之后服务器看起来开始有些喘。

我截取了服务器日志看发生了什么,里面的信息看起来是 Hacker News 缺少足够的内存,在频繁的回收内存。不管是不是这个原因,或出现了其它事故,这种问题一般是通过重启服务器都能解决。于是我这样做了。因为当天我开发了一些代码,所以当我重启服务器时,上面运行的是新版程序。

重启了服务后,问题依旧存在。我怀疑是我那天写的程序里有什么问题,我尝试将版本恢复到上一版,然后重启服务。但问题依旧存在。我们又试着把这以前老服务器上的程序拿过来换上,也不好用。我们认识到程序应该是没问题的,我们认为问题应该出在了这个新服务器上。于是我们试图切换到老的服务器上。我不知道我的同事 Nick 是否成功的切换,因为中途我放弃了,睡觉去了。

当我今早醒来,监控显示 Hacker News 仍然在新服务器上跑。出问题的那条评论仍在那,但那篇文章已经被新上来的文章顶出首页。所以整体上 Hacker News 并没有宕机,但迹象仍显示什么地方出了问题。例如,/threads?id=pg 无法访问,因为我使这个帖子里出现了死循环。

终于,数据显示,问题似乎跟某个特定的 ID 相关。当我到服务器上查看这条数据时,终于意识到了一定是我做错了事。

于是我又给那个回复动了一次手术,这次很小心,一切又恢复正常了。

我感到很抱歉。

英文原文:Why HN was down