【问题标题】:Too many '/usr/sbin/apache2 -k start' processes'/usr/sbin/apache2 -k start' 进程太多
【发布时间】:2020-07-08 13:42:59
【问题描述】:

我遇到了在 HTOP 中可见的 apache 进程 (/usr/sbin/apache2 -k start) 的问题。 enter image description here 每次刷新或来自客户端的连接后,进程的数量都会增加而不会停止运行。 即使浏览器关闭,该过程也会继续。 在每个与数据库连接的 php 页面中,我都以:

    $thread_id = $mysqli->thread_id;
    $mysqli->kill($thread_id);
    $mysqli->close(); 

过了一会儿,我的树莓派 3 运行非常缓慢,实际上太热了。 我使用默认设置默认安装了 apache。

Server version: Apache/2.4.38 (Raspbian)
Server built:   2019-10-15T19:53:42
Server's Module Magic Number: 20120211:84
Server loaded:  APR 1.6.5, APR-UTIL 1.6.1
Compiled using: APR 1.6.5, APR-UTIL 1.6.1
Architecture:   32-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/apache2"
 -D SUEXEC_BIN="/usr/lib/apache2/suexec"
 -D DEFAULT_PIDLOG="/var/run/apache2.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="mime.types"
 -D SERVER_CONFIG_FILE="apache2.conf"

在我的 mpm_prefork.conf 文件中:

<IfModule mpm_prefork_module>
    StartServers        4
    MinSpareServers     1
    MaxSpareServers     4
    MaxRequestWorkers   50
    MaxConnectionsPerChild  0
</IfModule>

在客户端离开页面或关闭浏览器后,我可以做什么或设置自动终止这些进程? 或者 apache 中是否有任何设置可以防止这种行为?

提前致谢!

【问题讨论】:

  • 是否只针对PHP连接数据库的HTTP连接?

标签: php linux apache raspberry-pi


【解决方案1】:

默认的 Apache 多进程模式是 CPU 密集型的基于 Fork 的模式。这意味着随着请求数量的增加,Apache 启动的进程数量也会增加 (http2)。分叉是 CPU 密集型的,很容易压倒 Pi。要使用更高效的多进程模型,请尝试mpm_worker_module,因为它使用线程来处理增加的吞吐量,并且可以通过配置限制父进程的数量。

有关 Apache2 的 MPM 选项的更多信息,see the "Choosing an MPM" section of this document

默认,prefork 模块:

prefork MPM 使用多个子进程,每个子进程都有一个线程。每个进程一次处理一个连接。在许多系统上,prefork 的速度与 worker 相当,但它使用更多的内存。 Prefork 的无线程设计在某些情况下比 worker 有优势:它可以与非线程安全的第三方模块一起使用,并且在线程调试支持较差的平台上更容易调试。

提议worker模块:

worker MPM 使用多个子进程,每个子进程有很多线程。每个线程一次处理一个连接。 Worker 通常是高流量服务器的不错选择,因为它的内存占用比 prefork MPM 更小。

下面是一个可行的示例配置:

<IfModule mpm_worker_module>
    ServerLimit          2 # how many processes max?
    StartServers         1 # how many processes start initially?
    MaxRequestWorkers   40 # maximum total number of threads that may be launched
    MinSpareThreads     25
    MaxSpareThreads     75
    ThreadsPerChild     20 # number of threads deployed by each child process
</IfModule>

请注意,您的 Apache2 安装必须使用您打算使用的 MPM 进行编译。 The docs 有更多相关信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 2012-01-29
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多