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

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

我有一个 Wordpress 博客,里面只有一篇文章。我想自己托管以获得体验和“乐趣”。我几乎没有任何浏览者,因为我才刚刚开始设置。我在 Amazon EC2-micro Arch-Linux 实例上使用 Apache 2.4.23 和 MySQL 5.5.52 来运行 Wordpress。我有 1 GB 的 RAM。

我不认为这会是一个占用大量资源的应用程序,但每次我尝试运行 Wordpress,几天后服务器总是崩溃。这是因为 Apache 生成了数百个进程,但没有终止它们。这些进程不是应该过一段时间就消失了吗?

顶级流程

我花了不少时间在谷歌上搜索这个问题。我设置了 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

有遇到过这个问题的人能给我一些建议吗?我只是想托管一个简单的 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)这一事实也是有问题的!

答案1

可耻的是,人们使用的大多数托管解决方案都决定通过 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 官方 Wiki PHP 条目修改代理服务器

答案2

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

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

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

答案3

对我来说,问题是 php 内存限制设置为 -1(无限制),通过编辑 php.ini 将其设置为 128M 后,内存使用量下降

相关内容