WINNT Конфигурация «ThreadsPerChild» Apache MPM в Windows Server 2008 R2

Я получаю сообщение об ошибке и не могу запустить Apache, когда устанавливаю для ThreadPerChild значение 200, хотя у меня все еще остается 60% свободной ОЗУ. Сервер - Windows Server 2008 R2 с 4 ГБ оперативной памяти. Как в этом случае использовать больше ОЗУ для apache?

Моя конфигурация 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>

Что я получаю в error_log apache:

[Чт, 01 декабря, 18: 23: 04.459113 2016] [mpm_winnt: notice] [pid 3396: tid 288] AH00354: Потомок: запуск 200 рабочих потоков.

[Чт, 01 декабря 18: 23: 04.459113 2016] [mpm_winnt: crit] [pid 3396: tid 288] (OS 8) Нет enough storage is available to process this command. : AH00355: Child: CreateThread failed. Unable to create all worker threads. Created 190 of the 200 threads requested with the ThreadsPerChild configuration directive.

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

EDIT: 9 Dec 2016:

Followed this page https://support.microsoft.com/en-us/kb/106167 to change the IRPStackSize in Registry to 20 and 25. Still failed to start Apache server.

Thanks.

1
задан 9 December 2016 в 05:34
2 ответа

Конфигурация потоков многопроцессорного модуля (mpm) в любой системе привязана к определенным ограничениям, системным ограничениям и скомпилированным отказоустойчивым настройкам, как описано в статье Apache MPM Общие директивы

Директива ThreadsPerChild

Эта директива устанавливает количество потоков, создаваемых каждым дочерним процессом. Потомок создает эти потоки при запуске и больше никогда не создает. При использовании MPM, например mpm_winnt, где есть только один дочерний процесс, это число должно быть достаточно большим, чтобы справиться со всей нагрузкой на сервер. Если используется MPM-подобный worker, где есть несколько дочерних процессов, общее количество потоков должно быть достаточно большим, чтобы справиться с общей нагрузкой на сервер.

Директива ThreadLimit

При использовании этой директивы необходимо соблюдать особую осторожность. Если для ThreadLimit задано значение намного выше, чем для ThreadsPerChild, будет выделена дополнительная неиспользуемая общая память. Если для ThreadLimit и ThreadsPerChild заданы значения выше, чем система может обрабатывать, Apache httpd может не запуститься или система может стать нестабильной. Не устанавливайте значение этой директивы выше, чем ваш наибольший прогнозируемый параметр ThreadsPerChild для текущего запуска Apache httpd.

И они также указывают, что ...

Значение по умолчанию для ThreadLimit составляет 1920 при использовании с mpm_winnt и 64 при использовании с другими.

Существует также жестко скомпилированный предел, который можно обойти, перекомпилировав код, как описано здесь:

жесткий предел ThreadLimit 20000 (или ThreadLimit 100000 с событием, ThreadLimit 15000 с mpm_winnt), скомпилированный на сервере. Это сделано, чтобы избежать неприятных эффектов, вызванных опечатками. Чтобы увеличить его даже дальше этого предела, вам нужно будет изменить значение MAX_THREAD_LIMIT в исходном файле mpm и перестроить сервер.

Директива ThreadStackSize

Директива ThreadStackSize устанавливает размер стека (для автоданных) потоки, которые обрабатывают клиентские соединения и вызывают модули, чтобы помочь в обработке этих соединений. В большинстве случаев размер стека по умолчанию в операционной системе является разумным, но есть некоторые условия, при которых его, возможно, потребуется изменить:

Которые ...

Не рекомендуется уменьшать ThreadStackSize, если не установлен высокий необходимо количество потоков для каждого дочернего процесса. На некоторых платформах (включая Linux) значение 128000 уже слишком низкое и вызывает сбои с некоторыми распространенными модулями.

Решение

Если вы собираетесь увеличить директиву ThreadsPerChild, вам придется выровнять директиву ThreadLimit на то же значение или только немного выше, дополнительно уменьшив директиву ThreadStackSize до более низкого значения, чем значение по умолчанию, при этом сохраняя стабильную систему.

Возможное решение:

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

Вам придется немного поиграться с эти значения определяют настройку, которая позволит вам запустить стабильную систему с максимально возможной настройкой ThreadsPerChild.

1
ответ дан 3 December 2019 в 20:31

Этот человек говорит, что, используя 64-битную Windows и Apache, они смогли максимизировать свои ThreadsPerChild .

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

Сегодня я попробовал ту же конфигурацию, что описан выше, но с использованием системы x64:
Windows Server 2012 (x64)
Apache 2.4.7 VC11, 64-разрядная версия
mod_fcgid 2.3.9
PHP 5.4.24 VC11 Non-thread-safe

Однако в 64-битной системе исчезли две проблемы:
1. Для mpm ThreadsPerChild теперь можно установить значение 15000

1
ответ дан 3 December 2019 в 20:31

Теги

Похожие вопросы