我的VPS崩溃了,我不知道为什么

我现在有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):

  • Xen-devel Re:内核BUG在mm / swapfile.c:2527! 是3.0.0 Xen – Xen源码
  • 邮件列表归档:Re:Re:内核BUG在mm / swapfile.c:2527! 是3.0.0的Xen光伏客人 – 错误:无法处理

但是,我发现的信息都没有提到任何解决办法。 我将升级到最新的Linode内核(从2.6.39.1-linode343.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中的一些错误)导致的。