Centos

如何配置 Apache “workers”以獲得最大並發性

  • May 10, 2016

希望這是一個好問題,對處於類似情況的任何人都有用。我最近接手了我公司一位非常資深的 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 個主要問題:

  1. 有三個選項,prefork、mpm_worker 和 mpm_event。儘管我對它們的用途有一個大致的了解,但我並不真正了解如何配置它們。

  2. 與之前伺服器中的 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 都有設置,但我找不到要使用的實際規範。

  1. 稍作調整後,我可以根據需要使用 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。

  • 設置所需的配置值

許多模組的配置指令在未指定時具有預設值。 StartServersusingworker將預設為 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提供幫助。

引用自:https://serverfault.com/questions/775855