我现在有Linode的VPS。 我的监控服务提醒我,我所托pipe的一个网站已经closures了。 我使用Lish,Linode的方法通过SSH连接直接访问控制台,但不使用SSH,查看任何错误消息。 这就是我所看到的:
我检查了我的Munin日志,看看是否有内存使用的高峰,确实在交换图的适当时间有一个高峰:
然而,内存图上并没有出现尖峰(尽pipe掉期看起来似乎略有上升):
我重新启动服务器,它一直工作正常。 我检查了Apache访问和错误日志,没有看到任何可疑的东西。 系统日志中服务器重新启动之前的最后一项是IMAP守护进程的错误,并且看起来没有关联:
Oct 28 18:30:35 hostname imapd: TIMEOUT, [email protected], ip=[::ffff:XX.XX.XX.XX], headers=0, body=0, rcvd=195, sent=680, time=1803 # all of the startup logs below here Oct 28 18:40:33 hostname kernel: imklog 5.8.1, log source = /proc/kmsg started.
我试图检查dmesg,但没有看到任何可疑的。 最后几行:
VFS:已挂接的根(ext3文件系统)在设备202上只读:0。 devtmpfs:挂载 释放未使用的内核内存:释放412k 写保护核心文本:5704K 写保护内核只读数据:1384k NX保护内核数据:3512k init:无法产生控制台设置主进程:无法执行:没有这样的文件或目录 udevd [1040]:从版本173开始 在/ dev / xvdb上添加524284k交换。 优先级:-1个范围:1个:524284k SS init:udev-fallback-graphics主进程(1979)以状态1结束 init:普利茅斯主进程(1002)被SEGV信号杀死 init:plymouth-splash主进程(1983)以状态2结束 EXT3-fs(xvda):使用内部日志 init:plymouth-log主进程(2017)以状态1结束 init:plymouth-upstart-bridge主进程(2143)以状态1结束 init:ssh主进程(2042)以状态255结束 init:failafe主进程(2018)被TERM信号杀死 init:apport预启动进程(2363)以状态1结束 init:apport post-stop进程(2371)以状态1结束
我试着用谷歌search错误信息( kernel BUG at mm/swapfile.c:2527!
),发现了一些与Xen相关的主题(Linode使用Xen):
但是,我发现的信息都没有提到任何解决办法。 我将升级到最新的Linode内核(从2.6.39.1-linode34
到3.0.4-linode38
)。
现在还有什么事情可以诊断这个问题,或者将来如果再发生这个问题呢? 有什么我错过了吗? 有没有人有什么可能触发这个想法?
请让我知道,如果有任何其他信息,我可以提供。 万分感谢。
在重新启动系统之前或之后,您是否拉出了Munin图表? 如果之后,空白部分之后的部分很可能在您重新启动之后,并且不相关。 我猜是以后,因为你的交换使用已经大幅下降…
在你的问题中,你忽略了空白部分…你说“图表不显示内存使用量上升”,但他们真正显示的内存是可能上升的时间内没有数据。 munin是一个很好的工具,但是报告这样的情况是非常糟糕的,因为它每5分钟只报告一次信息,如果系统很忙,它可能根本就不报告。
你有没有完成你可以运行的Apache实例的数量的内存math? 通过这个我的意思是做“ps awwlx –sort = rss | grep apache”并且看看每个Apache实例使用了多less内存。 例如:
root@theobromine:~# ps awwlx --sort=rss | grep apache 0 0 18497 18485 20 0 1788 528 - S+ pts/0 0:00 grep apache 5 33 18458 5384 20 0 28468 6700 - S ? 0:00 /usr/sbin/apache2 -k start 5 33 18470 5384 20 0 28468 6700 - S ? 0:00 /usr/sbin/apache2 -k start 5 33 18480 5384 20 0 28468 6700 - S ? 0:00 /usr/sbin/apache2 -k start 5 33 18481 5384 20 0 28468 6700 - S ? 0:00 /usr/sbin/apache2 -k start 5 33 18457 5384 20 0 28468 6708 - S ? 0:00 /usr/sbin/apache2 -k start 5 0 5384 1 20 0 28336 11796 - Ss ? 0:16 /usr/sbin/apache2 -k start
这是我们正在看的第8列。 在这种情况下,每个实例使用6.7MB,实际上它相当小。 但现在我看看我有多less记忆:
root@theobromine:~# free total used free shared buffers cached Mem: 775196 643848 131348 0 77964 268788 -/+ buffers/cache: 297096 478100 Swap: 1148636 3368 1145268
所以我有800MB的RAM …现在,我可以做math,并说最好的情况下,我可以运行800 / 6.7 = 119的Apache实例。 但是,这不会留下任何其他应用程序或操作系统或caching等空间…
但实际上你最多有478MB(第二列在“free”下),减去当前运行的Apaches的数量(6.7 * 6 – 我只有6个Apache实例在上面运行),剩下大约520MB的RAMcaching,当然)。 所以我真正可以运行的最大值就是77个实例。
那么我究竟有多less人在运行?
root@theobromine:~# grep MaxClients /etc/apache2/apache2.conf # MaxClients: maximum number of server processes allowed to start MaxClients 150 # MaxClients: maximum number of simultaneous client connections MaxClients 150
啊,阿帕奇并不限制我的记忆力比我低。 所以,如果超过77个客户端连接到我的networking服务器,我可能会开始颠簸。
我经常看到这一点:“我需要能够处理500个同步的networking连接。” 但是,你看看他们的Apache实例,他们正在使用60MB(不是一个不寻常的大尺寸),但是当你说他们需要升级他们的VPS到32BG的RAM时,他们会吓坏了。 🙂
这个问题与Xen中的bug有关(在问题中提到)。 更新到最新版本的内核( 3.0.4-linode38
)解决了问题(服务器反复崩溃,直到我改变了内核版本)。 问题似乎并不是由于内存不足造成的,而是由内核pipe理内存(或Xen中的一些错误)导致的。