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

Mik*_*ynn 7 apache-2.4

我有一个包含一篇文章的 Wordpress 博客。我想自己主持体验和“乐趣”。我几乎没有任何观众,因为我只是在准备。我在使用 Apache 2.4.23 和 MySQL 5.5.52 运行 Wordpress 的 Amazon EC2-micro Arch-Linux 实例上。我有 1 GB 的内存。

我不认为这会是一个资源繁重的应用程序,但是每次我尝试运行 Wordpress 时,几天后服务器总是崩溃。这是因为 Apache 产生了 100 个进程而不是杀死它们。这些不应该在一段时间后消失吗?

顶级流程

我现在花了很多时间在谷歌上搜索这个问题。我已经设置了 2 GB 的交换空间试图修复它。进程也溢出了。我已经添加maxClients 40到我的httpd.conf并且似乎工作了一段时间,但大约 2 周后 Apache 再次崩溃。我已经尝试过其他配置,httpd.conf但它们会导致 Apache 崩溃得更快。我有一个目前看起来像这样的块(经过多次尝试):

# StartServers 3
# MinSpareServers 2
# MaxSpareServers 5
# ServerLimit 10
 maxClients 40
# MaxRequestsPerChild 100
# KeepAliveTimeout 2
Run Code Online (Sandbox Code Playgroud)

任何有这个特定问题经验的人都可以给我一些建议吗?我只是想托管一个简单的 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"
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*ton 5

很明显,即使是 40 个 Apache 进程也太多了。您只有 1GB RAM 和 2GB 交换空间,并且您正在使用所有 RAM 和一半以上的交换空间。您的进程处于 D 状态的原因是您的虚拟机在交换区中频繁进出。它不太可能自行恢复;你也可以重新启动它。

大幅减少MaxClients数量。对于微型实例上的低流量站点,我无法想象您需要它高于 10(也无法让实例能够处理更多)。事实上,您注释掉的设置看起来是一个非常好的起点,您可能应该恢复它们。

一旦恢复,您就可以开始查看系统上还有什么可能消耗大量 RAM。


ezr*_*a-s 5

可耻的是,人们使用的大多数托管解决方案决定通过 Apache 使用 mod_php 解析 php 内容。

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

您的 Apache 安装使用 prefork(如您在 apachectl -V 输出中所见)。这个 mpm 为每个请求生成一个进程。因此,如果您承受了一些负载并且现在知道某些浏览器发送了多少并发请求,那么该进程列表非常常见。

所有这些都使 apache 爬行并承受您的 php 脚本导致的负载,使 Apache 看起来性能不佳,而这完全是由于 php 解析和性能不佳的 php 脚本造成的。

现在,你应该怎么做才能避免这种情况?

减轻 Apache 的 mod_php 负担,将您的 php 解析移至 php-fpm,这将允许您使用 Apache HTTPD 的“事件”mpm,如果您愿意,它甚至可以让您拥有一千个线程的 1 个进程,而不仅仅是也就是说,它对负载峰值的响应速度更快,并且与任何其他 http 服务器一样酷和快速。最重要的是,Apache 进程不会被困在数百个进程中。

您可以在以下位置找到有关如何为此配置 Apache 的一些提示:Apache Official Wiki PHP entry and mod_proxy_fcgi