主流WEB服務(wù)器的多線程和多進程模型的選用

參考

多進程單線程模型;

這類訪問模型, 每一個請求都對應(yīng)開辟一個新的進程, 在進程內(nèi)是單線程的白嘁。
優(yōu)點:
  • 編程相對容易士修;通常不需要考慮鎖和同步資源的問題。
  • 更強的容錯性:比起多線程的一個好處是一個進程崩潰了不會影響其他進程漆枚。
  • 有內(nèi)核保證的隔離:數(shù)據(jù)和錯誤隔離。

對于使用如C/C++這些語言編寫的本地代碼抵知,錯誤隔離是非常有用的:采用多進程架構(gòu)的程序一般可以做到一定程度的自恢復(fù)墙基;(master守護進程監(jiān)控所有worker進程软族,發(fā)現(xiàn)進程掛掉后將其重啟)

缺點:

進程切換開銷大, 密集訪問帶會來的并發(fā)問題。

例子:
  • php-fpm的fast-cgi進程管理模式, 每個線程只能處理一個客戶端連接残制。所以ningx+php-fpm一直被詬病, 靜態(tài)處理可以, 動態(tài)處理不行立砸。
  • nginx主流工作模式是多進程單線程 & 多路IO復(fù)用模型(當然nginx也是支持多線程的方式的,只是我們主流的方式還是多進程的方式)初茶,但是每個線程可以處理多個客戶端的訪問,這也成就了它的并發(fā)性能颗祝。
  • apache的prefork模式
  • 幾乎所有的web server服務(wù)器服務(wù)都有多進程單線程模式。

單進程多線程模型恼布;

這類訪問模型, 服務(wù)器啟動時一個進程, 每個WEB項目是部署一個線程池, 每一個請求針對該項目的請求都對應(yīng)開辟一個新的線程存于線程池, 在線程內(nèi)又可以開辟子線程螺戳。
優(yōu)點:
  • 創(chuàng)建速度快,方便高效的數(shù)據(jù)共享

  • 共享數(shù)據(jù):多線程間可以共享同一虛擬地址空間桥氏;多進程間的數(shù)據(jù)共享就需要用到共享內(nèi)存温峭、信號量等IPC技術(shù);

  • 較輕的上下文切換開銷 - 不用切換地址空間字支,不用更改寄存器凤藏,不用刷新TLB。
    提供非均質(zhì)的服務(wù) , 如果全都是計算任務(wù)堕伪,但每個任務(wù)的耗時不都為1s揖庄,而是1ms-1s之間波動;這樣欠雌,多線程相比多進程的優(yōu)勢就體現(xiàn)出來蹄梢,它能有效降低“簡單任務(wù)被復(fù)雜任務(wù)壓住”的概率;

缺點:

只有一個進程富俄,一旦其中出現(xiàn)一個錯誤禁炒,整個進程都有可能掛掉。你當然可以為ta編寫一個“守護程序”來重啟霍比,但是重啟期間幕袱,你的服務(wù)器是真的“掛掉了”。

例子:

tomcat有三種工作模式, 在NIO模式下啟動一個tomcat就是一個進程, 每個針對項目的訪問都對應(yīng)一個線程,如果閑置線程占用滿了就會開辟新的線程,直到達到設(shè)定的最大線程悠瞬。
tomcat三種線程模型
詳解tomcat的連接數(shù)與線程池


服務(wù)器工作模式就是服務(wù)器在運行時候的內(nèi)存分配们豌,進程和線程的使用方式。

Apache工作模式詳解

Apache有一共有三種穩(wěn)定的MPM(Multi-Processing Module浅妆,多進程處理模塊)模式,其中 最常使用和最新的是prefork工作模式

在linux(centos)下使用#http –l 命令可以查看當前使用的工作模式望迎。也可以使用#apachectl -l命令。

  • http –l
  • apachectl –l
worker工作模式(與php配合不好凌外,或者說暫時用不上)

worker模式由于使用線程來進行處理請求辩尊,所以能夠處理海量請求,而系統(tǒng)資源的開銷要小于基于進程的服務(wù)器趴乡。同時worker模式也使用了多進程对省,每個進程又有著多個線程蝗拿,以獲得基于進程服務(wù)器的穩(wěn)定性晾捏。

