我有一个媒体圣殿(dv)4 台服务器,配备 512mb,运行 Apache 2.2.21 64 位。
在启动后的 60 秒内,httpd 会生成 2-4 个进程,每个进程消耗约 150mb 内存(根据 top 的“RES”列)。这很快导致我的服务器崩溃。我所说的“崩溃”是指所有 URL 开始超时,结果我无法登录附加的 plask 面板。此外,ssh 不再起作用(连接超时),MediaTemple 提供的实时统计数据也停止工作。到目前为止,我发现的唯一解决方法是重新启动服务器。Apache 正在运行 PHP(Zend Engine 2.3.0),为简单的 Drupal 安装提供服务。
我已经尝试了一些建议媒体寺庙 维基没有任何改善。
- 什么原因导致 httpd 消耗这么多内存?
- 这是非典型行为吗?
- 我该怎么做才能修复此问题并将服务器恢复到可用状态?
我很乐意根据要求发布服务器详细信息、日志等。
编辑:我应该早点提到,这个服务器已经运行良好了 4 个月左右,只是在过去的一个月里才偶尔出现这样的崩溃。我希望确定这是否只是由于 Drupal 负载增加,还是其他(可能更恶意的)问题。
编辑:根据要求,这是运行的输出ps_mem.py今天。
-bash-3.2$ wget http://www.pixelbeat.org/scripts/ps_mem.py
-bash-3.2$ sudo python ps_mem.py
Private + Shared = RAM used Program
92.0 KiB + 12.0 KiB = 104.0 KiB qmail-clean
96.0 KiB + 14.0 KiB = 110.0 KiB splogger
116.0 KiB + 23.0 KiB = 139.0 KiB init
128.0 KiB + 12.0 KiB = 140.0 KiB qmail-rspawn
124.0 KiB + 16.0 KiB = 140.0 KiB syslogd
132.0 KiB + 12.0 KiB = 144.0 KiB qmail-lspawn
148.0 KiB + 13.0 KiB = 161.0 KiB qmail-send
208.0 KiB + 28.5 KiB = 236.5 KiB dbus-daemon
232.0 KiB + 36.5 KiB = 268.5 KiB xinetd
240.0 KiB + 32.5 KiB = 272.5 KiB mysqld_safe
328.0 KiB + 20.5 KiB = 348.5 KiB udevd
348.0 KiB + 66.0 KiB = 414.0 KiB courierlogger (4)
444.0 KiB + 85.5 KiB = 529.5 KiB bash
480.0 KiB + 50.0 KiB = 530.0 KiB xfs
592.0 KiB + 36.0 KiB = 628.0 KiB crond
544.0 KiB + 114.0 KiB = 658.0 KiB couriertcpd (4)
1.3 MiB + 82.5 KiB = 1.4 MiB sw-cp-serverd
1.2 MiB + 1.1 MiB = 2.3 MiB sshd (3)
3.1 MiB + 205.5 KiB = 3.3 MiB named
3.9 MiB + 48.2 MiB = 52.1 MiB spamd (2)
63.7 MiB + 387.0 KiB = 64.1 MiB mysqld
108.3 MiB + 9.2 MiB = 117.5 MiB httpd (7)
---------------------------------
245.4 MiB
=================================
顶部快照显示一个 httpd 服务以 root 身份运行,其他服务以 apache 用户身份运行。这(一个 root 进程)是典型的吗?
-bash-3.2$ top -b -n 1
top - 17:09:34 up 27 days, 18:04, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 38 total, 1 running, 37 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 946344k total, 581372k used, 364972k free, 0k buffers
Swap: 0k total, 0k used, 0k free, 0k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
21727 root 15 0 114m 52m 2112 S 0.0 5.6 0:09.17 spamd
21728 popuser 18 0 114m 50m 972 S 0.0 5.5 0:00.00 spamd
28112 apache 18 0 135m 3612 484 S 0.0 0.4 0:00.03 httpd
28110 root 18 0 259m 15m 8284 S 0.0 1.7 0:00.21 httpd
31854 apache 15 0 259m 9368 1492 S 0.0 1.0 0:00.00 httpd
28113 apache 15 0 260m 9400 1508 S 0.0 1.0 0:00.03 httpd
31853 apache 15 0 260m 9368 1484 S 0.0 1.0 0:00.00 httpd
5599 named 18 0 301m 5112 1976 S 0.0 0.5 0:00.51 named
31851 apache 15 0 309m 61m 4004 S 0.0 6.7 0:01.13 httpd
28124 apache 18 0 312m 63m 4996 S 0.0 6.8 0:03.92 httpd
1865 mysql 15 0 358m 70m 7112 S 0.0 7.6 5:52.36 mysqld
5824 root 18 0 3808 560 472 S 0.0 0.1 0:00.00 courierlogger
5834 root 18 0 3808 556 472 S 0.0 0.1 0:00.00 courierlogger
5842 root 18 0 3808 564 472 S 0.0 0.1 0:00.15 courierlogger
5851 root 18 0 3808 556 472 S 0.0 0.1 0:00.00 courierlogger
7255 qmailq 18 0 3812 428 344 S 0.0 0.0 0:00.00 qmail-clean
7252 qmaill 18 0 3816 556 468 S 0.0 0.1 0:00.00 splogger
7253 root 16 0 3856 468 352 S 0.0 0.0 0:00.00 qmail-lspawn
7254 qmailr 15 0 3856 472 356 S 0.0 0.0 0:00.00 qmail-rspawn
7250 qmails 15 0 3864 564 456 S 0.0 0.1 0:00.07 qmail-send
1418 root 15 0 5928 624 500 S 0.0 0.1 0:10.71 syslogd
1 root 18 0 10368 736 620 S 0.0 0.1 0:05.61 init
1695 root 18 0 10784 1300 1060 S 0.0 0.1 0:00.01 mysqld_safe
31869 serverad 15 0 12080 1716 1324 S 0.0 0.2 0:00.02 bash
31976 serverad 15 0 12624 1120 872 R 0.0 0.1 0:00.00 top
1123 root 15 -4 12636 684 356 S 0.0 0.1 0:00.00 udevd
5822 root 17 0 13188 612 476 S 0.0 0.1 0:00.00 couriertcpd
5832 root 15 0 13188 612 476 S 0.0 0.1 0:00.00 couriertcpd
5840 root 15 0 13188 612 476 S 0.0 0.1 0:00.46 couriertcpd
5849 root 18 0 13188 612 476 S 0.0 0.1 0:00.00 couriertcpd
3077 xfs 15 0 20276 1272 792 S 0.0 0.1 0:00.00 xfs
2035 root 15 0 20892 1180 588 S 0.0 0.1 0:04.17 crond
1427 dbus 19 0 21276 700 492 S 0.0 0.1 0:00.00 dbus-daemon
3523 root 15 0 21664 944 712 S 0.0 0.1 0:00.02 xinetd
28213 sw-cp-se 18 0 59512 2728 1420 S 0.0 0.3 0:00.03 sw-cp-serverd
1504 root 15 0 62680 1228 660 S 0.0 0.1 1:54.58 sshd
31866 root 15 0 96624 3704 2852 S 0.0 0.4 0:00.02 sshd
31868 serverad 15 0 96624 1892 1012 S 0.0 0.2 0:00.04 sshd
...以及根据 ps 的一些内存统计数据。
-bash-3.2$ ps aux | sort -nk +4 | tail
named 5599 0.0 0.5 308484 5112 ? Ssl Jul24 0:00 /usr/sbin/named -u named -c /etc/named.conf -u named -t /var/named/run-root
apache 28113 0.0 0.9 266364 9400 ? S 05:15 0:00 /usr/sbin/httpd
apache 31853 0.0 0.9 266364 9368 ? S 16:08 0:00 /usr/sbin/httpd
apache 31854 0.0 0.9 266228 9368 ? S 16:09 0:00 /usr/sbin/httpd
root 28110 0.0 1.6 266092 16028 ? Ss 05:15 0:00 /usr/sbin/httpd
popuser 21728 0.0 5.5 117128 52164 ? S Jul07 0:00 spamd child
root 21727 0.0 5.6 117128 53304 ? Ss Jul07 0:09 /usr/bin/spamd --username=popuser --daemonize --nouser-config --helper-home-dir=/var/qmail --max-children 1 --pidfile=/var/run/spamd/spamd_full.pid --socketpath=/tmp/spamd_full.sock
apache 31851 0.0 6.6 317320 63324 ? S 16:08 0:01 /usr/sbin/httpd
apache 28124 0.0 6.8 319536 64604 ? S 05:15 0:03 /usr/sbin/httpd
mysql 1865 0.0 7.6 367604 72376 ? Sl Jul04 5:52 /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 --port=3306
httpd.conf 中的一些可能相关的片段(调整 prefork 设置之后)。
-bash-3.2$ head httpd.conf -n 128 | tail -60
#
# Timeout: The number of seconds before receives and sends time out.
#
Timeout 20
#
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive Off
#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests 100
#
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
KeepAliveTimeout 15
##
## Server-Pool Size Regulation (MPM specific)
##
# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# ServerLimit: maximum value for MaxClients for the lifetime of the server
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule prefork.c>
StartServers 2
MinSpareServers 3
MaxSpareServers 5
ServerLimit 16
MaxClients 16
MaxRequestsPerChild 400000
</IfModule>
# worker MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule worker.c>
StartServers 1
MaxClients 50
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
谢谢!
答案1
每个消耗约 150mb 内存(根据 top 的‘RES’列)。
正如很多地方所解释的那样,这不是衡量进程内存使用情况的好方法。
这很快就让我的服务器崩溃了
如果您的系统内存不足,则说明您的配置有误。请先尝试正确测量内存使用情况并限制服务器数量,然后才能开始调整安装。
我该怎么做才能解决这个问题
您不会在这里得到答案 - 需要收集的问题和信息太多了。首先要了解内存和系统性能的实际情况,多读一些,再多读一些,建立收集指标的机制,最好设置一个测试环境,您可以在其中快速尝试不同的配置/负载,然后开始调整。
答案2
发生这种情况的原因可能有很多。作为在托管数据中心工作的人,我主要怀疑并询问以下日志:
- drupal 站点代码中可能存在内存泄漏 - 运行此脚本并在此发布结果。
- 该网站可能已被黑客入侵。因此请检查正在运行的 Apache 进程的权限。
您发布内存使用情况结果后,我们就可以缩小范围。
答案3
这是非常典型的行为,可以在 apache 配置中更改。我遇到了同样的问题,这对我有帮助:
Apache 生成几个进程来等待连接 - 这比按需生成要快。
使用以下指令:
StartServers 3
MinSpareServers 2
MaxSpareServers 3
在 apache 配置中指定生成的进程的数量。
这是有关多个 Apache 进程的类似主题 ->https://stackoverflow.com/questions/501205/how-can-i-prevent-tons-of-apache-processes-spawning-when-i-start-apache-and-proc