之前偷懒默认用yum安装了httpd。后来发现服务器内存暴增,一度达到75%
打开一看,好嘛后台休眠进程全是httpd。
重启之后再度访问发现内存还是稳步增长。
[root@iz2ze3ayxs2yps2i6b6m86z ~]# httpd -V
Server version: Apache/2.4. (CentOS)
Server built: Nov ::
Server's Module Magic Number: 20120211:24
Server loaded: APR 1.4., APR-UTIL 1.5.
Compiled using: APR 1.4., APR-UTIL 1.5.
Architecture: -bit
Server MPM: prefork
threaded: no
forked: yes (variable process count)
Server compiled with....
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=
-D HTTPD_ROOT="/etc/httpd"
-D SUEXEC_BIN="/usr/sbin/suexec"
-D DEFAULT_PIDLOG="/run/httpd/httpd.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="conf/mime.types"
-D SERVER_CONFIG_FILE="conf/httpd.conf"
进一步了解发现是prefork工作模式的缘故。
查看 Server MPM: prefork 确定了是运行在此工作模式下
于是乎,先想的策略是修改prefork工作模式的配置。
查看链接文件
[root@iz2ze3ayxs2yps2i6b6m86z conf.modules.d]# httpd -l
Compiled in modules:
core.c
mod_so.c
http_core.c
发现没有prefork。。
通过
-D HTTPD_ROOT="/etc/httpd"
-D SERVER_CONFIG_FILE="conf/httpd.conf"
确定了配置文件位置
查看配置文件发现 Include conf.modules.d/*.conf 继续追踪发现 00-mpm.conf中
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
目前的状况已经不再支持本地修改三种工作模式的配置。
三种不同的mpm模式:
1prefork模式
通过fork进程来处理连接队列。较为占用内存
2.worker模式
采用进程和线程的混合模式。缺点在于
3.event模式
worker模式的改进版,解决了保活问题,需要linux支持epoll。
文档链接:http://httpd.apache.org/docs/2.4/mpm.html
解决问题方法:
也可以自己下一个完整的包,编译之前配置好。然后重启服务器即可。
由于2.3以后,event模式已经全面支持,所以可以采用此模式来解决问题。
00-mpm.conf中
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
改为
LoadModule mpm_prefork_module modules/mod_mpm_event.so
然后重启服务器即可
注意 event模式需要较高版本的php
投奔nginx了 终止