之前偷懶默認用yum安裝了httpd。后來發現服務器內存暴增,一度達到75%
打開一看,好嘛后台休眠進程全是httpd。
重啟之后再度訪問發現內存還是穩步增長。
[root@iz2ze3ayxs2yps2i6b6m86z ~]# httpd -V Server version: Apache/2.4.6 (CentOS) Server built: Nov 5 2018 01:47:09 Server's Module Magic Number: 20120211:24 Server loaded: APR 1.4.8, APR-UTIL 1.5.2 Compiled using: APR 1.4.8, APR-UTIL 1.5.2 Architecture: 64-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=256 -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了 終止