内存严重问题,httpd 和 mysql 崩溃

内存严重问题,httpd 和 mysql 崩溃

问题在于:

我在 mediatemple 上的 3 GIG RAM 服务器上托管了几个网站,从来没有遇到过问题。突然每隔 2 到 3 天我就会收到 kmemsize 错误并且 apache 崩溃。mysql 和 apache 似乎都无法正常工作。我从来没有遇到过这个问题并且流量也没有增加。

httpd 日志文件表明已达到 maxclient

如果有人能帮助我,我愿意付钱来解决这个问题。我添加了 2 张 apache 日志文件的屏幕截图。如果有任何其他日志文件可以提供帮助,请告诉我

http://www.travolto.com/screen/screen1.jpg

http://www.travolto.com/screen/screen2.jpg

答案1

您几乎肯定会耗尽内存。当您开始交换时,apache 通常会达到 maxclients,因为现有子进程正在等待磁盘 i/o,因此它将生成新的子进程来处理新请求,然后这些子进程将挂起等待磁盘 i/o,冲洗、循环、重复,直到达到 maxclients。

最有可能的是,您需要检查 mysql 和 apache 配置,并精简它们以使用更少的内存。您还需要查看在 mod_python 中运行的任何代码,看看它是否占用了大量内存。正如 Yves 提到的,在浏览您的网站时,在“顶部”查看 RSS 列将有助于显示每个 apache 子进程大约占用了多少内存。我之前在 mod_python 场景中看到过 20 - 50mb,所以如果我不想让 apache 使用超过 1.5GB 的内存,我会将 maxclients 限制在 40 左右。MySQL 类似地可以配置为仅使用一定数量的内存,但这太复杂了,无法在这里解释。

我不太同意扩大交换范围。交换是所以比普通内存慢得多,几乎总是会触发失控或堆积情况,让你像 OOM 一样严重地瘫痪。最好让机器快速恢复到可登录状态,这样你就可以着手真正的解决方案。

需要注意的是,不确定你用 mod_python 做什么,但如果是 django(或者即使不是真的),你应该看看 mod_wsgi。它往往是一种更高效的内存使用模型。

答案2

  1. 您当前的 MaxClients 设置是多少?您可以尝试增加它 - 看看是否有帮助。编辑 httpd.conf 后,不要忘记重新启动 Apache :)

  2. 另外,以防万一:检查 KeepAlive 是否处于开启状态。

  3. 另外,检查 MaxRequestsPerChild 的值(或类似命名的选项) - 如果它是 0,请尝试将其设置为某个较大的值(例如 1000-5000-15000)。

  4. 即使流量没有明显增加,您也可能被恶意机器人抓取,从而打开与您的服务器的多个连接。此外,如果您指的是由 Google Analytics 和类似工具监控的流量,那么机器人/蜘蛛根本不会包含在这些统计数据中。因此,还要检查您的 apache 请求日志现在每个时间段的请求数是否比此错误开始出现之前更多(我相信您可能在 /var/log/apache2 中有一个长达一个月的 gzip 压缩 apache 日志历史记录)。

  5. 如果您发现某些 IP 过于积极地从您的服务器请求页面 - 您可以尝试 mod_evasive,它可以限制每个时间段的页面浏览量(可配置)。但是,除非您确实发现了一些违规的蜘蛛/机器人,否则这根本无济于事。

  6. 如果这些都无济于事,您可以尝试跟踪 apache 进程以找出它死机前发生了什么(为此使用 strace)。使用 strace 运行几次,如果得到相同的结果,可能有助于找到问题。我只会在万不得已的情况下使用这种方法。

  7. MySQL 也死机了,这很奇怪。您能否检查一下是否确实如此,并提供更多详细信息?我不记得曾经看到过 Apache 和 MySQL 同时死机。

答案3

MaxClients 就是此处的症状。

您遇到此问题的原因是,很大一部分请求要么速度慢,要么崩溃。如果您能找出导致此问题的请求,请尝试一下。

另一种可能性是硬件级内存损坏或总线问题。

答案4

检查你的 mysql 日志是否耗尽了连接。Bugzilla 有这个问题,它会耗尽连接,直到整个网站崩溃。

监控内存使用情况(尝试top(1)vmstat(8))。当看到激增时,您需要查看进程并确定为什么它没有释放内存。可能正在运行脚本或类似的东西。或者您有一个巨大的查询。

相关内容