亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747



Nginx現(xiàn)在是非常火爆的web服務(wù)器,她使用更少的資源,支持更多的并發(fā)連接數(shù),實(shí)現(xiàn)了linux的epoll模型。

Nginx采用的是多進(jìn)程單線程和多路IO復(fù)用模型。使用了I/O多路復(fù)用技術(shù)的Nginx,就成了”并發(fā)事件驅(qū)動(dòng)“的服務(wù)器。這里再?gòu)?qiáng)調(diào)下重點(diǎn),

  • 多進(jìn)程單線程
  • 多路IO復(fù)用模型
搞定Nginx高并發(fā)原理:多進(jìn)程單線程和多路IO復(fù)用模型

 

一、多進(jìn)程單線程

Nginx 自己實(shí)現(xiàn)了對(duì)epoll的封裝,是多進(jìn)程單線程的典型代表。使用多進(jìn)程模式,不僅能提高并發(fā)率,而且進(jìn)程之間是相互獨(dú)立的,一 個(gè)worker進(jìn)程掛了不會(huì)影響到其他worker進(jìn)程。

master進(jìn)程管理worker進(jìn)程:

  1. 接收來(lái)自外界的信號(hào)。
  2. 向各worker進(jìn)程發(fā)送信號(hào)。
  3. 監(jiān)控woker進(jìn)程的運(yùn)行狀態(tài)。
  4. 當(dāng)woker進(jìn)程退出后(異常情況下),會(huì)自動(dòng)重新啟動(dòng)新的woker進(jìn)程。

注意worker進(jìn)程數(shù),一般會(huì)設(shè)置成機(jī)器cpu核數(shù)。因?yàn)楦嗟膚orker只會(huì)導(dǎo)致進(jìn)程之間相互競(jìng)爭(zhēng)cpu,從而帶來(lái)不必要的上下文切換。
 

二、IO 多路復(fù)用模型 epoll

多路復(fù)用,允許我們只在事件發(fā)生時(shí)才將控制返回給程序,而其他時(shí)候內(nèi)核都掛起進(jìn)程,隨時(shí)待命。

epoll通過在Linux內(nèi)核中申請(qǐng)一個(gè)簡(jiǎn)易的文件系統(tǒng)(文件系統(tǒng)一般用B+樹數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)),其工作流程分為三部分:

  1. 調(diào)用 int epoll_create(int size)建立一個(gè)epoll對(duì)象,內(nèi)核會(huì)創(chuàng)建一個(gè)eventpoll結(jié)構(gòu)體,用于存放通過epoll_ctl()向epoll對(duì)象中添加進(jìn)來(lái)的事件,這些事件都會(huì)掛載在紅黑樹中。
  2. 調(diào)用 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event) 在 epoll 對(duì)象中為 fd 注冊(cè)事件,所有添加到epoll中的事件都會(huì)與設(shè)備驅(qū)動(dòng)程序建立回調(diào)關(guān)系,也就是說,當(dāng)相應(yīng)的事件發(fā)生時(shí)會(huì)調(diào)用這個(gè)sockfd的回調(diào)方法,將sockfd添加到eventpoll 中的雙鏈表。
  3. 調(diào)用 int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout) 來(lái)等待事件的發(fā)生,timeout 為 -1 時(shí),該調(diào)用會(huì)阻塞知道有事件發(fā)生。

注冊(cè)好事件之后,只要有fd上事件發(fā)生,epoll_wait()就能檢測(cè)到并返回給用戶,用戶執(zhí)行阻塞函數(shù)時(shí)就不會(huì)發(fā)生阻塞了。

epoll()在中內(nèi)核維護(hù)一個(gè)鏈表,epoll_wait直接檢查鏈表是不是空就知道是否有文件描述符準(zhǔn)備好了。順便提一提,epoll與select、poll相比最大的優(yōu)點(diǎn)是不會(huì)隨著sockfd數(shù)目增長(zhǎng)而降低效率,使用select()時(shí),內(nèi)核采用輪訓(xùn)的方法來(lái)查看是否有fd準(zhǔn)備好,其中的保存sockfd的是類似數(shù)組的數(shù)據(jù)結(jié)構(gòu)fd_set,key 為 fd,value為0或者1(發(fā)生時(shí)間)。

