Назад | Перейти на главную страницу

Конфигурация WINNT Apache MPM «ThreadsPerChild» в 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) Недостаточно памяти для обработки этой команды. : AH00355: Дочерний: Ошибка CreateThread. Невозможно создать все рабочие потоки. Создано 190 из 200 потоков, запрошенных с помощью директивы конфигурации ThreadsPerChild.

[Чт, 01 декабря 18: 23: 04.474714 2016] [mpm_winnt: notice] [pid 3644: tid 380] AH00422: Родитель: Получен сигнал выключения -

РЕДАКТИРОВАТЬ: 9 декабря 2016 г .:

Подписался на эту страницу https://support.microsoft.com/en-us/kb/106167 изменить IRPStackSize в реестре на 20 и 25. Сервер Apache по-прежнему не запускается.

Спасибо.

Конфигурация потоков многопроцессорного модуля (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.

Этот человек говорит, что, используя 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 без поддержки потоков

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