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>
Что я получаю в apache error_log:
[Четверг, 01: 18:23:04.459113 2016] [mpm_winnt:note] [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:note] [pid 3644:tid 380] AH00422: родитель: получен сигнал выключения -
РЕДАКТИРОВАТЬ: 9 декабря 2016 г.:
Перейдите на эту страницу https://support.microsoft.com/en-us/kb/106167 чтобы изменить IRPStackSize в реестре на 20 и 25. По-прежнему не удалось запустить сервер Apache.
Благодарю.
2 ответа
Конфигурация потока модуля многопроцессорной обработки (mpm) в любой системе связана с определенными ограничениями, системными ограничениями и скомпилированными параметрами отказоустойчивости, как описано в статье Общие директивы Apache MPM.
Директива ThreadsPerChild
Эта директива устанавливает количество потоков, создаваемых каждым дочерним процессом. Ребенок создает эти потоки при запуске и никогда не создает больше. Если используется MPM, такой как mpm_winnt, где есть только один дочерний процесс, это число должно быть достаточно большим, чтобы обрабатывать всю нагрузку на сервер. Если используется MPM-подобный работник, где есть несколько дочерних процессов, общее количество потоков должно быть достаточно большим, чтобы справиться с общей нагрузкой на сервер.
Директива 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 64bit
mod_fcgid 2.3.9
PHP 5.4.24 VC11 Не потокобезопасныйОднако в 64-битной системе две проблемы исчезли:
1. mpm ThreadsPerChild теперь может быть установлен на 15000