日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

apache的prefork和workder模式

發布時間:2025/4/5 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 apache的prefork和workder模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

如何知道當前apache的應用模式

httpd -l ? 或者apache -l ? ?
如果有 prefork.c 那就是 prefork 方式,如果是 worker.c 那就是 work 模式還有一種模式event。

enent 模式只是適用于httpd 版本2.4.xxx,而2.2.xxx版本只是測試用,下面主要是討論前兩種模式。
# httpd -l
Compiled in modules:

core.c

prefork.c

http_core.c

mod_so.c

----------------------------------------------

<IfModule prefork.c>
StartServers ? ? ? 8
MinSpareServers ? ?5
MaxSpareServers ? 20
ServerLimit ? ? ?256
MaxClients ? ? ? 256
MaxRequestsPerChild ?4000
</IfModule>


[root@localhost ~]# ps auxf | grep httpd |wc -l
20

[root@localhost ~]# ps auxf | grep httpd
apache ? ?3856 ?0.2 ?3.8 ?58052 39336 ? ? ? ? ?S ? ?00:12 ? 2:25 ?\_ /usr/sbin/httpd
apache ? 20952 ?0.2 ?3.8 ?57992 39280 ? ? ? ? ?S ? ?04:04 ? 1:52 ?\_ /usr/sbin/httpd
apache ? 22231 ?0.2 ?3.8 ?57988 39200 ? ? ? ? ?S ? ?04:12 ? 1:57 ?\_ /usr/sbin/httpd
apache ? 22237 ?0.2 ?3.8 ?57960 39300 ? ? ? ? ?S ? ?04:12 ? 1:52 ?\_ /usr/sbin/httpd
apache ? 29719 ?0.2 ?3.8 ?57980 39020 ? ? ? ? ?S ? ?05:08 ? 1:47 ?\_ /usr/sbin/httpd
apache ? 29757 ?0.2 ?3.8 ?58292 39428 ? ? ? ? ?S ? ?05:09 ? 1:42 ?\_ /usr/sbin/httpd
apache ? 29816 ?0.2 ?2.3 ?43024 24228 ? ? ? ? ?S ? ?05:09 ? 1:41 ?\_ /usr/sbin/httpd
apache ? 25362 ?0.2 ?1.7 ?37184 18408 ? ? ? ? ?S ? ?11:45 ? 0:58 ?\_ /usr/sbin/httpd
apache ? 30748 ?0.2 ?1.5 ?34404 15600 ? ? ? ? ?S ? ?12:22 ? 0:42 ?\_ /usr/sbin/httpd
apache ? ?5892 ?0.2 ?1.3 ?32980 13840 ? ? ? ? ?S ? ?12:57 ? 0:35 ?\_ /usr/sbin/httpd
apache ? ?6198 ?0.2 ?1.4 ?33408 14408 ? ? ? ? ?S ? ?12:57 ? 0:35 ?\_ /usr/sbin/httpd
apache ? ?6219 ?0.2 ?1.4 ?34160 14948 ? ? ? ? ?S ? ?12:57 ? 0:38 ?\_ /usr/sbin/httpd
apache ? ?7211 ?0.2 ?1.3 ?32772 13804 ? ? ? ? ?S ? ?13:00 ? 0:33 ?\_ /usr/sbin/httpd
apache ? ?7727 ?0.2 ?1.3 ?33072 14036 ? ? ? ? ?S ? ?13:02 ? 0:35 ?\_ /usr/sbin/httpd
apache ? 19977 ?0.2 ?1.3 ?33240 14104 ? ? ? ? ?S ? ?14:26 ? 0:23 ?\_ /usr/sbin/httpd
apache ? 13485 ?0.2 ?1.3 ?33232 13788 ? ? ? ? ?S ? ?16:16 ? 0:10 ?\_ /usr/sbin/httpd
apache ? 13712 ?0.2 ?1.3 ?33044 13584 ? ? ? ? ?S ? ?16:18 ? 0:09 ?\_ /usr/sbin/httpd
apache ? 14653 ?0.2 ?1.3 ?32660 13620 ? ? ? ? ?S ? ?16:22 ? 0:08 ?\_ /usr/sbin/httpd
apache ? 21534 ?0.1 ?1.3 ?32656 13508 ? ? ? ? ?S ? ?17:06 ? 0:02 ?\_ /usr/sbin/httpd
apache ? 22834 ?0.1 ?1.2 ?32712 13260 ? ? ? ? ?S ? ?17:19 ? 0:00 ?\_ /usr/sbin/httpd


如果你的系統內存不是很充足或者運行有其他的服務,把MaxSpareServers設置小一些可以為
其他服務空出一些內存

---------------------------------------------關于Apache的prefork和worker工作模式