能達(dá)到這種效果,是因?yàn)樵趦?nèi)核實(shí)現(xiàn)中epoll是根據(jù)每 sockfd 上面的與設(shè)備驅(qū)動(dòng)程序建立起來(lái)的回調(diào)函數(shù)實(shí)現(xiàn)的。那么,某個(gè)sockfd上的事件發(fā)生時(shí),與它對(duì)應(yīng)的回調(diào)函數(shù)就會(huì)被調(diào)用,將這個(gè)sockfd加入鏈表,其他處于“空閑的”狀態(tài)的則不會(huì)。在這點(diǎn)上,epoll 實(shí)現(xiàn)了一個(gè)"偽"AIO。

可以看出,因?yàn)橐粋€(gè)進(jìn)程里只有一個(gè)線程,所以一個(gè)進(jìn)程同時(shí)只能做一件事,但是可以通過不斷地切換來(lái)“同時(shí)”處理多個(gè)請(qǐng)求。

例子:Nginx 會(huì)注冊(cè)一個(gè)事件:“如果來(lái)自一個(gè)新客戶端的連接請(qǐng)求到來(lái)了,再通知我”,此后只有連接請(qǐng)求到來(lái),服務(wù)器才會(huì)執(zhí)行 accept() 來(lái)接收請(qǐng)求。又比如向上游服務(wù)器(比如 php-FPM)轉(zhuǎn)發(fā)請(qǐng)求,并等待請(qǐng)求返回時(shí),這個(gè)處理的 worker 不會(huì)在這阻塞,它會(huì)在發(fā)送完請(qǐng)求后,注冊(cè)一個(gè)事件:“如果緩沖區(qū)接收到數(shù)據(jù)了,告訴我一聲,我再將它讀進(jìn)來(lái)”,于是進(jìn)程就空閑下來(lái)等待事件發(fā)生。

這樣,基于 多進(jìn)程+epoll, Nginx 便能實(shí)現(xiàn)高并發(fā)。

 

三、worker進(jìn)程工作流程

當(dāng)一個(gè) worker 進(jìn)程在 accept() 這個(gè)連接之后,就開始讀取請(qǐng)求,解析請(qǐng)求,處理請(qǐng)求,產(chǎn)生數(shù)據(jù)后,再返回給客戶端,最后才斷開連接,一個(gè)完整的請(qǐng)求。一個(gè)請(qǐng)求,完全由worker進(jìn)程來(lái)處理,而且只會(huì)在一個(gè)worker進(jìn)程中處理。優(yōu)點(diǎn):

  1. 節(jié)省鎖帶來(lái)的開銷。每個(gè)worker進(jìn)程都彼此獨(dú)立地工作,不共享任何資源,因此不需要鎖。同時(shí)在編程以及問題排查上時(shí),也會(huì)方便很多。
  2. 獨(dú)立進(jìn)程,減少風(fēng)險(xiǎn)。采用獨(dú)立的進(jìn)程,可以讓互相之間不會(huì)影響,一個(gè)進(jìn)程退出后,其它進(jìn)程還在工作,服務(wù)不會(huì)中斷,master進(jìn)程則很快重新啟動(dòng)新的worker進(jìn)程。當(dāng)然,worker進(jìn)程自己也能發(fā)生意外退出。

四、對(duì)驚群效應(yīng)的處理

Nginx提供了一個(gè)accept_mutex這個(gè)東西,這是一個(gè)加在accept上的一把互斥鎖。即每個(gè)worker進(jìn)程在執(zhí)行accept()之前都需要先獲取鎖,accept()成功之后再解鎖。有了這把鎖,同一時(shí)刻,只會(huì)有一個(gè)進(jìn)程執(zhí)行accpet(),這樣就不會(huì)有驚群?jiǎn)栴}了。accept_mutex是一個(gè)可控選項(xiàng),我們可以顯示地關(guān)掉,默認(rèn)是打開的。

分享到:
標(biāo)簽:并發(fā) Nginx
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定