为什么Apache产生这么多的进程?

我有一个博客的WordPress的博客。 我想自己主持的经验和“乐趣”。 因为我刚成立,所以很less有观众收看。 我在使用Apache 2.4.23和MySQL 5.5.52运行Wordpress的Amazon EC2-micro Arch-Linux实例上。 我有1 GB的RAM。

我不认为这将是一个资源沉重的应用程序,但每次我尝试运行Wordpress,几天后,服务器总是崩溃。 这是由于Apache产生了100多个进程而不是杀死它们。 过一段时间后不应该这样?

顶级流程

我花了相当多的时间来search这个问题。 我已经设置了2 GB的交换尝试修复它。 这些过程也溢出了。 我已经将maxClients 40添加到了我的httpd.conf ,而且似乎有一段时间了,但是大约两周后,Apache又崩溃了。 我尝试了httpd.conf其他configuration,但是这会导致Apache崩溃得更快。 我有一个块,目前看起来像这样(几次尝试后):

 # StartServers 3 # MinSpareServers 2 # MaxSpareServers 5 # ServerLimit 10 maxClients 40 # MaxRequestsPerChild 100 # KeepAliveTimeout 2 

任何人都可以遇到这个具体的问题给我一些build议吗? 我只是想主持一个简单的WordPress博客。 如果有帮助,这是我的httpd -V

 [ec2-user~]$ httpd -V Server version: Apache/2.4.23 (Amazon) Server built: Jul 29 2016 21:42:17 Server's Module Magic Number: 20120211:61 Server loaded: APR 1.5.1, APR-UTIL 1.4.1 Compiled using: APR 1.5.1, APR-UTIL 1.4.1 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="/var/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" 

编辑:另外,这些进程在不间断睡眠(IO,状态= D)的事实是有问题的!

令人遗憾的是,大多数人使用的托pipe解决scheme,决定通过mod_php通过Apacheparsingphp内容。

您的PHP安装默认情况下不会是线程安全的,这有效地迫使Apache使用非线程mpm(多进程模块)。

你的Apache安装使用prefork(你可以在apachectl -V输出中看到)。 这个MPM产生每个请求的进程。 所以,如果你有点负载,现在知道一些浏览器发送多less个并发请求,那么这个过程列表就很平常。

所有这一切使Apache抓取,并承受您的PHP脚本的负载,使Apache看起来,因为它不是很好,当这一切都是由于PHPparsing和unperformant PHP脚本。

现在,你应该怎么做才能避免呢?

从mod_php的负担中卸载Apache,将你的phpparsing到php-fpm,这将允许你使用Apache HTTPD的“event”mpm,甚至可以让你有1个进程,如果你想要的话,它对加载高峰响应更为敏感,并且与其他任何http服务器一样酷和快。 而最重要的是,Apachestream程不会陷入数百人之中。

你可以在这里find一些关于如何configurationApache的提示: Apache官方维基PHP条目和mod_proxy_fcgi

很明显,即使是40个Apache进程也是如此。 你只有1GB的内存和2GB的交换空间,而你正在使用所有的内存和超过一半的交换空间。 您的进程处于D状态的原因是因为您的虚拟机正在进入和退出交换。 它不可能自行恢复; 你可以重新启动它。

显着降低MaxClients数量。 对于一个微型实例的低stream量站点,我无法想象任何你需要它高于10的方式(也不能让实例能够处理更多)。 事实上,你已经注释掉的设置看起来是一个非常好的起点,你应该恢复它们。

一旦你已经恢复,你可以开始看看系统上的其他什么东西可能会吃掉大量的RAM。