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 會自動將閒置執行緒總數控制在 MinSpareThreadsMaxSpareThreads 設定值之間。決定Apache作為伺服器的承載能力,則是取決於 MaxRequestWorkers,然而子行程的上限可以透過 MaxRequestWorkers 除以 ThreadsPerChild 計算得出。
ServerLimit 是子行程的最大值,設定值必須大於等於 MaxRequestWorkers 除以 ThreadsPerChild,而 ThreadLimit 則是只需要大於 ThreadsPerChild 設定即可。

 

Apache 2.4修改原則(CentOS 7):

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

  • ServerLimit:可配置的子行程(child process)數量上限。對 worker 來說,最好不要設定大於 MaxRequestWorkersThreadsPerChild所需要的的數值,因為可能會造成記憶體浪費。使用 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 閒置執行緒至低於此數量。設定時最好是依照大於等於MinSpareThreadsThreadsPerChild總和為原則。
  • MaxConnectionsPerChild:每個子行程在自身的生命週期內開啟連線的上限次數,預設值為0。

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

Apache 2.2修改原則(CentOS 6.8):

  • ServerLimit:設定值存在硬性上限 20000 。此外,最好不要設定大於 MaxClientsThreadsPerChild所需要的的數值,因為可能會造成記憶體浪費。
  • 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 如何處理網站訪客的留言資料