这里是问题:
我有一个网站托pipe在mediatemple 3 GIG RAM服务器上,我从来没有遇到过问题。 突然每2至3天我得到一个kmemsize错误和Apache崩溃。 那么mysql和apache似乎都没有工作。 我从来没有这个问题,并没有增加stream量。
httpd日志文件说有达到的maxclient
如果有人能帮助我,我愿意为解决这个问题付出一些代价。 我添加了2个截图的Apache日志文件。 如果有任何其他的日志文件可以帮助我知道
http://www.travolto.com/screen/screen1.jpg
http://www.travolto.com/screen/screen2.jpg
你几乎肯定会耗尽内存。 当你开始交换的时候,apache通常会碰到maxclients,因为现有的孩子们正在等待磁盘I / O,所以它会产生新的孩子来处理新的请求,然后等待磁盘I / O,冲洗,循环,重复直到达到maxclients。
大多数情况下,你需要通过你的mysql和Apache的configuration,并修剪它们以使用更less的内存。 你还需要看看你在mod_python中运行的任何代码,看看它是否是一个猪。 正如Yves提到,在浏览你的网站的同时,将RSS列瞄准“顶部”,将有助于向你展示每个apache孩子正在占用多less内存。 我之前在mod_python场景中已经看到了20-50mb,所以如果我不想要apache使用超过1.5GB的话,我会将我的maxclients限制在40左右。同样,MySQL可以configuration为只使用一定数量的ram,但在这里解释太复杂了。
我倾向于不同意的一件事是扩大你的交换。 Swap比普通的ram慢得多,它几乎总是触发一个失控或者堆积的场景,使得你和OOM一样糟糕。 不妨将机器快速恢复到可login状态,以便您可以使用真正的解决scheme。
只是一个说明,不知道你在做什么mod_python,但如果它的django(或者即使不是真的),你应该看看mod_wsgi。 它往往是一个更有效的内存使用模式。
您目前的MaxClients设置是什么? 你可以尝试增加 – 看看是否有帮助。 编辑httpd.conf后不要忘记重启Apache
另外,为了以防万一:检查KeepAlive是否打开。
此外,请检查MaxRequestsPerChild(或类似名称的选项)的值 – 如果它是0,请尝试将其设置为一个较大的值(例如1000-5000-15000)。
即使没有显着的stream量增加,你可能已经被一个糟糕的机器人蜘蛛,为您的服务器打开多个连接。 另外,如果您指的是通过Google Analytics(分析)和类似工具监控的stream量,则根本不会包含漫游器/蜘蛛。 所以还要检查你的apache请求日志现在每个时间段的请求比在这个错误开始出现之前(我相信你可能在apache2 / gzipped apache日志有一个月的历史logging)有更多的请求。
如果您发现某些IP太过于积极地向您的服务器请求页面,则可以尝试mod_evasive,这会限制每个时段的浏览量(可configuration)。 但是,除非你find一些有问题的蜘蛛/机器人,否则这根本无济于事。
如果没有什么帮助,你可以尝试跟踪Apache进程,以找出它死之前发生的事情(使用strace的)。 用strace运行几次,得到相同的结果,可能有助于发现问题。 我只会用这种方法作为最后的手段。
MySQL非常奇怪。 你能否检查一下是否真的是这样,并提供更多的细节? 我不记得同时看到Apache和MySQL同时死亡。
MaxClients是这里的症状。
你碰到它的原因是很大一部分请求要么慢,要么是崩溃。 如果你能弄清楚是什么请求导致这个问题。
另一种可能性是硬件级内存损坏或总线问题。
这只是一个疯狂的猜测基于您的日志…你在你的web应用程序中使用Python脚本? 如果是这样,请检查是否有失控脚本导致连接泄漏或某种内存泄漏。
检查你的mysql日志是否没有连接。 Bugzilla有这个问题,它会吃掉连接,直到整个网站坠毁。
监视内存使用情况(尝试top(1)
或vmstat(8)
)。 当你看到一个浪涌时,你需要看看这个过程,并确定它为什么不释放内存。 也许有一个脚本运行或什么的。 或者你有一个巨大的查询。
也许这意味着你的内存不足了。 你能试试吗?
dmesg | grep oom
如果它返回任何输出,这意味着你的系统内存不足,Linux必须杀死一些进程。 如果是这种情况,请检查您的进程的RSS内存使用情况,并尝试停止不必要的工作。 也许你还可以添加更多的交换空间 – 虽然这不是一个好主意,如果这是一个虚拟主机(VPS)。
由于您正在网站上运行mod_python,请确保您阅读:
http://blog.dscpl.com.au/2009/03/load-spikes-and-excessive-memory-usage.html
第二个日志在13:16:57的行表明你已经用完了内存。 顶部可能会显示所有交换消耗。 你可以尝试添加额外的交换(man 8 mkswap,man 8 swapon)。 但是,如果你有一个泄漏内存的脚本,那么你也有可能会遇到这个问题。 您可能还会检查httpd访问文件,查找内存不足事件之前的任何活动突发。
做了第二条错误消息的Googlesearch,我发现这个post :
我认为你已经没有信号量撤消结构了。 尝试增加内核参数semmnu。