Windows-Server-2008-R2

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

  • January 13, 2017

當我將 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:子級:啟動 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:父級:收到關機信號–

編輯:2016 年 12 月 9 日:

按照此頁面https://support.microsoft.com/en-us/kb/106167將系統資料庫中的 IRPStackSize 更改為 20 和 25。仍然無法啟動 Apache 伺服器。

謝謝。

任何系統上的多處理模組 (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 設置執行穩定係統的設置。

引用自:https://serverfault.com/questions/818292