欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Nginx架構(gòu)和工作原理

馬哥Linux運(yùn)維 ? 來源:linkinstars.com ? 2023-09-25 14:04 ? 次閱讀

什么是驚群效應(yīng)?

第一次聽到的這個名詞的時候覺得很是有趣,不知道是個什么意思,總覺得又是奇怪的中文翻譯導(dǎo)致的。

復(fù)雜的說(來源于網(wǎng)絡(luò))TLDR;

驚群效應(yīng)(thundering herd)是指多進(jìn)程(多線程)在同時阻塞等待同一個事件的時候(休眠狀態(tài)),如果等待的這個事件發(fā)生,那么他就會喚醒等待的所有進(jìn)程(或者線程),但是最終卻只能有一個進(jìn)程(線程)獲得這個時間的“控制權(quán)”,對該事件進(jìn)行處理,而其他進(jìn)程(線程)獲取“控制權(quán)”失敗,只能重新進(jìn)入休眠狀態(tài),這種現(xiàn)象和性能浪費(fèi)就叫做驚群效應(yīng)。

簡單的講(我的大白話)

有一道雷打下來,把很多人都吵醒了,但只有其中一個人去收衣服了。也就是:有一個請求過來了,把很多進(jìn)程都喚醒了,但只有其中一個能最終處理。

原因&問題

說起來其實(shí)也簡單,多數(shù)時候為了提高應(yīng)用的請求處理能力,會使用多進(jìn)程(多線程)去監(jiān)聽請求,當(dāng)請求來時,因為都有能力處理,所以就都被喚醒了。

而問題就是,最終還是只能有一個進(jìn)程能來處理。當(dāng)請求多了,不停地喚醒、休眠、喚醒、休眠,做了很多的無用功,上下文切換又累,對吧。那怎么解決這個問題呢?下面就是今天要看的重點(diǎn),我們看看 nginx 是如何解決這個問題的。

Nginx 架構(gòu)

第一點(diǎn)我們需要了解 nginx 大致的架構(gòu)是怎么樣的。nginx 將進(jìn)程分為 master 和 worker 兩類,非常常見的一種 M-S 策略,也就是 master 負(fù)責(zé)統(tǒng)籌管理 worker,當(dāng)然它也負(fù)責(zé)如:啟動、讀取配置文件,監(jiān)聽處理各種信號等工作。

44a6adb4-5adb-11ee-939d-92fbcf53809c.png

圖片來自:https://aosabook.org/en/v2/nginx.html

但是,第一個要注意的問題就出現(xiàn)了,master 的工作有且只有這些,對于請求來說它是不管的,就如同圖中所示,請求是直接被 worker 處理的。如此一來,請求應(yīng)該被哪個 worker 處理呢?worker 內(nèi)部又是如何處理請求的呢?

Nginx 使用 epoll

接下來我們就要知道 nginx 是如何使用 epoll 來處理請求的。下面可能會涉及到一些源碼的內(nèi)容,但不用擔(dān)心,你不需要全部理解,只需要知道它們的作用就可以了。順便我會簡單描述一下我是如何去找到這些源碼的位置的。

Master 的工作

其實(shí) Master 并不是毫無作為,至少端口是它來占的。

