我在 CentOS LAMP 上有一个 1GB RAM 的 Linode,运行 Drupal Aegir,只有 3 个 Open Atrium 站点,大约有 10-20 个并发用户。在随机时间,它会因内存不足而终止。我搞不清楚是什么原因造成的。我不确定是否需要在我的 CentOS LAMP 堆栈上做一些内存使用调整。看来 Apache 和/或 PHP 导致了问题。我在 Apache 上有一个 MPM 预分叉。我需要快速控制它。在几个小时的崩溃和烧毁 OOM 之后,这里有一些信息。在我看来,似乎没有什么问题……这里有一些有趣的细节。我希望比我聪明的人能给你一些启发。我在下面包含了配置和性能信息。首先,Linode OOM 终止……
OOM Kill#1 截图
OOM Kill#2 截图
Apache 使用的 MPM 类型
httpd -V | grep 'MPM'
Server MPM: Prefork
-D APACHE_MPM_DIR="server/mpm/prefork"
我的 httpd.conf 中的当前设置
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
现在,这是我的运行进程
辅助
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 2208 568 ? Ss 10:20 0:01 init [3]
root 2 0.0 0.0 0 0 ? S 10:20 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 10:20 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S 10:20 0:00 [kworker/u:0]
root 6 0.0 0.0 0 0 ? S 10:20 0:00 [migration/0]
root 7 0.0 0.0 0 0 ? S 10:20 0:00 [migration/1]
root 9 0.0 0.0 0 0 ? S 10:20 0:00 [ksoftirqd/1]
root 10 0.0 0.0 0 0 ? S 10:20 0:00 [migration/2]
root 12 0.0 0.0 0 0 ? S 10:20 0:00 [ksoftirqd/2]
root 13 0.0 0.0 0 0 ? S 10:20 0:00 [migration/3]
root 15 0.0 0.0 0 0 ? S 10:20 0:00 [ksoftirqd/3]
root 16 0.0 0.0 0 0 ? S< 10:20 0:00 [cpuset]
root 17 0.0 0.0 0 0 ? S< 10:20 0:00 [khelper]
root 18 0.0 0.0 0 0 ? S 10:20 0:00 [kdevtmpfs]
root 19 0.0 0.0 0 0 ? S 10:20 0:00 [kworker/u:1]
root 21 0.0 0.0 0 0 ? S 10:20 0:00 [xenwatch]
root 22 0.0 0.0 0 0 ? S 10:20 0:00 [xenbus]
root 162 0.0 0.0 0 0 ? S 10:20 0:00 [sync_supers]
root 164 0.0 0.0 0 0 ? S 10:20 0:00 [bdi-default]
root 166 0.0 0.0 0 0 ? S< 10:20 0:00 [kblockd]
root 174 0.0 0.0 0 0 ? S 10:20 0:00 [kworker/3:1]
root 178 0.0 0.0 0 0 ? S< 10:20 0:00 [md]
root 262 0.0 0.0 0 0 ? S< 10:20 0:00 [rpciod]
root 275 0.0 0.0 0 0 ? S 10:20 0:01 [kswapd0]
root 276 0.0 0.0 0 0 ? SN 10:20 0:00 [ksmd]
root 277 0.0 0.0 0 0 ? S 10:20 0:00 [fsnotify_mark]
root 281 0.0 0.0 0 0 ? S 10:20 0:00 [ecryptfs-kthr]
root 283 0.0 0.0 0 0 ? S< 10:20 0:00 [nfsiod]
root 284 0.0 0.0 0 0 ? S< 10:20 0:00 [cifsiod]
root 287 0.0 0.0 0 0 ? S 10:20 0:00 [jfsIO]
root 288 0.0 0.0 0 0 ? S 10:20 0:00 [jfsCommit]
root 289 0.0 0.0 0 0 ? S 10:20 0:00 [jfsCommit]
root 290 0.0 0.0 0 0 ? S 10:20 0:00 [jfsCommit]
root 291 0.0 0.0 0 0 ? S 10:20 0:00 [jfsCommit]
root 292 0.0 0.0 0 0 ? S 10:20 0:00 [jfsSync]
root 293 0.0 0.0 0 0 ? S< 10:20 0:00 [xfsalloc]
root 294 0.0 0.0 0 0 ? S< 10:20 0:00 [xfs_mru_cache]
root 295 0.0 0.0 0 0 ? S< 10:20 0:00 [xfslogd]
root 296 0.0 0.0 0 0 ? S< 10:20 0:00 [glock_workque]
root 297 0.0 0.0 0 0 ? S< 10:20 0:00 [delete_workqu]
root 298 0.0 0.0 0 0 ? S< 10:20 0:00 [gfs_recovery]
root 299 0.0 0.0 0 0 ? S< 10:20 0:00 [crypto]
root 862 0.0 0.0 0 0 ? S 10:20 0:00 [khvcd]
root 978 0.0 0.0 0 0 ? S< 10:20 0:00 [kpsmoused]
root 979 0.0 0.0 0 0 ? S 10:20 0:01 [kworker/1:1]
root 982 0.0 0.0 0 0 ? S 10:20 0:00 [kworker/2:1]
root 1017 0.0 0.0 0 0 ? S< 10:20 0:00 [deferwq]
root 1020 0.0 0.0 0 0 ? S 10:20 0:00 [kjournald]
root 1044 0.0 0.0 0 0 ? S 10:20 0:00 [kauditd]
root 1077 0.0 0.0 2424 364 ? S<s 10:20 0:00 /sbin/udevd -d
root 2734 0.0 0.0 0 0 ? S 10:20 0:00 [flush-202:0]
root 2780 0.0 0.0 2452 40 ? Ss 10:20 0:00 /sbin/dhclient
root 2847 0.0 0.0 10624 464 ? S<sl 10:20 0:00 auditd
root 2849 0.0 0.0 11184 572 ? S<sl 10:20 0:00 /sbin/audispd
root 2869 0.0 0.0 1964 628 ? Ss 10:20 0:00 syslogd -m 0
root 2872 0.0 0.0 1808 292 ? Ss 10:20 0:00 klogd -x
named 2913 0.0 0.1 58936 1752 ? Ssl 10:20 0:00 /usr/sbin/named
dbus 2935 0.0 0.0 2896 808 ? Ss 10:20 0:00 dbus-daemon --s
root 2971 0.0 0.0 23268 828 ? Ssl 10:20 0:01 automount
root 2990 0.0 0.0 7256 748 ? Ss 10:20 0:00 /usr/sbin/sshd
ntp 3004 0.0 0.4 4548 4544 ? SLs 10:20 0:01 ntpd -u ntp:ntp
root 3015 0.0 0.0 5344 176 ? Ss 10:20 0:00 /usr/sbin/vsftp
root 3051 0.0 0.0 4676 956 ? S 10:20 0:00 /bin/sh /usr/bi
mysql 3143 13.5 1.2 124592 12888 ? Sl 10:20 56:33 /usr/libexec/my
root 3181 0.0 0.0 9372 1020 ? Ss 10:20 0:00 sendmail: accep
smmsp 3189 0.0 0.1 8280 1152 ? Ss 10:20 0:00 sendmail: Queue
root 3198 0.0 0.0 2044 224 ? Ss 10:20 0:00 gpm -m /dev/inp
root 3215 0.0 0.1 5384 1092 ? Ss 10:21 0:00 crond
xfs 3233 0.0 0.0 3308 780 ? Ss 10:21 0:00 xfs -droppriv -
root 3349 0.0 0.0 2408 332 ? Ss 10:21 0:00 /usr/sbin/atd
root 3372 0.0 1.0 26696 10704 ? SN 10:21 0:00 /usr/bin/python
root 3374 0.0 0.0 2704 832 ? SN 10:21 0:01 /usr/libexec/ga
root 3375 0.0 1.3 19420 13676 ? Ss 10:21 0:02 /usr/bin/perl /
root 3378 0.0 0.0 1792 428 hvc0 Ss+ 10:21 0:00 /sbin/mingetty
apache 5161 0.1 3.5 53992 36252 ? S 14:28 0:11 /usr/sbin/httpd
apache 5162 0.0 3.5 53880 36104 ? S 14:28 0:09 /usr/sbin/httpd
apache 5163 0.1 3.5 54128 36424 ? S 14:28 0:13 /usr/sbin/httpd
root 18629 0.0 0.9 27828 9596 ? Ss 12:09 0:01 /usr/sbin/httpd
apache 18631 0.0 3.4 53064 35476 ? S 12:09 0:15 /usr/sbin/httpd
apache 18632 0.0 3.5 53636 35984 ? S 12:09 0:15 /usr/sbin/httpd
apache 18633 0.1 3.4 53340 35816 ? S 12:09 0:19 /usr/sbin/httpd
apache 18634 0.1 3.6 54936 37544 ? S 12:09 0:20 /usr/sbin/httpd
apache 18635 0.0 3.5 53928 36328 ? S 12:09 0:14 /usr/sbin/httpd
apache 18636 0.1 3.4 53080 35636 ? S 12:09 0:20 /usr/sbin/httpd
apache 18637 0.0 3.4 53072 35364 ? S 12:09 0:12 /usr/sbin/httpd
apache 18638 0.0 3.5 53680 36336 ? S 12:09 0:15 /usr/sbin/httpd
apache 18751 0.1 3.4 53492 35924 ? S 12:10 0:22 /usr/sbin/httpd
root 19122 0.0 0.0 0 0 ? S 16:08 0:00 [kworker/3:2]
root 21015 0.0 0.0 0 0 ? S 16:22 0:00 [kworker/2:2]
root 22764 0.0 0.0 0 0 ? S 16:36 0:00 [kworker/0:2]
apache 23494 0.1 3.5 53884 36288 ? S 12:45 0:17 /usr/sbin/httpd
apache 23498 0.1 4.1 60572 42756 ? S 12:45 0:19 /usr/sbin/httpd
root 23996 0.0 0.0 0 0 ? S 16:44 0:00 [kworker/1:0]
root 27059 0.0 0.2 10108 2940 ? Rs 17:06 0:00 sshd: root@pts/
root 27168 0.0 0.1 4812 1456 pts/0 Ss 17:07 0:00 -bash
root 27464 0.0 0.0 0 0 ? S 17:09 0:00 [kworker/0:1]
root 28565 0.0 0.0 4400 928 pts/0 R+ 17:17 0:00 ps aux
免费使用情况统计
free -m
total used free shared buffers cached
Mem: 1003 655 347 0 29 151
-/+ buffers/cache: 474 528
Swap: 511 13 498
按内存使用情况排序的正在运行的进程列表
ps -eo pmem,pcpu,rss,vsize,args | sort -k 1 -r | less
%MEM %CPU RSS VSZ COMMAND
4.1 0.1 42756 60572 /usr/sbin/httpd
3.6 0.1 37544 54936 /usr/sbin/httpd
3.5 0.1 36424 54128 /usr/sbin/httpd
3.5 0.1 36288 53884 /usr/sbin/httpd
3.5 0.1 36252 53992 /usr/sbin/httpd
3.5 0.0 36336 53680 /usr/sbin/httpd
3.5 0.0 36328 53928 /usr/sbin/httpd
3.5 0.0 36104 53880 /usr/sbin/httpd
3.5 0.0 35984 53636 /usr/sbin/httpd
3.4 0.1 35924 53492 /usr/sbin/httpd
3.4 0.1 35816 53340 /usr/sbin/httpd
3.4 0.1 35636 53080 /usr/sbin/httpd
3.4 0.0 35628 53328 /usr/sbin/httpd
3.4 0.0 35476 53064 /usr/sbin/httpd
1.3 13.5 13792 125496 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock
1.3 0.0 13676 19420 /usr/bin/perl /usr/libexec/webmin/miniserv.pl /etc/webmin/miniserv.conf
1.0 0.0 10708 26696 /usr/bin/python -tt /usr/sbin/yum-updatesd
0.9 0.0 9596 27828 /usr/sbin/httpd
0.4 0.0 4544 4548 ntpd -u ntp:ntp -p /var/run/ntpd.pid -g
iostat
avg-cpu: %user %nice %system %iowait %steal %idle
6.72 0.03 2.39 0.50 0.49 89.89
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
xvda 6.00 138.91 123.01 3397138 3008160
xvdb 0.06 0.15 1.11 3576 27040
iostat -d -x 2 5
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
xvda 0.07 12.07 2.72 3.27 138.36 122.77 43.61 0.38 62.71 4.77 2.86
xvdb 0.00 0.09 0.01 0.05 0.15 1.10 20.51 0.00 48.04 3.10 0.02
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
xvda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
xvdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
xvda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
xvdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
xvda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
xvdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
xvda 0.00 0.00 3.00 0.00 36.00 0.00 12.00 0.02 6.00 6.00 1.80
xvdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
答案1
我遇到了几乎相同的问题 - 1GB linode、apache、mysql、php、Yii(而不是 Drupal)和 Ubuntu 而不是 CentOS。
我建议您检查 mysql 错误日志,以确保没有任何表需要修复。此外,尝试打开 mysql 慢查询日志。就我而言,结果是蜘蛛偶尔会抓取几个查询速度非常慢的页面(不知何故索引被破坏了)... 最终 OOM 杀手会启动。虽然这可能不是导致您出现问题的原因,而且您现在可能已经纠正了它,但检查起来很容易。
更糟糕的是,您可以使用 oom_adjust 至少主要控制哪些进程被 oom killer 打击,这通常可以减轻问题。
答案2
禁用 OOM Killer,然后正常调试(查找最庞大的进程,或者随着时间推移而增长的进程。观察它们如何定位内存泄漏,然后纠正它。
这是完全有可能的(我想说可能) OOM Killer 做了错事,但是当您在不杀死进程的情况下进行一些调试时,您就会发现这是否属实。
免责声明:我相信 OOM Killer 是错误之举一般来说。
POSIX 明确指出, 可能会
malloc()
失败(返回NULL
),并且调用 的程序malloc()
应该预料到这种失败并进行适当处理。OOM Killer 的核心是一种拐杖,它试图通过malloc()
任意杀死另一个程序来使一个程序的调用成功——在我看来,第一个拥有内存的人应该保留它,而闯入者应该被告知他们的请求无法得到满足。