Apache提供併發連線請求數量
1. 瞭解Apache採用的MPM(Multi-Processing Modules,多道處理模組)
MPM是Apache的核心,它的作用是管理網路連線、排程請求。
Apache2.0中MPM分為3種(perfork、worker、event)。
perfork從Apache1.3中繼承下來的,它採用的是程式管理模式,所以它可以提供更可靠的效能和更好的相容性;
worker是Apache2.0中新增加的方式,它採用了執行緒控制方法,可以比perfork更節約系統開銷、處理更多的資料量,但同時相容性並不是很好,很多舊的程式無法工作在worker下;
event仍處於試驗階段,它為每個任務分配不同的程式池,目前不應該採用。
通過命令httpd –l 可以獲取目前Apache採用的是哪種MPM
httpd -l
httpd -V
2.瞭解perfork的工作方式
檢視配置檔案httpd-mpm.conf,可以看到perfork的配置端,大致如下:
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 250
MaxConnectionsPerChild 0
</IfModule>
當Apache被啟動時,Apache會自動建立StartServers個程式,並且盡力將空閒程式數保持在MinSpareServers和MaxSpareServers之間。
如果空閒程式小於MinSpareServers,Apache將會以大約每秒1個的速度新建程式。
如果空閒程式小於MaxSpareServers,Apache將會刪除額空閒程式,釋放伺服器資源。
程式數的最大值由MaxClient控制,在Apache1.3中最大隻能設定為256,但在Apache2.0中,可以通過在配置開頭增加ServerLimit專案來突破256的限制,此時必須MaxClients<=ServerLimit<=20000
MaxRequestsPerChild用來控制每個程式在處理了多少次請求之後自動銷燬,這個引數可以設定為0表示無限(即不銷燬程式)
3. 優化perfork
對於一個負載相對較高的網站來說,256的程式限制是不夠的,如果伺服器已經達到256的極限,那麼接下來的訪問就需要排隊,這也就是為什麼某些伺服器負載不高,但是訪問卻很慢的原因之一。所以首先應該瞭解伺服器在繁忙時的程式數量。
通過設定ServerLimit和MaxClients來達到為伺服器軟擴容的目的。
然後,在訪問量高峰期,經常會出現的情況是突然之間發生非常多的併發連線,然後突然之間減少了很多訪問。如果Apache沒有準備足夠數量的預備程式,那訪問只能等待Apache每秒1個的新增程式,隨後又要將多餘的程式刪除,那Apache只能一直忙於新建和銷燬程式,大大地降低了訪問速度。可以適當增加StartServers、MinSpareServers、MaxSpareServers來使得Apache不需要一直忙於做無用功。
最後強烈推薦MaxRequestsPerChild不要設定為0,設定為非0,可以保護Apache程式免遭記憶體洩漏的影響,因為你不知道執行在Apache上的應用程式在什麼時候回出錯導致記憶體洩漏。
設定完之後大致是這樣的:
<IfModule mpm_prefork_module>
StartServers 1000
MinSpareServers 30
MaxSpareServers 30
MaxRequestWorkers 1000
MaxConnectionsPerChild 4000
</IfModule>
1. httpd-mpm.conf配置
Apache的執行緒數控制檔案為httpd-mpm.conf,在conf/extra資料夾下面,要是該配置檔案其作用需要在httpd.conf中將#Include conf/extra/httpd-mpm.conf前#去掉,以便httpd-mpm.conf生效。
在windows系統中,其作用的是Winnt mpm段<IfModule mpm_winnt_module>
ThreadsPerChild 150
MaxConnectionsPerChild 0
</IfModule>
windows下如果優化Apache的效能主要是通過專門針對WindowsNT優化的MPM(多路處理模組)-mpm_winnt.c來優化的,它使用一個單獨的父程式產生一個單獨的子程式,在這個子程式中輪流產生多個執行緒來處理請求。也就是說mpm_winnt只能啟動父子兩個程式,不能像Linux下那樣同時啟動多個程式。
mpm_winnt主要通過ThreadsPerChild和MaxRequestsPerChild兩個引數來優化Apache.
ThreadsPerChild
這個引數用於設定每個程式的執行緒數,子程式在啟動時建立這些執行緒後就不再建立新的執行緒了。一方面因為mpm_winnt不能啟動多個程式,所以這個數值要足夠大,以便可以處理可能的請求高峰;另一方面該引數以伺服器的響應速度為準的,數目太大的反而會變慢。因此需要綜合均衡一個合理的數值。mpm_winnt上的預設值是64,最大值是1920.這裡建議設定為100-500之間,伺服器效能高的話值大一些,反之值小一些。
MaxRequestsPerChild
該參數列示每個子程式能夠處理的最大請求數,即同時間內子程式數目。設定為零表示不限制,mpm_winnt上的預設值就是0.
官方參考手冊中不建議設定為0,主要基於兩點考慮:
(1) 可以防止(偶然的)記憶體洩漏無限進行,從而耗盡記憶體;
(2) 給程式一個有限壽命,從而有助於當伺服器負載減輕的時候減少活動程式的數量。
因此這個引數的值更大程度上取決於伺服器的記憶體,如果記憶體比較大的話可以設定為0或很大的數字,否則設定一個小的數值。需要說明的是,如果這個值設定的太小的話會造成Apache頻繁重啟,在日誌檔案中會看到如下的文字:Process exiting because it reached MaxRequestsPerChild. Signalingthe parent, 這樣一來降低了Apache的總體效能。
1. 瞭解Apache採用的MPM(Multi-Processing Modules,多道處理模組)
MPM是Apache的核心,它的作用是管理網路連線、排程請求。
Apache2.0中MPM分為3種(perfork、worker、event)。
perfork從Apache1.3中繼承下來的,它採用的是程式管理模式,所以它可以提供更可靠的效能和更好的相容性;
worker是Apache2.0中新增加的方式,它採用了執行緒控制方法,可以比perfork更節約系統開銷、處理更多的資料量,但同時相容性並不是很好,很多舊的程式無法工作在worker下;
event仍處於試驗階段,它為每個任務分配不同的程式池,目前不應該採用。
通過命令httpd –l 可以獲取目前Apache採用的是哪種MPM
httpd -l
httpd -V
2.瞭解perfork的工作方式
檢視配置檔案httpd-mpm.conf,可以看到perfork的配置端,大致如下:
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 250
MaxConnectionsPerChild 0
</IfModule>
當Apache被啟動時,Apache會自動建立StartServers個程式,並且盡力將空閒程式數保持在MinSpareServers和MaxSpareServers之間。
如果空閒程式小於MinSpareServers,Apache將會以大約每秒1個的速度新建程式。
如果空閒程式小於MaxSpareServers,Apache將會刪除額空閒程式,釋放伺服器資源。
程式數的最大值由MaxClient控制,在Apache1.3中最大隻能設定為256,但在Apache2.0中,可以通過在配置開頭增加ServerLimit專案來突破256的限制,此時必須MaxClients<=ServerLimit<=20000
MaxRequestsPerChild用來控制每個程式在處理了多少次請求之後自動銷燬,這個引數可以設定為0表示無限(即不銷燬程式)
3. 優化perfork
對於一個負載相對較高的網站來說,256的程式限制是不夠的,如果伺服器已經達到256的極限,那麼接下來的訪問就需要排隊,這也就是為什麼某些伺服器負載不高,但是訪問卻很慢的原因之一。所以首先應該瞭解伺服器在繁忙時的程式數量。
通過設定ServerLimit和MaxClients來達到為伺服器軟擴容的目的。
然後,在訪問量高峰期,經常會出現的情況是突然之間發生非常多的併發連線,然後突然之間減少了很多訪問。如果Apache沒有準備足夠數量的預備程式,那訪問只能等待Apache每秒1個的新增程式,隨後又要將多餘的程式刪除,那Apache只能一直忙於新建和銷燬程式,大大地降低了訪問速度。可以適當增加StartServers、MinSpareServers、MaxSpareServers來使得Apache不需要一直忙於做無用功。
最後強烈推薦MaxRequestsPerChild不要設定為0,設定為非0,可以保護Apache程式免遭記憶體洩漏的影響,因為你不知道執行在Apache上的應用程式在什麼時候回出錯導致記憶體洩漏。
設定完之後大致是這樣的:
<IfModule mpm_prefork_module>
StartServers 1000
MinSpareServers 30
MaxSpareServers 30
MaxRequestWorkers 1000
MaxConnectionsPerChild 4000
</IfModule>
1. httpd-mpm.conf配置
Apache的執行緒數控制檔案為httpd-mpm.conf,在conf/extra資料夾下面,要是該配置檔案其作用需要在httpd.conf中將#Include conf/extra/httpd-mpm.conf前#去掉,以便httpd-mpm.conf生效。
在windows系統中,其作用的是Winnt mpm段<IfModule mpm_winnt_module>
ThreadsPerChild 150
MaxConnectionsPerChild 0
</IfModule>
windows下如果優化Apache的效能主要是通過專門針對WindowsNT優化的MPM(多路處理模組)-mpm_winnt.c來優化的,它使用一個單獨的父程式產生一個單獨的子程式,在這個子程式中輪流產生多個執行緒來處理請求。也就是說mpm_winnt只能啟動父子兩個程式,不能像Linux下那樣同時啟動多個程式。
mpm_winnt主要通過ThreadsPerChild和MaxRequestsPerChild兩個引數來優化Apache.
ThreadsPerChild
這個引數用於設定每個程式的執行緒數,子程式在啟動時建立這些執行緒後就不再建立新的執行緒了。一方面因為mpm_winnt不能啟動多個程式,所以這個數值要足夠大,以便可以處理可能的請求高峰;另一方面該引數以伺服器的響應速度為準的,數目太大的反而會變慢。因此需要綜合均衡一個合理的數值。mpm_winnt上的預設值是64,最大值是1920.這裡建議設定為100-500之間,伺服器效能高的話值大一些,反之值小一些。
MaxRequestsPerChild
該參數列示每個子程式能夠處理的最大請求數,即同時間內子程式數目。設定為零表示不限制,mpm_winnt上的預設值就是0.
官方參考手冊中不建議設定為0,主要基於兩點考慮:
(1) 可以防止(偶然的)記憶體洩漏無限進行,從而耗盡記憶體;
(2) 給程式一個有限壽命,從而有助於當伺服器負載減輕的時候減少活動程式的數量。
因此這個引數的值更大程度上取決於伺服器的記憶體,如果記憶體比較大的話可以設定為0或很大的數字,否則設定一個小的數值。需要說明的是,如果這個值設定的太小的話會造成Apache頻繁重啟,在日誌檔案中會看到如下的文字:Process exiting because it reached MaxRequestsPerChild. Signalingthe parent, 這樣一來降低了Apache的總體效能。
相關文章
- nginx如何限制併發連線請求數?Nginx
- Apache Tomcat如何高併發處理請求ApacheTomcat
- 控制請求併發數量:p-limit 原始碼解讀MIT原始碼
- 說說你對請求數和併發數的理解
- 對於瀏覽器請求介面限制,是否有必要開發一套請求工作管理員元件,自主的去控制請求的併發,保證在瀏覽器允許的最大併發連線數限制之中,避免請求阻塞和資源搶佔。瀏覽器元件
- Linux apache怎麼限制併發連線和下載速度LinuxApache
- 詳解IIS最大併發連線數
- Linux檢視埠併發連線數Linux
- 詳解nginx的請求限制(連線限制和請求限制)Nginx
- python併發執行request請求Python
- linux如何處理多連線請求?Linux
- 求字串連續字元數量字串字元
- 提交一個併發請求(Concurrent Program)
- Singleflight(合併請求)
- 併發請求的重複插入問題
- php curl 連線 EMQ http_api的請求PHPMQHTTPAPI
- 請求合併與拆分在併發場景中應用
- Web函式請求多併發上線,Web服務部署更快更省!Web函式
- 有趣的請求引數/請求頭
- 學習tomcat-如何建立連線,處理請求Tomcat
- 檢視mysql資料庫連線數、併發數相關資訊MySql資料庫
- 合併HTTP請求vs並行HTTP請求,到底誰更快?HTTP並行
- 合併HTTP請求 vs 並行HTTP請求,到底誰更快?HTTP並行
- 併發、多執行緒、HTTP連線數有何關係?執行緒HTTP
- IIS連線數、併發連線數、最大併發工作執行緒數、應用程式池的佇列長度、應用程式池的最大工作程式數詳解執行緒佇列
- mysql關於最大連線數、最大併發執行緒數的區別MySql執行緒
- 微信小程式解除 10 個請求併發限制了?!微信小程式
- 使用jMeter構造大量併發的隨機HTTP請求JMeter隨機HTTP
- 23行程式碼實現一個帶併發數限制的fetch請求函式行程函式
- 位元組跳動面試官:請用JS實現Ajax併發請求控制面試JS
- Apache 記錄請求響應時間日誌Apache
- ajax中POST請求與引數(請求體)設定
- Postman傳送請求引數是Map格式的請求Postman
- Blazor Server 發起HttpPost請求,但是多引數BlazorServerHTTP
- Springboot請求引數解密Spring Boot解密
- SpringMVC請求引數解析SpringMVC
- 併發工具類(三)控制併發執行緒的數量 Semphore執行緒
- mock 請求分發Mock
- Tomcat如何使用執行緒池處理遠端併發請求Tomcat執行緒