ngx_open_listening_sockets(ngx_cycle_t*cycle)
{
.....
for(i=0;ilistening.nelts;i++){
.....
if(bind(s,ls[i].sockaddr,ls[i].socklen)==-1){

if(listen(s,ls[i].backlog)==-1){
}

那么,根據(jù)我們 nginx.conf 的配置文件,看需要監(jiān)聽哪個端口,于是就去 bind 的了,這里沒問題。

【發(fā)現(xiàn)源碼】這里我是直接在代碼里面搜 bind 方法去找的,因為我知道,不管你怎么樣,你總是要綁定端口的

然后是創(chuàng)建 worker 的,雖不起眼,但很關(guān)鍵。https://github.com/nginx/nginx/blob/b489ba83e9be446923facfe1a2fe392be3095d1f/src/os/unix/ngx_process.c#L186

ngx_spawn_process(ngx_cycle_t*cycle,ngx_spawn_proc_ptproc,void*data,
char*name,ngx_int_trespawn)
{
....
pid=fork();

【發(fā)現(xiàn)源碼】這里我直接搜 fork,整個項目里面需要 fork 的情況只有兩個地方,很快就找到了 worker

由于是 fork 創(chuàng)建的,也就是復(fù)制了一份 task_struct 結(jié)構(gòu)。所以 master 的幾乎全部它都有。

Worker 的工作

Nginx 有一個分模塊的思想,它將不同功能分成了不同的模塊,而 epoll 自然就是在 ngx_epoll_module.c 中了

ngx_epoll_init(ngx_cycle_t*cycle,ngx_msec_ttimer)
{
ngx_epoll_conf_t*epcf;

epcf=ngx_event_get_conf(cycle->conf_ctx,ngx_epoll_module);

if(ep==-1){
ep=epoll_create(cycle->connection_n/2);

其他不重要,就連 epoll_ctl 和 epoll_wait 也不重要了,這里你需要知道的就是,從調(diào)用鏈路來看,是 worker 創(chuàng)建的 epoll 對象,也就是每個 worker 都有自己的 epoll 對象,而監(jiān)聽的sokcet 是一樣的!

【發(fā)現(xiàn)源碼】這里更加直接,搜索 epoll_create 肯定就能找到

問題的關(guān)鍵

此時問題的關(guān)鍵基本就能了解了,每個 worker 都有處理能力,請求來了此時應(yīng)該喚醒誰呢?講道理那不是所有 epoll 都會有事件,所有 worker 都 accept 請求?顯然這樣是不行的。那么 nginx 是如何解決的呢?

如何解決

解決方式一共有三種,下面我們一個個來看:

accept_mutex(應(yīng)用層的解決方案)

EPOLLEXCLUSIVE(內(nèi)核層的解決方案)

SO_REUSEPORT(內(nèi)核層的解決方案)

accept_mutex

看到 mutex 可能你就知道了,鎖嘛!這也是對于高并發(fā)處理的 ”基操“ 遇事不決加鎖,沒錯,加鎖肯定能解決問題。

具體代碼就不展示了,其中細(xì)節(jié)很多,但本質(zhì)很容易理解,就是當(dāng)請求來了,誰拿到了這個鎖,誰就去處理。沒拿到的就不管了。鎖的問題很直接,除了慢沒啥不好的,但至少很公平。

EPOLLEXCLUSIVE

EPOLLEXCLUSIVE 是 2016 年 4.5+ 內(nèi)核新添加的一個 epoll 的標(biāo)識。它降低了多個進(jìn)程/線程通過 epoll_ctl 添加共享 fd 引發(fā)的驚群概率,使得一個事件發(fā)生時,只喚醒一個正在 epoll_wait 阻塞等待喚醒的進(jìn)程(而不是全部喚醒)。

關(guān)鍵是:每次內(nèi)核只喚醒一個睡眠的進(jìn)程處理資源

但,這個方案不是完美的解決了,它僅是降低了概率哦。為什么這樣說呢?相比于原來全部喚醒,那肯定是好了不少,降低了沖突。但由于本質(zhì)來說 socket 是共享的,當(dāng)前進(jìn)程處理完成的時間不確定,在后面被喚醒的進(jìn)程可能會發(fā)現(xiàn)當(dāng)前的 socket 已經(jīng)被之前喚醒的進(jìn)程處理掉了。

SO_REUSEPORT

Nginx 在 1.9.1 版本加入了這個功能

其本質(zhì)是利用了 Linux 的 reuseport 的特性,使用 reuseport 內(nèi)核允許多個進(jìn)程 listening socket 到同一個端口上,而從內(nèi)核層面做了負(fù)載均衡,每次喚醒其中一個進(jìn)程。

反應(yīng)到 Nginx 上就是,每個 Worker 進(jìn)程都創(chuàng)建獨(dú)立的 listening socket,監(jiān)聽相同的端口,accept 時只有一個進(jìn)程會獲得連接。效果就和下圖所示一樣。

44ba45ea-5adb-11ee-939d-92fbcf53809c.png

而使用方式則是:

http{
server{
listen80reuseport;
server_namelocalhost;
#...
}
}

從官方的測試情況來看確實(shí)是厲害

44c3967c-5adb-11ee-939d-92fbcf53809c.png

當(dāng)然,正所謂:完事無絕對,技術(shù)無銀彈。這個方案的問題在于內(nèi)核是不知道你忙還是不忙的。只會無腦的丟給你。與之前的搶鎖對比,搶鎖的進(jìn)程一定是不忙的,現(xiàn)在手上的工作都已經(jīng)忙不過來了,沒機(jī)會去搶鎖了;而這個方案可能導(dǎo)致,如果當(dāng)前進(jìn)程忙不過來了,還是會只要根據(jù) reuseport 的負(fù)載規(guī)則輪到你了就會發(fā)送給你,所以會導(dǎo)致有的請求被前面慢的請求卡住了。

總結(jié)

本文,從了解什么 ”驚群效應(yīng)“ 到 nginx 架構(gòu)和 epoll 處理的原理,最終分析三種不同的處理 “驚群效應(yīng)” 的方案。分析到這里,我想你應(yīng)該明白其實(shí) nginx 這個多隊列服務(wù)模型是所存在的一些問題,只不過絕大多數(shù)場景已經(jīng)完完全全夠用了。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11350

    瀏覽量

    210466
  • 源碼
    +關(guān)注

    關(guān)注

    8

    文章

    653

    瀏覽量

    29477
  • 多線程
    +關(guān)注

    關(guān)注

    0

    文章

    278

    瀏覽量

    20075
  • nginx
    +關(guān)注

    關(guān)注

    0

    文章

    154

    瀏覽量

    12238
  • epoll
    +關(guān)注

    關(guān)注

    0

    文章

    28

    瀏覽量

    2985

原文標(biāo)題:Nginx 是如何解決驚群效應(yīng)的?

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    nginx重啟命令linux步驟是什么?

    ./nginx -s reload 即可   方法二:查找當(dāng)前nginx進(jìn)程號,然后輸入命令:kill -HUP 進(jìn)程號 實(shí)現(xiàn)重啟nginx服務(wù)   Nginx的整體
    發(fā)表于 07-10 16:40

    nginx重啟命令linux步驟是什么?

    ./nginx -s reload 即可   方法二:查找當(dāng)前nginx進(jìn)程號,然后輸入命令:kill -HUP 進(jìn)程號 實(shí)現(xiàn)重啟nginx服務(wù)   Nginx的整體
    發(fā)表于 07-11 17:13

    感光太陽能燈工作原理。#工作原理大揭秘

    太陽工作原理DIY
    jf_24750660
    發(fā)布于 :2022年11月07日 22:26:04

    nginx錯誤頁面配置

    16、nginx 錯誤頁面配置nginx錯誤頁面包括404 403 500 502 503 504等頁面,只需要在server中增加以下配置即可: error_page404 403 500 502
    發(fā)表于 07-26 06:54

    主要學(xué)習(xí)下nginx的安裝配置

    處理。因為有了中間件,使得大型網(wǎng)站在規(guī)劃有了更好的層次性,維護(hù)上更加方便。也可以實(shí)現(xiàn)負(fù)載均衡、安全防護(hù)等。Nginx是一個開源高性能、可靠的HTTP中間件、代理服務(wù),在目前企業(yè)中得到了很大的利用。今天
    發(fā)表于 10-19 14:12

    Gnutella文件共享體系架構(gòu)工作原理

    Gnutella文件共享體系架構(gòu)工作原理 Gnutella工作原理 Napster在其巔峰時期或許是有史以來最受歡迎
    發(fā)表于 07-30 09:11 ?3429次閱讀

    一文讀懂Nginx、Apache工作原理

    在高并發(fā)連接的情況下,Nginx是Apache服務(wù)器不錯的替代品。Nginx同時也可以作為7層負(fù)載均衡服務(wù)器來使用。根據(jù)我的測試結(jié)果,Nginx 0.7.14 + PHP 5.2.6 (FastCGI) 可以承受3萬以上的并發(fā)連
    發(fā)表于 04-26 11:33 ?2514次閱讀

    CC2640R2F的架構(gòu)工作原理

    CC2640R2軟件速成之一-架構(gòu)工作原理
    的頭像 發(fā)表于 08-23 01:33 ?9067次閱讀

    Nginx架構(gòu)介紹 Nginx服務(wù)器模型分析

    Nginx是一款免費(fèi)的、開源的、高性能、模塊化、輕量級的HTTP服務(wù)器、反向代理服務(wù)器以及電子郵件(IMAP/POP3)代理服務(wù)器。
    的頭像 發(fā)表于 01-10 16:32 ?9277次閱讀
    <b class='flag-5'>Nginx</b><b class='flag-5'>架構(gòu)</b>介紹 <b class='flag-5'>Nginx</b>服務(wù)器模型分析

    Nginx如何監(jiān)控

    搭建了Nginx集群后,需要繼續(xù)深入研究的就是日常Nginx監(jiān)控。
    的頭像 發(fā)表于 08-22 10:03 ?1468次閱讀

    Nginx搭建流行架構(gòu)LNMP的步驟

    LNMP是一套技術(shù)的組合,L=Linux、N=Nginx、M=MySQL(MyriDB)、P=PHP(Python)
    的頭像 發(fā)表于 05-22 18:19 ?969次閱讀
    <b class='flag-5'>Nginx</b>搭建流行<b class='flag-5'>架構(gòu)</b>LNMP的步驟

    Nginx目錄結(jié)構(gòu)有哪些

    什么是Nginx? Nginx是一個 輕量級/高性能的反向代理Web服務(wù)器,他實(shí)現(xiàn)非常高效的反向代理、負(fù)載平衡,他可以處理2-3萬并發(fā)連接數(shù),官方監(jiān)測能支持5萬并發(fā),現(xiàn)在中國使用nginx網(wǎng)站用戶有
    的頭像 發(fā)表于 11-11 11:27 ?684次閱讀
    <b class='flag-5'>Nginx</b>目錄結(jié)構(gòu)有哪些

    Nginx 如何實(shí)現(xiàn)高性能低消耗

    。Nginx具有豐富的模塊庫、靈活的配置、較低資源消耗等優(yōu)點(diǎn)。下面,我們一起深入看一下Nginx工作機(jī)制 1. Nginx 如何實(shí)現(xiàn)高性能低消耗的呢? 我們從以下幾個方面說明以下:
    的頭像 發(fā)表于 11-11 11:31 ?634次閱讀
    <b class='flag-5'>Nginx</b> 如何實(shí)現(xiàn)高性能低消耗

    NVSRAM的工作原理架構(gòu)分析

    NVSRAM的工作原理基于將SRAM部分的數(shù)據(jù)在斷電前復(fù)制到NVM單元中,并在重新上電時將數(shù)據(jù)從NVM恢復(fù)到SRAM。
    的頭像 發(fā)表于 12-05 16:46 ?1003次閱讀

    確保網(wǎng)站無縫運(yùn)行:Keepalived高可用與Nginx集成實(shí)戰(zhàn)

    目錄 keepalived高可用(nginx) keepalived簡介 keepalived的重要功能 keepalived高可用架構(gòu)圖 keepalived工作原理描述 keepalived實(shí)現(xiàn)
    的頭像 發(fā)表于 11-27 09:08 ?669次閱讀
    確保網(wǎng)站無縫運(yùn)行:Keepalived高可用與<b class='flag-5'>Nginx</b>集成實(shí)戰(zhàn)