AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 818292
Accepted
user3162662
user3162662
Asked: 2016-12-02 22:04:06 +0800 CST2016-12-02 22:04:06 +0800 CST 2016-12-02 22:04:06 +0800 CST

Windows Server 2008 R2 上的 WINNT Apache MPM“ThreadsPerChild”配置

  • 772

当我将 ThreadPerChild 设置为 200 时出现错误并且无法启动 Apache,尽管我仍有 60% 的可用 RAM。服务器是具有 4GB RAM 的 Windows Server 2008 R2。在这种情况下如何为 apache 使用更多 RAM?

我的 Apache MPM 配置:

# WinNT MPM
# ThreadsPerChild: constant number of worker threads in the server process
# MaxRequestsPerChild: maximum  number of requests a server process serves
# Win32DisableAcceptEx: Use accept() rather than AcceptEx() to accept network connections
<IfModule mpm_winnt_module>
   ThreadStackSize 8388608
    ThreadsPerChild      170
    MaxRequestsPerChild    0
    #Win32DisableAcceptEx
</IfModule>

我在 apache 的 error_log 中得到了什么:

[Thu Dec 01 18:23:04.459113 2016] [mpm_winnt:notice] [pid 3396:tid 288] AH00354: Child: 启动 200 个工作线程。

[Thu Dec 01 18:23:04.459113 2016] [mpm_winnt:crit] [pid 3396:tid 288] (OS 8)没有足够的存储空间来处理这个命令。:AH00355:孩子:CreateThread 失败。无法创建所有工作线程。在使用 ThreadsPerChild 配置指令请求的 200 个线程中创建了 190 个。

[Thu Dec 01 18:23:04.474714 2016] [mpm_winnt:notice] [pid 3644:tid 380] AH00422: Parent: Received shutdown signal --

编辑:2016 年 12 月 9 日:

按照此页面https://support.microsoft.com/en-us/kb/106167将注册表中的 IRPStackSize 更改为 20 和 25。仍然无法启动 Apache 服务器。

谢谢。

amazon-ec2 apache2 windows-server-2008-r2 mpm-prefork
  • 2 2 个回答
  • 12314 Views

2 个回答

  • Voted
  1. Best Answer
    John K. N.
    2017-01-14T02:52:52+08:002017-01-14T02:52:52+08:00

    任何系统上的多处理模块 (mpm) 的线程配置都受到一定的限制、系统限制和编译的故障安全设置,如Apache MPM 通用指令一文中所述

    ThreadsPerChild 指令

    该指令设置每个子进程创建的线程数。孩子在启动时创建这些线程并且永远不会创建更多。如果使用像 mpm_winnt 这样的 MPM,其中只有一个子进程,那么这个数字应该足够高以处理服务器的整个负载。如果使用类似 MPM 的 worker,其中有多个子进程,线程总数应该足够高以处理服务器上的常见负载。

    ThreadLimit 指令

    使用该指令时必须特别小心。如果 ThreadLimit 设置为远高于 ThreadsPerChild 的值,则会分配额外未使用的共享内存。如果 ThreadLimit 和 ThreadsPerChild 都设置为高于系统可以处理的值,Apache httpd 可能无法启动或系统可能变得不稳定。不要将此指令的值设置为高于当前运行的 Apache httpd 的最大预测 ThreadsPerChild 设置。

    他们还指出...

    与 mpm_winnt 一起使用时,ThreadLimit的默认值是 1920 ,而在与其他人一起使用时是 64。

    还有一个硬编码的编译限制,您可以通过重新编译代码来规避,如下所述:

    有一个硬限制 ThreadLimit 20000(或 ThreadLimit 100000 with event,ThreadLimit 15000 with mpm_winnt)编译到服务器中。这是为了避免错别字造成的不良影响。要使其进一步超过此限制,您需要修改 mpm 源文件中的 MAX_THREAD_LIMIT 的值并重建服务器。

    ThreadStackSize 指令

    ThreadStackSize 指令设置处理客户端连接并调用模块以帮助处理这些连接的线程的堆栈(用于自动数据)的大小。在大多数情况下,操作系统默认的堆栈大小是合理的,但在某些情况下可能需要调整:

    哪个是...

    除非每个子进程需要大量线程,否则建议不要减少 ThreadStackSize。在某些平台(包括 Linux)上,128000 的设置已经太低,并且会导致一些常见模块崩溃。

    解决方案

    如果要增加 ThreadsPerChild 指令,则必须将 ThreadLimit 指令对齐到相同的值或仅略高一点,同时另外将 ThreadStackSize 指令降低到比默认值低的值,同时仍保持系统稳定。

    一个可能的解决方案是:

    <IfModule mpm_winnt_module>
        ThreadStackSize  6291456
        ThreadsPerChild      200
        ThreadLimit          200
        MaxRequestsPerChild    0
        #Win32DisableAcceptEx
    </IfModule>
    

    您将不得不对这些值进行一些调整,以确定允许您以最大可能的 ThreadsPerChild 设置运行稳定系统的设置。

    • 2
  2. Chloe
    2017-01-13T22:18:16+08:002017-01-13T22:18:16+08:00

    这个人说,通过使用 64 位 Windows 和 Apache,他们能够最大化他们的ThreadsPerChild.

    https://www.apachelounge.com/viewtopic.php?t=5754

    今天我尝试了与上述相同的配置,但使用的是 x64 系统:
    Windows Server 2012 (x64)
    Apache 2.4.7 VC11 64bit
    mod_fcgid 2.3.9
    PHP 5.4.24 VC11 Non-thread-safe

    但是,在 64 位系统上,两个问题消失了:
    1. 现在可以将 mpm ThreadsPerChild 设置为 15000

    • 1

相关问题

  • 权限被拒绝(公钥)。从本地 Ubuntu 到 Amazon EC2 服务器的 SSH

  • 管理员如何管理他们的 EC2 EBS 和快照?

  • 云有多大?[关闭]

  • EC2 映像启动

  • 如何将安全组添加到正在运行的 EC2 实例?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve