Apache Prefork和Worker模式的效能比較測試
Apache Prefork和Worker模式的效能比較測試
[@more@]
選擇prefork還是worker可以在編譯時使用–with-mpm=MPM引數指定,預設為prefork,
prefork
prefork
採用預派生子程式方式,用單獨的子程式來處理 不同的請求,程式之間彼此獨立。在make編譯和make install安裝後,使用httpd
-l來確定當前使用的MPM是prefork.c。檢視httpd-mpm.conf配置檔案,裡面包含如下預設的配置段:
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
prefork
控制程式在最初建立“StartServers”個子程式後,為了滿足MinSpareServers設定的需要建立一個程式,等待一秒鐘,繼續建立兩
個,再等待一秒鐘,繼續建立四個……如此按指數級增加建立的程式數,最多達到每秒32個,直到滿足MinSpareServers設定的值為止。這種模式
可以不必在請求到來時再產生新的程式,從而減小了系統開銷以增加效能。MaxSpareServers設定了最大的空閒程式數,如果空閒程式數大於這個
值,Apache會自動kill掉一些多餘程式。這個值不要設得過大,但如果設的值比MinSpareServers小,Apache會自動把其調整為
MinSpareServers+1。如果站點負載較大,可考慮同時加大MinSpareServers和MaxSpareServers。
MaxRequestsPerChild設定的是每個子程式可處理的請求數。每個子程式在處理了“MaxRequestsPerChild”個請求後將自
動銷燬。0意味著無限,即子程式永不銷燬。雖然預設設為0可以使每個子程式處理更多的請求,但如果設成非零值也有兩點重要的好處:1、可防止意外的記憶體洩
漏。2、在伺服器負載下降的時侯會自動減少子程式數。因此,可根據伺服器的負載來調整這個值。MaxClients是這些指令中最為重要的一個,設定的是
Apache可以同時處理的請求,是對Apache效能影響最大的引數。其預設值150是遠遠不夠的,如果請求總數已達到這個值(可透過ps
-ef|grep http|wc
-l來確認),那麼後面的請求就要排隊,直到某個已處理請求完畢。這就是系統資源還剩下很多而HTTP訪問卻很慢的主要原因。雖然理論上這個值越大,可以
處理的請求就越多,但Apache預設的限制不能大於256。ServerLimit指令無須重編譯Apache就可以加大MaxClients。
ServerLimit 10000
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 10000
MaxRequestsPerChild 0
Worker
相
對於prefork,worker全新的支援多執行緒和多程式混合模型的MPM。由於使用執行緒來處理,所以可以處理相對海量的請求,而系統資源的開銷要小於
基於程式的伺服器。但是,worker也使用了多程式,每個程式又生成多個執行緒,以獲得基於程式伺服器的穩定性。在configure
–with-mpm=worker後,進行make編譯、make install安裝。在預設生成的httpd-mpm.conf中有以下預設配置段:
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
Worker
由主控制程式生成“StartServers”個子程式,每個子程式中包含固定的ThreadsPerChild執行緒數,各個執行緒獨立地處理請求。同樣,
為了不在請求到來時再生成執行緒,MinSpareThreads和MaxSpareThreads設定了最少和最多的空閒執行緒數;而MaxClients
設定了同時連入的clients最大總數。如果現有子程式中的執行緒總數不能滿足負載,控制程式將派生新的子程式。MinSpareThreads和
MaxSpareThreads的最大預設值分別是75和250。這兩個引數對Apache的效能影響並不大,可以按照實際情況相應調節。
ThreadsPerChild是worker
MPM中與效能相關最密切的指令。ThreadsPerChild的最大預設值是64,如果負載較大,64也是不夠的。這時要顯式使用
ThreadLimit指令,它的最大預設值是20000。Worker模式下所能同時處理的請求總數是由子程式總數乘以ThreadsPerChild
值決定的,應該大於等於MaxClients。如果負載很大,現有的子程式數不能滿足時,控制程式會派生新的子程式。預設最大的子程式總數是16,加大時
也需要顯式宣告ServerLimit(最大值是20000)。需要注意的是,如果顯式宣告瞭ServerLimit,那麼它乘以
ThreadsPerChild的值必須大於等於MaxClients,而且MaxClients必須是ThreadsPerChild的整數倍,否則
Apache將會自動調節到一個相應值。
ServerLimit 25
ThreadLimit 200
StartServers 3
MaxClients 2000
MinSpareThreads 50
MaxSpareThreads 200
ThreadsPerChild 100
MaxRequestsPerChild 0
下面是利用Apache自帶的測試工具ab對Server進行測試的情況(設定請求的index頁面為6bytes),cpu%為cpu佔用率,mem為記憶體使用量(M為單位),RequestsPerSecond為每秒處理的請求數。
1、Prefor方式
(ServerLimit,StartServer,MinSpareServers,MaxSpareServers,MaxClients,MaxRequestPerChild)
-n/-c(ab引數) Cpu% Mem Requestspersecond
(-,5,5,10,150,0)
100000/100 28.8 285 8434
100000/200 29.2 304 8032
100000/500 25.3 323 7348
100000/1000 24.4 330 5886
(10000,5,5,10,500,0)
100000/100 28.7 371 8345
100000/200 27.4 389 7929
100000/500 24.9 417 7229
100000/1000 23.4 437 6676
(10000,5,5,10,1000,0)
100000/100 28.8 408 8517
100000/200 27.0 422 8045
100000/500 24.2 455 7236
100000/1000 22.5 470 6570
(10000,5,5,10,1500,0)
100000/100 29.6 330 8407
100000/200 28.1 349 8014
100000/500 26.4 380 7290
100000/1000 24.0 400 6686
2、Worker方式
(ServerLimt,Threadlimt,Startservers,MaxClients,MinspareThread,MaxspareThread,ThreadperChild,MaxRequestPerChild)
-n/-c(ab引數) cpu% mem RequestsperSecond
(50,500,5,10000,50,200,200,0)
100000/100 18.6 188 6020
100000/200 20.1 195 5892
100000/500 19.8 209 5708
100000/1000 22.2 218 6081
(100,500,5,10000,50,200,100,0)
100000/100 24.5 240 6919
100000/200 23.6 247 6798
100000/500 24.6 254 6827
100000/1000 22.3 271 6114
(200,500,5,10000,50,200,50,0)
100000/100 27.3 301 7781
100000/200 27.4 307 7789
100000/500 26.0 320 7141
100000/1000 21.8 344 6110
相對來說,prefork方式速度要稍高於worker,然而它需要的cpu和memory資源也稍多於woker。
=-=-=-==-=-=-=-========================================
Apache 2.0中prefork.c模組和worker.c模組 | ||
|
公式:
ThreadLimit >= ThreadsPerChild
MaxClients <= ServerLimit * ThreadsPerChild 必須是ThreadsPerChild的倍數
MaxSpareThreads >= MinSpareThreads+ThreadsPerChild
硬限制:
ServerLimi和ThreadLimit這兩個指令決定了活動子程式數量和每個子程式中執行緒數量的硬限制。要想改變這個硬限制必須完全停止伺服器然後再啟動伺服器(直接重啟是不行的)。
Apache在編譯ServerLimit時內部有一個硬性的限制,你不能超越這個限制。
prefork MPM最大為"ServerLimit 200000"
其它MPM(包括work MPM)最大為"ServerLimit 20000
Apache在編譯ThreadLimit時內部有一個硬性的限制,你不能超越這個限制。
mpm_winnt是"ThreadLimit 15000"
其它MPM(包括work prefork)為"ThreadLimit 20000
注意
使用ServerLimit和ThreadLimit時要特別當心。如果將ServerLimit和ThreadLimit設定成一個高出實際需要許多的值,將會有過多的共享記憶體被分配。當設定成超過系統的處理能力,Apache可能無法啟動,或者系統將變得不穩定。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9697/viewspace-1012471/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Apache 工作的三種模式:Prefork、Worker、EventApache模式
- Apache Pulsar 與 Kafka 效能比較:延遲性(測試方法)ApacheKafka
- Apache與Nginx的優缺點、效能比較,到底選擇哪個比較好?ApacheNginx
- 集合差異比較演算法及效能測試演算法
- Nginx 和 Gunicorn 效能對比測試Nginx
- Apache Sqoop與Apache Flume比較ApacheOOP
- 簡單比較 Apache Kafka 和 Apache Pulsar要點 - JaroslawApacheKafkaJARROS
- 效能比較
- MySQL 中的 distinct 和 group by 的效能比較MySql
- 堆排序和快速排序效能比較排序
- Python、JavaScript和Rust的Web效能比較 - AlexPythonJavaScriptRustWeb
- 請比較下for、forEach、for of的效能的效能
- 比較Apache Pulsar 和Apache Kafka:統一排隊和流式傳輸 - splunkApacheKafka
- Stream.toList()和Collectors.toList()的效能比較
- Apache與Nginx的優缺點比較ApacheNginx
- Linux基礎命令---ab測試apache效能LinuxApache
- 介面測試和效能測試的區別
- [譯] 原生 iOS(Swift) 和 React-Native 的效能比較iOSSwiftReact
- [譯] JavaScript 單元測試框架:Jasmine, Mocha, AVA, Tape 和 Jest 的比較JavaScript框架ASM
- TDengine 和 InfluxDB 查詢效能對比測試報告UX測試報告
- MVVM與MVC模式的比較MVVMMVC模式
- Jmeter效能測試 —— 壓力模式JMeter模式
- JAVA + LR實現apache流媒體的效能測試JavaApache
- 使用Apache自帶的ab命令測試網站效能Apache網站
- 滲透測試與自動化安全測試工具比較
- Java Bean Copy元件的效能比較JavaBean元件
- js 深比較和淺比較JS
- 資料湖倉比較:Apache Hudi、Delta Lake、Apache IcebergApache
- SAP UI5和React的頁面渲染效能比較UIReact
- python 批量resize效能比較Python
- 服務網格Istio、Linkerd和Cilium效能比較
- 為什麼nginx效能比apache效能好NginxApache
- Go和Python比較的話,哪個比較好?GoPython
- TIM1比較模式模式
- 雲主機的硬碟IO效能比較硬碟
- PostgreSQL、Redis與Memcached的效能比較 - CYBERTECSQLRedis
- 大資料入門課程:Hadoop和spark的效能比較大資料HadoopSpark
- 比較Java與Node.js的併發性和效能- maxantJavaNode.js
- linux tinydrm vs fbtft 效能對比測試Linux