Nginx支援比Apache高併發的原因

2022-06-09 21:54:11 字數 2305 閱讀 4404

1.先從各自使用的多路復用io模型說起:

select模型:(apache使用,由於受模組等限制,用的不多)

單個程序能夠 監視的檔案描述符的數量存在最大限制

select()所維護的 儲存大量檔案描述符的資料結構 ,隨著檔案描述符數量的增長,其在使用者態和核心的位址空間的複製所引發的開銷也會線性增長

由於網路響應時間的延遲使得大量tcp連線處於非活躍狀態,但呼叫select()還是會對 所有的socket進行一次線性掃瞄 ,會造成一定的開銷

poll:

poll是unix沿用select自己重新實現了一遍,唯一解決的問題是poll 沒有最大檔案描述符數量的限制

epoll模型:(nginx使用)

epoll帶來了兩個優勢,大幅度提公升了效能:

基於事件的就緒通知方式 ,select/poll方式,程序只有在呼叫一定的方法後,核心才會對所有監視的檔案描述符進行掃瞄,而epoll事件通過epoll_ctl()註冊乙個檔案描述符,一旦某個檔案描述符就緒時,核心會採用類似call back的**機制,迅速啟用這個檔案描述符,epoll_wait()便會得到通知

呼叫一次epoll_wait()獲得就緒檔案描述符時,返回的並不是實際的描述符,而是乙個代表就緒描述符數量的值,拿到這些值去epoll指定的乙個陣列中依次取得相應數量的檔案描述符即可,這裡使用記憶體對映(mmap)技術, 避免了複製大量檔案描述符帶來的開銷

當然epoll也有一定的侷限性, epoll只有linux2.6才有實現 ,而其他平台都沒有,這和apache這種優秀的跨平台伺服器,顯然是有些背道而馳了。

簡單來說epoll是select的公升級版,單程序管理的檔案描述符沒有最大限制。但epoll只有linux平台可使用。作為跨平台的apache沒有使用。

2.再看一下apache常用的兩種併發策略:

1) perfork模式的工作原理:  

當apache被啟動時,apache會自動建立startservers個程序,並且盡力將空閒程序數保持在minspareservers和maxspareservers之間。

如果空閒程序小於minspareservers,apache將會以大約每秒1個的速度新建程序。

如果空閒程序小於maxspareservers,apache將會刪除多餘的空閒程序,釋放伺服器資源。

程序數的最大值由maxclients控制,在apache1.3中最大只能設定為256,但在apache2.0中,可以通過在配置開頭增加serverlimit專案來突破256的限制,此時必須maxclients  ≤ serverlimit ≤ 20000

maxrequestsperchild用來控制每個程序在處理了多少次請求之後自動銷毀,這個引數可以設定為0表示無限(即不銷毀程序)

2) worker模式的工作原理:

由主控制程序生成「startservers」個子程序,每個子程序中包含固定的threadsperchild執行緒數,各個執行緒獨立地處理請求。

同樣,為了不在請求到來時再生成執行緒,minsparethreads和maxsparethreads設定了最少和最多的空閒執行緒數;而maxclients設定允許的最大執行緒總數。

如果現有子程序中的執行緒總數不能滿足負載,控制程序將派生新的子程序。

每個子執行緒處理服務請求次數由maxrequestperchild定義。 預設的設定值為0,即響應無限此請求。

預設生成3個子程序來處理請求。

兩種策略的缺陷:

perfork模式:每乙個連線建立乙個程序,每個程序內單執行緒。對於乙個負載相對較高的**來說,256的程序限制是不夠的,如果伺服器已經達到256的極限,那麼接下去的訪問就需要排隊,這也就是為什麼某些伺服器負載不高,但是訪問卻很慢的原因之一。

worker模式:也是多程序處理,也會建立多個程序和多個執行緒,如果程序數達到管理員設定的閥值,則會拒絕新的請求。

兩種模式都會建立多個程序或執行緒,而每個程序或執行緒都會為其分配cpu和記憶體(執行緒要比程序小的多,所以worker支援比perfork高的併發),併發過大會榨乾伺服器資源。

3.nginx的工作原理:

nginx並不會為每乙個的web請求建立新的程序,相反,管理員可以配置nginx主程序的工作程序的數量(乙個常見的做法是為每乙個cpu配置乙個工作程序)。所有這些程序都是單執行緒的。

每乙個工作程序可以處理數千個併發的請求。它通過乙個執行緒來非同步非阻塞的完成了這些工作(epoll),而沒有使用多執行緒的程式設計模型。

nginx的優勢:

採用單執行緒來非同步非阻塞處理請求,不會為每個請求分配cpu和記憶體資源,節省了大量資源,同時也減少了大量的cpu的上下文切換。所以才使得nginx支援更高的併發。

nginx為什麼比Apache支援高併發???

最開始接觸程式設計時,使用的是apache伺服器,後來隨著 使用者訪問量的增加,考慮高併發是必不可少的環節,越來越多的公司使用nginx伺服器。我們公司最近也打算更換nginx伺服器。那麼nginx和apache有哪些異同點呢,nginx為什麼比apache支援高併發呢?首先,先看一下各自使用的io...

Nginx支援比Apache高併發的原因

1.先從各自使用的多路復用io模型說起 select模型 apache使用,由於受模組等限制,用的不多 單個程序能夠 監視的檔案描述符的數量存在最大限制 select 所維護的 儲存大量檔案描述符的資料結構 隨著檔案描述符數量的增長,其在使用者態和核心的位址空間的複製所引發的開銷也會線性增長 由於網...

小文章 nginx比apache快的原因

1 在高併發的情況下nginx比apache快,低併發體現不明顯 2 快的原因得益於nginx的epoll模型 apache是多執行緒或者多程序,在工作的時候,當來了乙個http響應,乙個程序接收 listen 識別處理 返回請求,在此過程中,乙個程序全部處理,apche 對於套接字的i o,讀或者...