Apache 2.2/2.4 效能調校 #01 Worker MPM

都架好Apache Server,卻還是使用預設值運行的話,那還真是可惜!其實小弟我是因緣際會下發現 worker 運行 wordpress 的效能還不錯,所以才開始研究這個 apache mpm。本文將以 CentOS 7(Apache 2.4) 和 CentOS 6.8(Apache 2.2) 為範例,不過參數調教適用於所有 Linux Apache。Windows平台就只能使用MPM Winnt,因此 Windows Apache 的使用者讀這篇文章就比較難獲得直接幫助。

ps. 其實網路頻寬夠大、優先權夠高的話,使用Apache Worker MPM,只需少少4GB記憶體就能跑出驚人效能!

前置作業
  1. 先確定你的伺服器CPU為多核心,因為多核心伺服器才能使用Multi-Processing Module!
  2. 確認伺服器作業系統不是Windows,因為對於Windows的Apache而言,最好的模組就是WINNT!
    設定方式可以參考:Apache MPM winnt
Step 1

確認MPM Engine

確認你的Apache Server現在用哪一個MPM Engine?
下列第3行的『Server MPM』可以看得出來現在伺服器並使用的是『Prefork』 Engine,這是Apache預設使用的MPM引擎,使用起來並沒有特別好,無法體現出高規格伺服器的能耐!
接下來就是要把它調整成Worker Engine!

 

Step 2

修改設定檔

Apache 2.4

編輯設定檔『 /etc/httpd/conf.modules.d/00-mpm.conf 』
增加第6行的註解,
去除第12行的註解!
存檔離開!

 

Apache 2.2

編輯設定檔『 /etc/sysconfig/httpd 』
將下列第9行的註解去除,存檔離開!

 

Step 3

重啟Apache

贊助廣告

先重啟Apache看看吧!
此步驟不能出錯唷!有錯誤的話要先debug~

CentOS 7

 

CentOS 6.8

 

Step 4

修改Config

Apache 2.4 Worker MPM 工作原理

建議可以先讀一下這段,將有助於了解 Apache 處理請求的處理過程與執行緒的生命週期。
每個控制行程(control process)負責啟動子行程(child process),每個子行程會在啟動的當下建立固定數量的執行緒(ThreadsPerChild)。對 Apache Worker MPM 而言這些執行緒就是處理請求和連線的最基礎單位。
Apache 會透過管理一個閒置執行緒池(spare thread pool),當收到請求時會優先將閒置執行緒來處理請求,因此使用 Worker MPM 不需要花費過多的時間在等待伺服器端新增行程、配置執行緒的時間。當 Apache 啟動時,會生成固定數量的子行程(StartServers)來等待接收請求。運行的過程中Apache 會自動將閒置執行緒總數控制在 MinSpareThreads 與 MaxSpareThreads 設定值之間。決定Apache作為伺服器的承載能力,則是取決於 MaxRequestWorkers,然而子行程的上限可以透過 MaxRequestWorkers 除以 ThreadsPerChild 計算得出。
ServerLimit 是子行程的最大值,設定值必須大於等於 MaxRequestWorkers 除以 ThreadsPerChild,而 ThreadLimit 則是只需要大於 ThreadsPerChild 設定即可。

 

Apache 2.4修改原則(CentOS 7):

將『<IfModule worker.c>…</IfModule』的設定值貼在第7行之後即可,這些設定值需要依據伺服器硬體能力調整!

  • ServerLimit:可配置的子行程(child process)數量上限。對 worker 來說,最好不要設定大於 MaxRequestWorkers、ThreadsPerChild所需要的的數值,因為可能會造成記憶體浪費。使用 Worker 的情況下,預設值是 16。
  • StartServers:Apache 啟動時初始化子行程(child process)的數量。
  • ThreadsPerChild:每個子行程可以被建立的執行緒數量。其設定值不可高於 ThreadLimit,否則會被強制重設並記錄 warring log。
  • ThreadLimit:Apache 執行緒上限,屬於硬性上限值。預設是 1920,但不可超過 20000,否則會導致 Apache 重啟時檢查失敗。
  • MaxRequestWorkers:表示子行程同時可處理的執行緒數量。對 worker 來說,至少要設定為 ServerLimit * ThreadsPerChild,這也代表著所有子行程允許啟用執行緒總數的上限。超過此設定值之後的請求將會置於佇列等待。
  • MinSpareThreads:對 worker 來說,此設定代表 Apache 至少要預備的閒置執行緒數量,當閒置執行緒數量不足時會自動新增執行緒。
  • MaxSpareThreads:對 worker 來說,此設定代表最大閒置執行緒,當Apache 發現閒置執行緒數量高於此設定值,將會 kill 閒置執行緒至低於此數量。設定時最好是依照大於等於MinSpareThreads、ThreadsPerChild總和為原則。
  • MaxConnectionsPerChild:每個子行程在自身的生命週期內開啟連線的上限次數,預設值為0。

這是伺服器記憶體僅有 1GB 的設定值,該台機器的 Apache 需要服務 3 個 WordPress 站台,流量大概是最高峰 20 人同時瀏覽,每日約 1000 人次。

Apache 2.2修改原則(CentOS 6.8):

  • ServerLimit:設定值存在硬性上限 20000 。此外,最好不要設定大於 MaxClients、ThreadsPerChild所需要的的數值,因為可能會造成記憶體浪費。
  • StartServers:跟 2.4 一樣,代表Apache 啟動時初始化子行程(child process)的數量。
  • MaxClients:同時會被處理的請求數量,設定值最好是 ServerLimit * ThreadPerChild
  • ThreadLimit:此設定值為 ThreadsPerChild 的上限值,如果此設定值高於 ThreadsPerChild 過多而未使用的執行緒將會造成大量的記憶體浪費。
  • ThreadsPerChild:代表每個子行程建立的執行緒數量,預設值為 64。
  • MinSpareThreads:跟 2.4 一樣,最少閒置執行緒數量 MinSpareThreads,worker 的預設值為 75。如果目前閒置執行緒數量不足,Apache 會自動新增執行緒直至大於等於此設定。
  • MaxSpareThreads:跟 2.4 一樣,最大閒置執行緒數量,使用 worker 的預設值為 250。
  • MaxRequestsPerChild:跟 2.4 MaxConnectionsPerChild 一樣,每個子行程在生命週期內處理請求的次數上限,超過上限的子行程會被結束,設為 0 表示沒有處理請求次數上限。

 

Step 5

重啟Apache Server

CentOS 7

 

CentOS 6.8

 

Reference
  1. Apache 2.4 MPM Worker
  2. Apache 2.2 MPM Worker

Andy Wang

站在巨人的肩膀上仍須戰戰兢兢!

One thought on “Apache 2.2/2.4 效能調校 #01 Worker MPM”

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料。