event模式

event模式由于把服務(wù)進程從鏈接中分離出來蒿涎,在開啟KeepAlive場合下相對worker模式能夠承受的了更高的負載。event模式為 worker開發(fā)的變種模式惦辛,配置以及指令與worker完全相同劳秋。不過event模式不能很好的支持https的訪問,有時還會出現(xiàn)一系列的問題

prefork工作模式 ---主流

prefork工作模式是linux下apache安裝時候的默認工作模式胖齐,是使用最普遍的工作模式玻淑。為了能夠簡單的明白他的工作原理,下面是一個假設(shè):
有一臺正在運行的apache服務(wù)器呀伙,用戶A訪問該apache的時候apache建立一個新的進程1處理用戶A的請求补履。
這時又有一個用戶B訪問該apache,apache又建立一個新的進程2處理用戶B的請求剿另。
后來又有用戶C箫锤,D,E訪問該apache雨女,apache又建立三個進程3谚攒,4,5處理他們的請求氛堕。

那么如果有5個用戶同時訪問apache馏臭,apache第一次建立的5個進程全部用光了,所以apache就再從新在建立5個進程讼稚,等待下一批用戶的請求括儒。
prefork模式會根據(jù)服務(wù)器的硬件情況,設(shè)定apache最多只能同時建立256個進程锐想。再多的請求就只能等待前面的進程處理完畢在進行處理帮寻。

上面的假設(shè)就是prefork模式的工作原理。但是上面假設(shè)中具體的數(shù)字不是定死的痛倚,而是通過prefork模式的配置來設(shè)置的规婆。
Apache實現(xiàn)多進程模型的原理


服務(wù)器工作模式就是服務(wù)器在運行時候的內(nèi)存分配,進程和線程的使用方式蝉稳。

Nginx工作模式詳解

nginx是一個多進程/多線程高性能web服務(wù)器抒蚜,在linux系統(tǒng)中,nginx啟動后會以后臺守護進程(daemon)的方式去運行耘戚,后臺進程包含一個master進程和多個worker進程(這個數(shù)量可以在nginx.conf配置文件中worker_processes這個參數(shù)設(shè)置)嗡髓。

每個worker里面只有一個主線程,那能夠處理的并發(fā)數(shù)很有限啊收津,多少個worker就能處理多少個并發(fā)饿这,何來高并發(fā)呢浊伙?非也,這就是nginx的高明之處长捧,nginx采用了 異步非阻塞的方式來處理請求嚣鄙,也就是說,nginx是可以同時處理成千上萬個請求的串结。

簡單的說,worker進程的主線程線程可以處理多個客戶端的訪問,這也成就了它的并發(fā)性能哑子。

master主進程主要用來管理worker進程,主要作用是:讀取并驗正配置信息肌割,接收來自客戶端的的請求卧蜓,向各worker進程發(fā)送信號,監(jiān)控worker進程的運行狀態(tài)把敞,當worker進程退出后(異常情況下)弥奸,會自動重新啟動新的worker進程。而用戶的請求則是worker進程來響應(yīng)的奋早。

多個 worker子進程將監(jiān)聽同一個端口盛霎,并行處理請求。

圖片.png

worker 進程數(shù)應(yīng)該設(shè)置為等于 CPU 的核數(shù)伸蚯,高流量并發(fā)場合也可以考慮將進程數(shù)提高至 CPU 核數(shù) * 2刃唐。


nginx與apache的比較

Nginx使用了最新的epoll(Linux 2.6內(nèi)核)和kqueue(freebsd)網(wǎng)絡(luò)I/O模型揩魂,而Apache則使用的是傳統(tǒng)的select模型果覆。

處理大量的連接的讀寫颓芭,Apache所采用的select網(wǎng)絡(luò)I/O模型非常低效。

Apache的優(yōu)點:

1挥萌、rewrite 绰姻,比nginx 的rewrite 強大;
2引瀑、模塊超多狂芋,基本想到的都可以找到;
3憨栽、bug少 帜矾,nginx的bug相對Apache較多;
4屑柔、超穩(wěn)定屡萤,最核心的區(qū)別在于apache是同步多進程模型,一個連接對應(yīng)一個進程掸宛;nginx是異步的死陆,多個連接(萬級別)可以對應(yīng)一個進程。

nginx的優(yōu)點:

1唧瘾、輕量級措译,同樣起web 服務(wù)别凤,比apache 占用更少的內(nèi)存及資源;
2领虹、抗并發(fā)规哪,nginx 處理請求是異步非阻塞的,而apache 則是阻塞型的掠械,在高并發(fā)下nginx 能保持低資源低消耗高性能由缆;
3注祖、高度模塊化的設(shè)計猾蒂,編寫模塊相對簡單;
4是晨、社區(qū)活躍肚菠,各種高性能模塊發(fā)布迅速。

總結(jié)

Nginx 靜態(tài)處理性能比 Apache 高 3倍以上
Apache 對 PHP 支持比較簡單罩缴,Nginx 需要配合其他后端用
Apache 的組件比 Nginx 多
nginx處理動態(tài)請求是雞肋蚊逢,一般動態(tài)請求要apache去做,nginx只適合靜態(tài)和反向箫章。

什么是動態(tài)請求和靜態(tài)請求烙荷?二者的區(qū)別在哪里?

靜態(tài)請求請求后綴html就是靜態(tài)的,直接請求網(wǎng)頁文件資源檬寂。

動態(tài)頁面是以ASP终抽、PHP、JSP桶至、Perl昼伴、或CGI等編程語言制作使用的, 有模板直接渲染前端頁面。動態(tài)頁面又叫動態(tài)鏈接镣屹,英文寫法是:Dynamic URL

我們經(jīng)常會看到,在地址欄里有一些網(wǎng)址特別長圃郊,而且還帶有“?”,這樣的鏈接一般是動態(tài)鏈接,其所對應(yīng)的頁面就是動態(tài)頁面女蜈。

注意, 動態(tài)請求并不代表是訪問后端獲取數(shù)據(jù)接口的請求, 而是由后端直接渲染前端頁面持舆。一般屬于前后端不分離項目的特征

所以,php前后端分離的項目, 首推Nginx+php-fpm。

現(xiàn)在 Nginx 才是 Web 服務(wù)器的首選

如果單臺服務(wù)器的話伪窖,NGINX+APACHE+PHP 純粹多此一舉逸寓,多了一次請求轉(zhuǎn)發(fā),效率肯定低惰许,而且現(xiàn)在FPM已經(jīng)足夠穩(wěn)定席覆。完全沒必要。
php+apache 和 php+nginx的區(qū)別
Nginx+PHP與Apache+PHP性能對比

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末汹买,一起剝皮案震驚了整個濱河市佩伤,隨后出現(xiàn)的幾起案子聊倔,更是在濱河造成了極大的恐慌,老刑警劉巖生巡,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耙蔑,死亡現(xiàn)場離奇詭異,居然都是意外死亡孤荣,警方通過查閱死者的電腦和手機甸陌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盐股,“玉大人钱豁,你說我怎么就攤上這事》柚” “怎么了牲尺?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長幌蚊。 經(jīng)常有香客問我谤碳,道長,這世上最難降的妖魔是什么溢豆? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任蜒简,我火速辦了婚禮,結(jié)果婚禮上漩仙,老公的妹妹穿的比我還像新娘搓茬。我一直安慰自己,他們只是感情好讯赏,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布垮兑。 她就那樣靜靜地躺著,像睡著了一般漱挎。 火紅的嫁衣襯著肌膚如雪系枪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天磕谅,我揣著相機與錄音私爷,去河邊找鬼。 笑死膊夹,一個胖子當著我的面吹牛衬浑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播放刨,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼工秩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起助币,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤浪听,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后眉菱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體迹栓,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年俭缓,在試婚紗的時候發(fā)現(xiàn)自己被綠了克伊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡华坦,死狀恐怖愿吹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情季春,我是刑警寧澤洗搂,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站载弄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏撵颊。R本人自食惡果不足惜宇攻,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望倡勇。 院中可真熱鬧逞刷,春花似錦、人聲如沸妻熊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扔役。三九已至帆喇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間亿胸,已是汗流浹背坯钦。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留侈玄,地道東北人婉刀。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像序仙,于是被迫代替她去往敵國和親突颊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容