prefork模式
這個多路處理模塊(MPM)實現了一個非線程型的、預派生的web服務器,它的工作方式類似于Apache 1.3。它適合于沒有線程安全庫,需要避免線程兼容性問題的系統。它是要求將每個請求相互獨立的情況下最好的MPM,這樣若一個請求出現問題就不會影響到其他請求。

這個MPM具有很強的自我調節能力,只需要很少的配置指令調整。最重要的是將MaxClients設置為一個足夠大的數值以處理潛在的請求高峰,同時又不能太大,以致需要使用的內存超出物理內存的大小。

worker模式
此多路處理模塊(MPM)使網絡服務器支持混合的多線程多進程。由于使用線程來處理請求,所以可以處理海量請求,而系統資源的開銷小于基于進程的MPM。但是,它也使用了多進程,每個進程又有多個線程,以獲得基于進程的MPM的穩定性。

控制這個MPM的最重要的指令是,控制每個子進程允許建立的線程數的ThreadsPerChild指令,和控制允許建立的總線程數的MaxClients指令。

rpm -ql httpd |grep bin 查看下所在目錄

/usr/sbin/httpd

/usr/sbin/httpd.event

/usr/sbin/httpd.worker


prefork和worker模式的切換
1.將當前的prefork模式啟動文件改名
mv httpd httpd.prefork
2.將worker模式的啟動文件改名
mv httpd.worker httpd
3.修改Apache配置文件
vi /usr/local/apache2/conf/extra/httpd-mpm.conf
找到里邊的如下一段,可適當修改負載等參數:
<IfModule mpm_worker_module>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
4.重新啟動服務
service httpd restart
即可換成worker方式啟動httpd

處于穩定性和安全性考慮,不建議更換httpd的運行方式,使用系統默認prefork即可。另外很多php模塊不能工作在worker模式下,例如redhat linux自帶的php也不能支持線程安全。所以最好不要切換工作模式。

prefork和worker模式的比較
prefork模式使用多個子進程,每個子進程只有一個線程。每個進程在某個確定的時間只能維持一個連接。在大多數平臺上,Prefork MPM在效率上要比Worker MPM要高,但是內存使用大得多。prefork的無線程設計在某些情況下將比worker更有優勢:它可以使用那些沒有處理好線程安全的第三方模塊,并 且對于那些線程調試困難的平臺而言,它也更容易調試一些。

worker模式使用多個子進程,每個子進程有多個線程。每個線程在某個確定的時間只能維持一個連接。通常來說,在一個高流量的HTTP服務器 上,Worker MPM是個比較好的選擇,因為Worker MPM的內存使用比Prefork MPM要低得多。但worker MPM也由不完善的地方,如果一個線程崩潰,整個進程就會連同其所有線程一起”死掉”.由于線程共享內存空間,所以一個程序在運行時必須被系統識別為”每 個線程都是安全的”。

總的來說,prefork方式速度要稍高于worker,然而它需要的cpu和memory資源也稍多于woker。



prefork模式配置詳解
<IfModule mpm_prefork_module>
ServerLimit 256 ?
StartServers 5 ?
指定服務器啟動時建立的子進程數量,prefork默認為5。
MinSpareServers 5
MaxSpareServers 10
MaxClients 256 ?
限定同一時間客戶端最大接入請求的數量(單個進程并發線程數),默認為256 。任何超過MaxClients限制的請求都將進入等候隊列,一旦一個鏈接被釋放,隊列中的請求將得到服務。要增大這個值,你必須同時增大ServerLimit。
MaxRequestsPerChild 0
</IfModule>
ServerLimit

StartServers:默認的MaxClient最大是256個線程,如果想設置更大的值,就的加上ServerLimit這個參數。20000是ServerLimit這個參數的最大值。如果需要更大,則必須編譯apache,此前都是不需要重新編譯Apache。生效前提:ServerLimit必須放在其他指令的前面

MinSpareServers:指定空閑子進程的最小數量,默認為5。 如果當前空閑子進程數少于MinSpareServers ,那么Apache將以最大每秒一個的速度產生新的子進程。此參數不要設的太大。

MaxSpareServers:設置空閑子進程的最大數量,默認為10。如果當前有超過MaxSpareServers數量的空閑子進程,那么父進程將殺死多余的子進程。此參數不要設的 太大。如果你將該指令的值設置為比MinSpareServers小,Apache將會自動將其修改成”MinSpareServers+1″。

MaxRequestsPerChild
每個子進程在其生存期內允許伺服的最大請求數量,默認為10000.到達MaxRequestsPerChild的限制后,子進程將會結束。如果 MaxRequestsPerChild為”0″,子進程將永遠不會結束。將MaxRequestsPerChild設置成非零值有兩個好處:
1.可以防止(偶然的)內存泄漏無限進行,從而耗盡內存。
2.給進程一個有限壽命,從而有助于當服務器負載減輕的時候減少活動進程的數量。




<IfModule mpm_prefork_module>
? ?ServerLimit ? ? ? ? ? 2000
? ?StartServers ? ? ? ? ?10
? ?MinSpareServers ? ? ? 10
? ?MaxSpareServers ? ? ?15
? ?MaxClients ? ? ? ? ?1500
? ?MaxRequestsPerChild ? 10000
</IfModule>









worker模式配置詳解
<IfModule mpm_worker_module>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>

StartServers
服務器啟動時建立的子進程數,默認值是”3″。

MaxClients
允許同時伺服的最大接入請求數量(最大線程數量)。任何超過MaxClients限制的請求都將進入等候隊列。默認值是”400″ ,16(ServerLimit)乘以25(ThreadsPerChild)的結果。因此要增加MaxClients的時候,你必須同時增加 ServerLimit的值。

MinSpareThreads
最小空閑線程數,默認值是”75″。這個MPM將基于整個服務器監視空閑線程數。如果服務器中總的空閑線程數太少,子進程將產生新的空閑線程。

MaxSpareThreads
設置最大空閑線程數。默認值是”250″。這個MPM將基于整個服務器監視空閑線程數。如果服務器中總的空閑線程數太多,子進程將殺死多余的空閑線程。 MaxSpareThreads的取值范圍是有限制的。Apache將按照如下限制自動修正你設置的值:worker要求其大于等于 MinSpareThreads加上ThreadsPerChild的和。

ThreadsPerChild
每個子進程建立的常駐的執行線程數。默認值是25。子進程在啟動時建立這些線程后就不再建立新的線程了。

MaxRequestsPerChild
設置每個子進程在其生存期內允許伺服的最大請求數量。到達MaxRequestsPerChild的限制后,子進程將會結束。如果MaxRequestsPerChild為”0″,子進程將永遠不會結束。將MaxRequestsPerChild設置成非零值有兩個好處:
1.可以防止(偶然的)內存泄漏無限進行,從而耗盡內存。
2.給進程一個有限壽命,從而有助于當服務器負載減輕的時候減少活動進程的數量。
注意對于KeepAlive鏈接,只有第一個請求會被計數。事實上,它改變了每個子進程限制最大鏈接數量的行為。




-------------------------------------------apache的prefork和workder模式的性能

選擇prefork還是worker可以在編譯時使用–with-mpm=MPM參數指定,默認為prefork,prefork采用預派生子進程方式,用單獨的子進程來處理 不同的請求,進程之間彼此獨立。在make編譯和make

install安裝后,使用httpd -l來確定當前使用的MPM是prefork.c。查看httpd-mpm.conf配置文件,里面包含如下默認的配置段:
<IfModule prefork.c>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
IXDBA.NET技術社區
</IfModule>
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。
<IfModule prefork.c>
ServerLimit ?10000
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 10000
MaxRequestsPerChild 0
</IfModule>

Worker

相對于prefork,worker全新的支持多線程和多進程混合模型的MPM。由于使用線程來處理,所以可以處理相對海量的請求,而系統資源的開銷要小于基于進程的服務器。但是,worker也使用了多進程,

每個進程又生成多個線程,以獲得基于進程服務器的穩定性。在configure –with-mpm=worker后,進行make編譯、make install安裝。在缺省生成的httpd-mpm.conf中有以下默認配置段:

<IfModule worker.c>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>

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將會自動調節到一個相應值。
<IfModule worker.c>
ServerLimit 25
ThreadLimit 200
StartServers 3
MaxClients 2000
MinSpareThreads 50
MaxSpareThreads 200
ThreadsPerChild 100
MaxRequestsPerChild 0
</IfModule>

下面是利用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的應用模式

httpd -l ?如果有prefork.c 那就是prefork方式,如果是worker.c那就是work模式。
忙的原因需要你對你網站進行行為分析。一般是分析日志。然后再根據實際情況做判斷。

? 我曾經給個朋友做過優化。當時他的機器每到晚上LOAD基本都是幾十。慢的很。我對日志進行了分析。發現有很多爬蟲在訪問動態的頁面同時有很多IP在惡意的盜取圖片數據等。導致大量的資源被消

耗掉。最后我采取了適當措施。現在LOAD基本都在1以下。所以分析訪問行為是很重要的盲目的調整APACHE的連接參數意義真的是不大。希望我的話能夠修正大家的一些不正確的想法。


轉載于:https://blog.51cto.com/oybw88/1366329

總結

以上是生活随笔為你收集整理的apache的prefork和workder模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。