如果您正在寻找挑战......您已经找到了。
每天 07:01:30 - 07:03:00 之间,我的 Apache 安装都会崩溃。就是在那个时候。一天中的其他时间它都可以正常运行。这个问题我已经有一年左右了,我在 Google 上搜索了好几个小时,尝试了很多方法。我猜是这个时间段安排了某些事情导致了这个问题。到目前为止我还没能找到原因。
现在你会说,哦,看看这个链接,你这个懒人!只要提高 maxclients 设置!相信我,我已经这样做了,但不幸的是,这个网站或任何其他网站上的解决方案都没有奏效。现在更让我感到神秘的是,服务器一整天都运行良好。就在 07:01 左右,它崩溃了,并出现以下错误。
我收到的错误是:[2013 年 7 月 28 日星期日 07:01:30] [错误] 服务器已达到 MaxClients 设置,请考虑提高 MaxClients 设置 [2013 年 7 月 29 日星期一 07:03:09] [错误] 服务器已达到 MaxClients 设置,请考虑提高 MaxClients 设置 [2013 年 7 月 30 日星期二 07:01:54] [错误] 服务器已达到 MaxClients 设置,请考虑提高 MaxClients 设置
请注意,星期一稍微有点偏差。这是因为,在 7:01:00,我重新启动了服务 apache2。它只是让崩溃稍微晚了一点。嗯?也许是侥幸......我完全不明白这一点。
我使用 apachetop 检查了流量。在出现此错误之前,网站上没有太多用户,大概 10-20 个。然而,在晚上,我们可以同时获得数百名访问者。我见过 Apache 每秒处理多达 100 个请求!问题根本不是服务器达到 MaxClients,因为早上 7 点是网站真正安静的时间。访问日志显示没有什么特别的。这里点击几下,那里点击几下。
所以在我看来,这不可能是 keepalive 问题。这不会在每天几乎相同的时间导致崩溃。这不可能是攻击,因为为什么一年中每天都在早上 7 点发生这种情况?此外,日志实际上没有显示任何类型的流量。
这是我尝试和检查过的: - 提高 maxclients 设置(最高可达 512。是的,还有 ServerLimit)。将其调低很多。但都不起作用。 - 减少 Apache 配置中的 keepalive 时间。 - 使用 haproxy 将我的所有资源(js、css、图像)移动到另一台带有 nginx 的服务器。这不是请求量的问题! - 将 Ubuntu 升级到 12.04。 - 尝试使用各种工具检查我的 apache 配置 - 将每日 cronjob 提前一小时移到 /etc/crontab 中。仍然是 ~7:00。 - 检查其他用户的 crontabs。没有用。 - mod_status 没有显示异常的连接量。
在 Apache 之前有一个 haproxy 安装。但我试过不安装它,Apache 仍然崩溃。Haproxy 日志表明服务器已关闭(我正在使用 httpcheck)。我尝试关闭此检查,但这只会导致网站根本无法加载(超时)。
版本信息:我运行的是 Ubuntu 12.04,但在运行 11.10 时也遇到了这个问题。我使用的是 prefork。服务器版本:Apache/2.2.22 (Ubuntu) 服务器构建时间:2013 年 7 月 12 日 13:37:10
除了 root 之外没有 crontab: for user in $(cut -f1 -d: /etc/passwd); do crontab -u $user -l; done1
服务器拥有充足的资源,其中大部分是数 GB 的可用 RAM。
显然我在这里遗漏了一些东西。Ubuntu 还能在哪里安排事情?Apache 是否会在早上 7 点左右做一些不在 crontab 中的特殊事情?
谢谢!
~~~~我无法回答我自己的问题但它已经解决了!~~~~
回复:啊啊啊,我找到了。Janne Pikkarainen 第一次就找到了。显然我没有用眼睛看。netstat 可能不是正确的命令。因为我只看到了很多连接……(当然,现在是繁忙时段,但这无法解释为什么连接数突然增加了 10 倍)。
不用多说,这是数据库服务器。它每天早上 7 点运行 mysqldump。因为它是一台不同的服务器,所以我甚至没有想到我也应该检查一下它。
我刚刚尝试运行该备份,很快请求就开始堆积起来。然后砰!Apache 抛出错误并停止响应。愚蠢的开发人员(我)很愚蠢 :) 因此修复方法从来都不是重新启动服务 apache2,备份刚刚结束,服务器再次响应。所以实际上,它根本没有崩溃。
感谢大家的帮助。这不是什么秘密……我知道我错过了什么。希望这个答案有一天能帮助到别人 :)
答案1
这确实应该是一条评论,但它太长了。
我的 Apache 安装崩溃了
你确定吗?达到 maxclients 意味着程序正在运行,“崩溃”意味着程序已停止(应该记录此情况并转储核心文件)。它们是完全不同的事情。如果它已停止,核心文件在哪里?你尝试过从中获取堆栈跟踪吗?
网站上的用户不多,大概 10-20 个
毫无意义的指标。任何时候有多少个已建立的连接?什么时候“崩溃”?崩溃前的服务器状态是什么?这与 netstat 相符吗?
您的系统日志显示什么?
所以在我看来,这不可能是一个 keepalive 问题。
在您的文章中,我没有看到任何可以排除 keepalive 作为一个促成因素的内容。