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記憶體就能跑出驚人效能!
- 先確定你的伺服器CPU為多核心,因為多核心伺服器才能使用Multi-Processing Module!
- 確認伺服器作業系統不是Windows,因為對於Windows的Apache而言,最好的模組就是WINNT!
設定方式可以參考:Apache MPM winnt
確認MPM Engine
確認你的Apache Server現在用哪一個MPM Engine?
下列第3行的『Server MPM』可以看得出來現在伺服器並使用的是『Prefork』 Engine,這是Apache預設使用的MPM引擎,使用起來並沒有特別好,無法體現出高規格伺服器的能耐!
接下來就是要把它調整成Worker Engine!
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[andy@www ~]$ sudo httpd -V Server version: Apache/2.2.15 (Unix) Server built: Aug 15 2017 19:44:58 Server's Module Magic Number: 20051115:25 Server loaded: APR 1.3.9, APR-Util 1.3.9 Compiled using: APR 1.3.9, APR-Util 1.3.9 Architecture: 64-bit Server MPM: Prefork threaded: no forked: yes (variable process count) Server compiled with.... -D APACHE_MPM_DIR="server/mpm/prefork" (...以下省略) |
修改設定檔
Apache 2.4
編輯設定檔『 /etc/httpd/conf.modules.d/00-mpm.conf 』
增加第6行的註解,
去除第12行的註解!
存檔離開!
1 |
[andy@www ~]$ sudo vim /etc/httpd/conf.modules.d/00-mpm.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# Select the MPM module which should be used by uncommenting exactly # one of the following LoadModule lines: # prefork MPM: Implements a non-threaded, pre-forking web server # See: http://httpd.apache.org/docs/2.4/mod/prefork.html #LoadModule mpm_prefork_module modules/mod_mpm_prefork.so # worker MPM: Multi-Processing Module implementing a hybrid # multi-threaded multi-process web server # See: http://httpd.apache.org/docs/2.4/mod/worker.html # LoadModule mpm_worker_module modules/mod_mpm_worker.so # event MPM: A variant of the worker MPM with the goal of consuming # threads only for connections with active processing # See: http://httpd.apache.org/docs/2.4/mod/event.html # #LoadModule mpm_event_module modules/mod_mpm_event.so |
Apache 2.2
編輯設定檔『 /etc/sysconfig/httpd 』
將下列第9行的註解去除,存檔離開!
1 |
[andy@www ~]$ sudo vim /etc/sysconfig/httpd |
1 2 3 4 5 6 7 8 9 |
# Configuration file for the httpd service. # # The default processing model (MPM) is the process-based # 'prefork' model. A thread-based model, 'worker', is also # available, but does not work with some modules (such as PHP). # The service must be stopped before changing this variable. # HTTPD=/usr/sbin/httpd.worker |
重啟Apache
先重啟Apache看看吧!
此步驟不能出錯唷!有錯誤的話要先debug~
CentOS 7
1 |
[andy@www ~]$ sudo systemctl restart httpd |
CentOS 6.8
1 |
[andy@www ~]$ sudo service httpd restart |
修改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):
1 |
[andy@www ~]$ sudo vim /etc/httpd/conf.modules.d/00-mpm.conf |
將『<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。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
(以上省略) # worker MPM: Multi-Processing Module implementing a hybrid # multi-threaded multi-process web server # See: http://httpd.apache.org/docs/2.4/mod/worker.html # LoadModule mpm_worker_module modules/mod_mpm_worker.so <IfModule worker.c> ServerLimit 20 StartServers 8 ThreadsPerChild 25 MaxRequestWorkers 500 MinSpareThreads 50 MaxSpareThreads 150 MaxConnectionsPerChild 500 </IfModule> |
這是伺服器記憶體僅有 1GB 的設定值,該台機器的 Apache 需要服務 3 個 WordPress 站台,流量大概是最高峰 20 人同時瀏覽,每日約 1000 人次。
Apache 2.2修改原則(CentOS 6.8):
1 |
[andy@www ~]$ sudo vim /etc/httpd/conf/httpd.conf |
- 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 表示沒有處理請求次數上限。
1 2 3 4 5 6 7 8 9 10 |
<IfModule worker.c> ServerLimit 20 StartServers 8 MaxClients 500 ThreadLimit 25 ThreadsPerChild 25 MinSpareThreads 25 MaxSpareThreads 150 MaxRequestsPerChild 500 </IfModule> |
重啟Apache Server
CentOS 7
1 |
[andy@www ~]$ sudo systemctl restart httpd |
CentOS 6.8
1 |
[andy@www ~]$ sudo service httpd restart |
Pingback:CentOS 8 架站教學彙整 - BrilliantCode.net