我现在有一个使用 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):
- Xen-devel Re: 内核错误出现在 mm/swapfile.c:2527!原为 3.0.0 Xen - Xen 源代码
- 邮件列表存档:回复:回复:内核 BUG 位于 mm/swapfile.c:2527!是 3.0.0 Xen pv guest - BUG:无法处理
但是,我找到的所有信息似乎都无法提供任何解决方案。我打算升级到 Linode 提供的最新内核(从2.6.39.1-linode34
到3.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 中的某些错误)。