Nginx進(jìn)程調(diào)度問題詳解
Nginx采用的是固定數(shù)量的多進(jìn)程模型,由一個(gè)主進(jìn)程(MasterProcess)和數(shù)量與主機(jī)CPU核數(shù)相同的工作進(jìn)程協(xié)同處理各種事件。
Nginx采用的是固定數(shù)量的多進(jìn)程模型,由一個(gè)主進(jìn)程(MasterProcess)和數(shù)量與主機(jī)CPU核數(shù)相同的工作進(jìn)程協(xié)同處理各種事件。
主管理進(jìn)程負(fù)責(zé)工作進(jìn)程的配置加載、啟停等操作,工作進(jìn)程負(fù)責(zé)處理具體請(qǐng)求。進(jìn)程間的資源都是獨(dú)立的,每個(gè)工作進(jìn)程處理多個(gè)連接,每個(gè)連接由一個(gè)工作進(jìn)程全權(quán)處理,不需要進(jìn)行進(jìn)程切換,也就不會(huì)產(chǎn)生由進(jìn)程切換引起的資源消耗問題。默認(rèn)配置下,工作進(jìn)程的數(shù)量與主機(jī)CPU核數(shù)相同,充分利用CPU和進(jìn)程的親緣性(affinity)將工作進(jìn)程與CPU綁定,從而最大限度地發(fā)揮多核CPU的處理能力。
Nginx主進(jìn)程負(fù)責(zé)監(jiān)聽外部控制信號(hào),通過頻道機(jī)制將相關(guān)信號(hào)操作傳遞給工作進(jìn)程,多個(gè)工作進(jìn)程間通過共享內(nèi)存來共享數(shù)據(jù)和信息。
Tips:進(jìn)程親緣性(affinity),使進(jìn)程或線程在指定的CPU(核)上運(yùn)行。
Nginx的工作進(jìn)程有如下幾種調(diào)度方式:
- 無調(diào)度模式:所有工作進(jìn)程都會(huì)在連接事件被觸發(fā)時(shí)爭相與客戶端建立連接,建立連接成功則開始處理客戶端請(qǐng)求。無調(diào)度模式下所有進(jìn)程都會(huì)爭搶資源,但最終只有一個(gè)進(jìn)程可以與客戶端建立連接,對(duì)于系統(tǒng)而言這將在瞬間產(chǎn)生大量的資源消耗,這就是所謂的驚群現(xiàn)象。
- 互斥鎖模式:每個(gè)工作進(jìn)程都會(huì)周期性地爭搶互斥鎖,一旦某個(gè)工作進(jìn)程搶到互斥鎖,就表示其擁有接收HTTP建立連接事件的處理權(quán),并將當(dāng)前進(jìn)程的socket監(jiān)聽注入事件引擎(如epoll)中,接收外部的連接事件。其他工作進(jìn)程只能繼續(xù)處理已經(jīng)建立連接的讀寫事件,并周期性地輪詢查看互斥鎖的狀態(tài),只有互斥鎖被釋放后工作進(jìn)程才可以搶占互斥鎖,獲取HTTP建立連接事件的處理權(quán)。當(dāng)工作進(jìn)程最大連接數(shù)的1/8與該進(jìn)程可用連接(free_connection)的差大于或等于1時(shí),則放棄本輪爭搶互斥鎖的機(jī)會(huì),不再接收新的連接請(qǐng)求,只處理已建立連接的讀寫事件。互斥鎖模式有效地避免了驚群現(xiàn)象,對(duì)于大量HTTP的短連接,該機(jī)制有效避免了因工作進(jìn)程爭搶事件處理權(quán)而產(chǎn)生的資源消耗。但對(duì)于大量啟用長連接方式的HTTP連接,互斥鎖模式會(huì)將壓力集中在少數(shù)工作進(jìn)程上,進(jìn)而因工作進(jìn)程負(fù)載不均而導(dǎo)致QPS下降。
- 套接字分片:套接字分片是由內(nèi)核提供的一種分配機(jī)制,該機(jī)制允許每個(gè)工作進(jìn)程都有一組相同的監(jiān)聽套接字。當(dāng)有外部連接請(qǐng)求時(shí),由內(nèi)核決定哪個(gè)工作進(jìn)程的套接字監(jiān)聽可以接收連接。這有效避免了驚群現(xiàn)象的發(fā)生,相比互斥鎖機(jī)制提高了多核系統(tǒng)的性能。該功能需要在配置listen指令時(shí)啟用reuseport參數(shù)。
Tips:Nginx 1.11.3以后的版本中互斥鎖模式默認(rèn)是關(guān)閉的。套接字分片模式則因?yàn)橛蒐inux內(nèi)核提供進(jìn)程的調(diào)度機(jī)制,所以性能最好。
到此這篇關(guān)于Nginx進(jìn)程調(diào)度問題的文章就介紹到這了,更多相關(guān)Nginx進(jìn)程調(diào)度內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nginx代理接口訪問返回404的實(shí)現(xiàn)示例
因?yàn)椴煌瑯I(yè)務(wù)系統(tǒng)間有接口調(diào)用,存在跨域問題,為了解決同源策略,需要將接口通過nginx去轉(zhuǎn)發(fā),本文主要介紹了Nginx代理接口訪問返回404的實(shí)現(xiàn)示例,感興趣的可以了解一下2024-06-06Nginx反向代理多域名的HTTP和HTTPS服務(wù)的實(shí)現(xiàn)
這篇文章主要介紹了Nginx反向代理多域名的HTTP和HTTPS服務(wù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06WinPC搭建nginx服務(wù)器的實(shí)現(xiàn)步驟
本文主要介紹了WinPC搭建nginx服務(wù)器的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01