如何配置 Apache “workers”以獲得最大並發性
希望這是一個好問題,對處於類似情況的任何人都有用。我最近接手了我公司一位非常資深的 Linux 管理員,我第一次不得不設置一個新伺服器來為我們的客戶提供我們的內容。我的前任在這件事上留下了有限的文件,因為在他離開時其他事情更為重要。我已經廣泛參考了我擁有的文件,以及以前伺服器的配置和大量線上閱讀來設置所有內容。
我正在建構的伺服器的“堆棧”如下:CentOS 7、Apache 2.4.6、MariaDB 5.X、服務 JSP/Servlet 的 Tomcat 7。以前的生產安裝使用 CentOS 5、舊版本的 Apache 和 MySQL 以及 Tomcat 5.X。
Apache 是前端,它使用 AJP 連接到 Tomcat 後端。大多數流量將是 HTTPS。
該伺服器是,我認為是第 9 代 HP 伺服器,它在 RAID 1 陣列中具有 32GB RAM 和 SSD。讓它開始工作後,我現在關心的是最大化它同時為使用者服務的能力,我預計數百使用者的爆發並不罕見。為此,我試圖在堆棧中的任何一點上防止瓶頸:從 Tomcat 和 MariaDB 開始,並針對這些採取措施,我對此感到滿意。繼續使用 Apache,但我發現更難理解我應該做什麼。
有 3 種不同類型的“工人”,我在優化這些方面有 3 個主要問題:
有三個選項,prefork、mpm_worker 和 mpm_event。儘管我對它們的用途有一個大致的了解,但我並不真正了解如何配置它們。
與之前伺服器中的 Apache 不同,StartServers、ServerLimit、MaxRequestsPerChild 等選項沒有在 /etc/httpd/conf/httpd.conf 中列出。是否有我必須手動覆蓋的預設設置?除了“它們是上次手動添加的”之外,還有什麼其他原因可以在舊的 httpd.conf 中找到設置,但在新的 httpd.conf 中找不到?
我指的是這個,在舊的 httpd.conf 中,我在新配置文件的任何地方都看不到任何類似的東西,只有一個規範:
// prefork MPM
// StartServers:要啟動的伺服器程序
數 // MinSpareServers:保持空閒的最小伺服器程序數
// MaxSpareServers:保持空閒的最大伺服器程序數
// ServerLimit:MaxClients 的最大值伺服器的生命週期
// MaxClients:允許啟動的最大伺服器程序數
// MaxRequestsPerChild:伺服器程序服務的最大請求數
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
// worker MPM
// StartServers:要啟動的伺服器程序的初始數量
// MaxClients:同時客戶端連接的最大數量
// MinSpareThreads:保持空閒的最小工作執行緒數
// MaxSpareThreads:保持空閒的最大工作執行緒數
// ThreadsPerChild : 每個伺服器程序中的固定工作執行緒數
// MaxRequestsPerChild: 一個伺服器程序服務的最大請求數
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
請注意,我將井號替換為 // 以表示 httpd.conf 中的註釋,因為井號導致文本顯示為標題。
與我在新伺服器上遇到的問題相反,我無法確定舊伺服器上正在使用哪個工作程序,prefork 和 mpm_worker 都有設置,但我找不到要使用的實際規範。
- 稍作調整後,我可以根據需要使用 mpm_worker 啟動伺服器(必須先禁用 php.conf 文件),但我不確定控制一切的模組是否是執行緒安全的(用於虛擬主機的模組、openssl、mod_proxy_ajp)。mod_proxy_ajp 是我使用的唯一一個在任何意義上都不尋常的東西。
伺服器尚未投入生產,因此我無法選擇獲取大量目前客戶端的平均記憶體使用情況,以幫助確定最大客戶端的“完美”數量,此外,我不關心獲得完美的數字,只是一個足夠的數字。
如果我想確保大約 400 人在給定時間可以使用伺服器,而沒有人看到 http 500 類型錯誤,我應該為 Apache 使用哪些設置?
在此先感謝,希望這不是太笨拙。
這裡似乎有很多可能的問題,對於“響應”來說有點非結構化。讓我看看我是否可以幫助回答一些問題。
- 確定正在使用哪些多處理模組 (MPM)。
“最簡單”的方法是轉儲任何目前正在執行的模組並選擇
mpm
那些以查看正在執行的模組。這裡有兩種方法:# apachectl -M | grep mpm mpm_worker_module (shared) # httpd -V | grep MPM Server MPM: worker
- 更改正在使用的 MPM
在 CentOS7 上,這現在由一個名為
/etc/httpd/conf.modules.d/00-mpm.conf
. 這是一個短文件,LoadModule
任何時候都只能取消註釋。
LoadModule mpm_worker_module modules/mod_mpm_worker.so
更改後需要重新啟動服務以啟動所需的 MPM。
- 設置所需的配置值
許多模組的配置指令在未指定時具有預設值。
StartServers
usingworker
將預設為 3,當使用prefork
= 5 時。在此處查看更多資訊:https ://httpd.apache.org/docs/current/mod/mpm_common.html#startservers 。我建議創建一個新文件來包含您的覆蓋,而不是編輯現有文件。像
/etc/httpd/conf.modules.d/10-worker.conf
:<IfModule mpm_worker_module> ServerLimit 250 StartServers 10 MinSpareThreads 75 MaxSpareThreads 250 ThreadLimit 64 ThreadsPerChild 32 MaxClients 8000 MaxRequestsPerChild 10000 </IfModule>
與任何事情一樣,調整確切的數字由您來測試您的工作負載和應用程序 - 類似的工具
ab
可以siege
提供幫助。