Apache目前一共有三種穩定的MPM(Multi-Processing Module,多進程處理模式 簡稱: MPM) 它們分別是prefork,worker和event,它們同時也代表這Apache的演變和發展。在編譯Apache時必須選擇其中一個MPM,MPM會影響到Apache的速度和可伸縮性。[1]
apache2.0默認prefork, 2.2默認為worker, 2.4版本是event。
此篇著重於worker模式的設定,其運作優缺點在[1]中有詳細說明:
查看 mpm
$ httpd -V
Server version: Apache/2.4.37 (centos)
Server built: Nov 12 2021 04:57:27
Server's Module Magic Number: 20120211:83
Server loaded: APR 1.6.3, APR-UTIL 1.6.1
Compiled using: APR 1.6.3, APR-UTIL 1.6.1
Architecture: 64-bit
Server MPM: worker
threaded: yes (fixed thread count)
forked: yes (variable process count)
Server compiled with....
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
... 中略 ...
-D AP_TYPES_CONFIG_FILE="conf/mime.types"
-D SERVER_CONFIG_FILE="conf/httpd.conf"
Worker 調整參數
參數的調整主要參考[2]的詳細說明,基本上簡單整理下:
- 最大子行程數ServerLimit=100 x 每子行程執行緒數ThreadsPerChild=250 = 最大執行緒數=25000
- 開始的子行程數StartServers =50
- 最小閒置執行緒數MinSpareThreads=50<=閒置執行緒數<=最大閒置執行緒數MaxSpareThreads=250
- 子行程生命週其最大連線數=0,即不限制
# vim /etc/httpd/conf.modules.d/00-mpm.conf
LoadModule mpm_worker_module modules/mod_mpm_worker.so
KeepAlive Off
<IfModule worker.c>
ServerLimit 100
StartServers 50
ThreadsPerChild 250
MinSpareThreads 50
MaxSpareThreads 250
MaxConnectionsPerChild 0
</IfModule>
測試效能
使用ab去壓測,測試10000個連線
$ ab -s 30 -n 10000 http://192.168.0.1/
調整前後測試數據
兩張對比圖分別是左調整前和右調整後的跑分,單位是ms數字越小越好。
右圖調整參數為上面的參數,大幅改善第100%的處理能力,由約1.6s減少為0.1s。
測試的網頁為單純的靜態網頁,沒有資料庫或其它程式的影響,因此比較能排除其它效能瓶頸導致的問題。
參考資料
[1] 阿輝的零碎筆記 https://dotblogs.com.tw/grayyin/2020/03/15/115350
[3] https://www.brilliantcode.net/2135/apache-advance-settings-keepalive/