我检查了我的Munin日志,看看内存使用量是否有峰值,并且确实在交换图的适当时间有一个峰值:
但是,内存图上没有峰值(虽然交换看起来似乎略有上升):
我重新启动了服务器,它一直运行良好.我检查了Apache访问和错误日志,并没有看到任何可疑的.服务器重新启动之前syslog中的最后一个条目是IMAP守护程序出错并且似乎没有关联:
Oct 28 18:30:35 hostname imapd: TIMEOUT,user=user@xxxxxxxxxxxxx.com,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: Mounted root (ext3 filesystem) readonly on device 202:0. devtmpfs: mounted Freeing unused kernel memory: 412k freed Write protecting the kernel text: 5704k Write protecting the kernel read-only data: 1384k NX-protecting the kernel data: 3512k init: Failed to spawn console-setup main process: unable to execute: No such file or directory udevd[1040]: starting version 173 Adding 524284k swap on /dev/xvdb. Priority:-1 extents:1 across:524284k SS init: udev-fallback-graphics main process (1979) terminated with status 1 init: plymouth main process (1002) killed by SEGV signal init: plymouth-splash main process (1983) terminated with status 2 EXT3-fs (xvda): using internal journal init: plymouth-log main process (2017) terminated with status 1 init: plymouth-upstart-bridge main process (2143) terminated with status 1 init: ssh main process (2042) terminated with status 255 init: failsafe main process (2018) killed by TERM signal init: apport pre-start process (2363) terminated with status 1 init: apport post-stop process (2371) terminated with status 1
我尝试使用Google搜索错误消息(内核BUG at mm / swapfile.c:2527!)并找到一些与Xen相关的主题(Linode使用Xen):
> Xen-devel Re: kernel BUG at mm/swapfile.c:2527! was 3.0.0 Xen – Xen Source
> Mailing List Archive: Re: Re: kernel BUG at mm/swapfile.c:2527! was 3.0.0 Xen pv guest – BUG: Unable to handle
但是,我发现的任何信息似乎都没有指出任何解决方案.我将升级到Linode提供的最新内核(从2.6.39.1-linode34到3.0.4-linode38).
现在还有什么我可以做的来诊断这个问题,或者将来是否会再次发生这个问题?我错过了什么吗?是否有人对可能引发此事的因素有所了解?
如果我能提供任何其他信息,请告诉我.万分感谢.
解决方法
在你的问题中,你忽略了空白部分…你说“图表没有显示内存使用率上升”,但他们真正显示的内容是在内存可能上升的时候没有数据. 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(“免费”下的第二列),减去当前运行的Apaches的数量(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个网络连接.”但是你看看他们的Apache实例并且他们正在使用60MB(不是一个非常大的大小),但是当你说他们需要将他们的VPS升级到32BG的RAM时他们就会惊慌失措.