我的 VPS 崩溃了,但我不知道原因

我的 VPS 崩溃了,但我不知道原因

我现在有一个使用 Linode 的 VPS。我的监控服务提醒我,我托管的一个网站已关闭。我使用 Lish(Linode 的方法,通过 SSH 连接直接获得对控制台的带外访问,但不使用 SSH)来查看任何错误消息。这是我看到的:

控制台日志

我检查了我的 Munin 日志以查看内存使用量是否出现峰值,并且交换图在适当的时间确实出现了峰值:

交换内存峰值

然而,内存图上没有出现峰值(尽管交换似乎在上升轻微地):

记忆图,无尖峰

我重启了服务器,之后它就一直运行良好。我检查了 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:在设备 202:0 上以只读方式安装根(ext3 文件系统)。
devtmpfs:已安装
释放未使用的内核内存:已释放 412k
写保护内核文本:5704k
写保护内核只读数据:1384k
NX-保护内核数据:3512k
init:无法生成控制台设置主进程:无法执行:没有此文件或目录
udevd[1040]: 开始版本 173
在 /dev/xvdb 上添加 524284k 交换。优先级:-1 范围:1 跨越:524284k SS
init: udev-fallback-graphics 主进程 (1979) 以状态 1 终止
init:plymouth 主进程(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:故障安全主进程 (2018) 被 TERM 信号终止
init:apport 预启动进程 (2363) 以状态 1 终止
init:apport 停止后进程(2371)以状态 1 终止

我尝试通过 Google 搜索错误消息(kernel BUG at mm/swapfile.c:2527!),并发现了一些与 Xen 相关的主题(Linode 使用 Xen):

但是,我找到的所有信息似乎都无法提供任何解决方案。我打算升级到 Linode 提供的最新内核(从2.6.39.1-linode343.0.4-linode38)。

现在,或者将来如果再次发生此问题,我还能做些什么来诊断此问题?我是否遗漏了什么?有人知道是什么引发了此问题吗?

如果我可以提供任何其他信息,请告诉我。非常感谢。

答案1

你是在重启系统之前还是之后提取 Munin 图表的?如果是之后提取的,空白部分后面的部分很可能是您重新启动了,这无关紧要。我猜是之后,因为您的交换使用量急剧下降了……

在您的问题中,您忽略了空白部分...您说“图表没有显示内存使用量上升”,但它们真正显示的是在内存可能上升期间没有数据。munin 是一个很棒的工具,但它在报告此类实例方面很糟糕,因为它每 5 分钟才报告一次信息,如果系统繁忙,它可能根本不会报告任何内容。

您是否计算过可以运行的 Apache 实例数的内存占用?我的意思是执行“ps awwlx --sort=rss | grep apache”并查看每个 Apache 实例使用了多少内存。例如:

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,这实际上相当小。但现在我看看我有多少内存:

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...现在,我可以计算一下,在最好的情况下,我可以运行 800/6.7 = 119 个 Apache 实例。但这不会为任何其他应用程序、操作系统或缓存等留下任何空间...

但实际上您最多有 478MB(“可用”下的第二列),减去当前正在运行的 Apache 数量(6.7*6——上面我只运行了 6 个 Apache 实例),剩下大约 520MB 的 RAM(当然,如果没有缓存的话)。所以我真正能运行的最大数量更像是 77 个实例。

那么我实际上跑了多少?

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

啊,Apache 不会限制我使用比我拥有的更少的内存。因此,如果超过 77 个客户端同时连接到我的 Web 服务器,我可能会开始崩溃。

我经常看到这种情况:“我需要能够处理 500 个同时的 Web 连接。”但是当你查看他们的 Apache 实例时,他们使用了 60MB(这不是一个不常见的大尺寸),但是当你说他们需要将他们的 VPS 升级到 32BG RAM 时,他们就会惊慌失措。:-)

答案2

问题与 Xen 中的错误有关(问题中提到)。更新到最新版本的内核(3.0.4-linode38)解决了问题(服务器反复崩溃,直到我更改内核版本)。问题似乎不是由于内存不足而引起的,而是由于内核对内存的管理不当(或 Xen 中的某些错误)。

相关内容