青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

那誰的技術博客

感興趣領域:高性能服務器編程,存儲,算法,Linux內核
隨筆 - 210, 文章 - 0, 評論 - 1183, 引用 - 0
數(shù)據(jù)加載中……

Nginx0.7.61代碼分析(二)--worker子進程之間的負載均衡

緊跟著上一節(jié)所講的,Nginx里面worker子進程之間相互獨立,各自接收新的連接,接收數(shù)據(jù)報文,處理請求,等等。

但是,由于監(jiān)聽socket是由父進程創(chuàng)建的,所以在子進程調用accept函數(shù)接收新的連接時可能會出現(xiàn)所謂的驚群(thundering herd), 其實這個現(xiàn)象即使出現(xiàn),我個人認為對性能的影響也不會太大,不就是一次accept操作失敗么。另外呢,子進程之間雖然是獨立工作的,但是,也可能出現(xiàn)不同的子進程之間負載不均衡的情況,比如某些子進程處理1000個連接,有的子進程處理100個連接,差了十倍。

Nginx里面,針對上面提到的兩點,對程序進行了一些優(yōu)化。來看看ngx_process_events_and_timers 函數(shù)里面的代碼,這個函數(shù)是worker子進程中服務器主循環(huán)每次循環(huán)都會調用的函數(shù):

    // 如果使用了accept mutex 
   
if (ngx_use_accept_mutex) {
        // 如果當前禁止accept操作的計數(shù)還大于0
        
if (ngx_accept_disabled > 0) {
            // 將這個計數(shù)減一
            ngx_accept_disabled
--;

        } 
else {
            // 嘗試獲取accept鎖
            
if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR) {
                
return;
            }
          
            // 如果獲取到了accept鎖
            
if (ngx_accept_mutex_held) {
                flags 
|= NGX_POST_EVENTS;

            } 
else {
                // 否則, 如果滿足下面兩個條件,將定時器置為ngx_accept_mutex_delay, 這個值是一個配置參數(shù)指定的
                
if (timer == NGX_TIMER_INFINITE
                    
|| timer > ngx_accept_mutex_delay)
                {
                    timer 
= ngx_accept_mutex_delay;
                }
            }
        }
    }

    // 記下當前時間點
    delta 
= ngx_current_msec;

    //  處理事件
    (
void) ngx_process_events(cycle, timer, flags);

    // 得到處理事件所用的時間
    delta 
= ngx_current_msec - delta;

    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle
->log, 0,
                   
"timer delta: %M", delta);

    // 如果有accept事件發(fā)生, 就去處理accept事件,其實最后就是調用accept函數(shù)接收新的連接
    
if (ngx_posted_accept_events) {
        ngx_event_process_posted(cycle, 
&ngx_posted_accept_events);
    }

    // 已經(jīng)處理完接收新連接的事件了,如果前面獲取到了accept鎖,那就解鎖
    
if (ngx_accept_mutex_held) {
        ngx_shmtx_unlock(
&ngx_accept_mutex);
    }

    
if (delta) {
        ngx_event_expire_timers();
    }

    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle
->log, 0,
                   
"posted events %p", ngx_posted_events);

    // 除了accepet事件之外的其他事件放在這個隊列中, 如果隊列不為空,就去處理相關的事件
    
if (ngx_posted_events) {
        
if (ngx_threaded) {
            ngx_wakeup_worker_thread(cycle);

        } 
else {
            ngx_event_process_posted(cycle, 
&ngx_posted_events);
        }
    }

上面的代碼中,ngx_accept_disabled變量是在函數(shù)ngx_event_accept中被賦值的:
        ngx_accept_disabled = ngx_cycle->connection_n / 8
                              
- ngx_cycle->free_connection_n;
簡單的理解,當前已經(jīng)接收的連接(connection_n)越多,可用的空閑連接(free_connection_n)越少,這個值越大。

所以呢,假如某個子進程,當前已經(jīng)接收了一定數(shù)量的連接,那么這個計數(shù)值就會相應的大,也就是說,這個子進程將會暫緩(注意,不是暫停)接收新的連接,而去專注于處理當前已經(jīng)接收的連接;反之,如果某子進程當前處理的連接數(shù)量少,那么這個計數(shù)就會相應的小,于是這個較為空閑的子進程就會更多的接收新的連接請求。這個策略,確保了各個worker子進程之間負載是相對均衡的,不會出現(xiàn)某些子進程接收的連接特別多,某些又特別少。

同樣的,在這段代碼中,看到了即使現(xiàn)在子進程可以接收新的連接,也需要去競爭以獲取accept鎖,只有獲得了這個鎖才能接收新的連接,所以避免了前面提到的驚群現(xiàn)象的發(fā)生。

另外,在linux的新版內核中,加入了一個所謂的"cpu affinity"的特性,利用這個特性,你可以指定哪些進程只能運行在哪些CPU上面,我對這個不太熟悉,查看了一些資料,提到的說法是,有了這個特性,比如進程A在CPU1上面運行,那么在CPU1上面會cache一些與該進程相關的數(shù)據(jù),那么再次調用的時候性能方面就會高效一些,反之,如果頻繁的切換到不同的CPU上面去運行,那么之前在別的CPU上面的cache就會失效。

Nginx里面針對Linux內核的這個特性做了一些優(yōu)化,它也可以在配置文件中指定哪些子進程可以運行在哪些CPU上面,這個優(yōu)化與配置選項worker_cpu_affinity有關。可以在 http://wiki.nginx.org/NginxCoreModule 找到關于這個配置相關的信息。


posted on 2009-12-08 21:48 那誰 閱讀(7509) 評論(7)  編輯 收藏 引用 所屬分類: 服務器設計Nginx

評論

# re: Nginx0.7.61代碼分析(二)--worker子進程之間的負載均衡  回復  更多評論   

很好,不錯,
沒研究過nginx, 根據(jù)你的描述有兩個問題問一下
1. 主進程listen, listen_fd 可讀了,通知子進程,或者子進程自己能檢測到
如果子進程正在處理事件呢?好,就算全都是非阻塞的,那么循環(huán)很快轉
回來,處理accept或檢查listen_fd是否可讀,那這樣就不算是事件驅動
了,每次都是自己主動是檢測?
2. 如果子進程沒有事件怎么樣?會不會空轉? 睡眠機制是什么?
2009-12-09 11:45 | cui

# re: Nginx0.7.61代碼分析(二)--worker子進程之間的負載均衡  回復  更多評論   

你的http://code.google.com/p/commoncache/wiki/demo這個工程,代碼高亮是怎么弄的呀???
2009-12-09 21:41 | hlysh

# re: Nginx0.7.61代碼分析(二)--worker子進程之間的負載均衡  回復  更多評論   

http://code.google.com/p/commoncache/wiki/demo
2009-12-09 21:41 | hlysh

# re: Nginx0.7.61代碼分析(二)--worker子進程之間的負載均衡  回復  更多評論   

@cui
1)父進程不用通知子進程,因為子進程是繼承了從父進程里創(chuàng)建的監(jiān)聽socket
2)沒有事件的時候子進程將會阻塞在select/poll操作上。
2009-12-09 23:14 | 那誰

# re: Nginx0.7.61代碼分析(二)--worker子進程之間的負載均衡  回復  更多評論   

@hlysh
http://code.google.com/p/support/wiki/WikiSyntax#Code
2009-12-09 23:15 | 那誰

# re: Nginx0.7.61代碼分析(二)--worker子進程之間的負載均衡  回復  更多評論   

看了下代碼,所有的work子進程都可以accept 父進程創(chuàng)建的listenning socket?
很少見過這樣的用法阿
wirelesser[at]hotmail.com
2010-04-13 17:51 | ww

# re: Nginx0.7.61代碼分析(二)--worker子進程之間的負載均衡[未登錄]  回復  更多評論   

http://simohayha.javaeye.com/說得好
2010-07-22 16:08 | 111
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美国产亚洲视频| 久久久精品国产99久久精品芒果| 亚洲欧美日韩精品久久| 亚洲国产精品欧美一二99| 欧美一激情一区二区三区| 亚洲一区二区精品在线观看| 久久综合九色九九| 亚洲成色www8888| 久久免费少妇高潮久久精品99| 久久综合九色综合欧美狠狠| 久久久久久久久伊人| 美女视频一区免费观看| 亚洲人成高清| 国产精品成人国产乱一区| 亚洲欧美一区二区激情| 欧美一区二区日韩一区二区| 久久久7777| 亚洲免费在线观看视频| 亚洲美女少妇无套啪啪呻吟| 国内揄拍国内精品少妇国语| 亚洲高清av| 亚洲综合色网站| 久久青草久久| 亚洲美女视频网| 欧美亚洲日本一区| 欧美激情中文字幕乱码免费| 国产精品99久久久久久久久| 久久av资源网站| 久久久视频精品| 亚洲欧美日韩一区二区在线 | 蜜臀av在线播放一区二区三区| 伊人激情综合| 一本久道综合久久精品| 久久黄色小说| 亚洲精品人人| 亚洲欧美视频一区| 亚洲国产高清aⅴ视频| 久久精品一区二区三区不卡牛牛| 美女主播精品视频一二三四| 欧美日韩免费观看一区三区| 一区二区在线看| 欧美日韩亚洲综合在线| 亚洲国产高清aⅴ视频| 欧美综合激情网| 一本色道久久综合亚洲二区三区| 欧美成人有码| 亚洲欧美日韩天堂| 欧美视频久久| 91久久综合| 农村妇女精品| 欧美在现视频| 亚洲精品一区二区三区av| 亚洲娇小video精品| 欧美一区二区私人影院日本 | 欧美吻胸吃奶大尺度电影| 在线不卡中文字幕播放| 久久久久国产精品一区二区| 亚洲影院在线观看| 欧美成人视屏| 久久视频精品在线| 精品999在线观看| 香蕉久久国产| 国产一区二区三区网站| 欧美日韩国产影院| 亚洲免费观看高清完整版在线观看熊 | 亚洲欧美日本日韩| 欧美中文在线免费| 国产精品免费一区豆花| 一本综合精品| 日韩午夜视频在线观看| 欧美日韩视频一区二区| 亚洲一区二区伦理| 亚洲影院色在线观看免费| 亚洲天堂黄色| 国产日韩一级二级三级| 久久久精品国产免大香伊| 午夜一区二区三视频在线观看| 亚洲欧美日韩中文播放| 国产亚洲精品一区二555| 尤物网精品视频| 欧美jizz19hd性欧美| 免费美女久久99| 一区二区三区四区五区在线| 在线亚洲一区二区| 国产亚洲精品激情久久| 久久久久久久999精品视频| 亚洲免费一区二区| 精品二区久久| 亚洲精品欧美精品| 国产精品亚洲成人| 欧美ed2k| 午夜精品亚洲| 亚洲国产精品嫩草影院| 欧美在线综合视频| 亚洲国产一区二区三区在线播| 欧美怡红院视频| 欧美不卡激情三级在线观看| 亚洲国产成人精品女人久久久 | 日韩视频在线你懂得| 午夜精品一区二区三区电影天堂| 欧美成年视频| 一区二区三区视频观看| 欧美激情亚洲激情| 国产精品99免费看 | 久久福利电影| 免费看精品久久片| 欧美一区观看| 欧美国产日本高清在线| 久久精品人人爽| 亚洲欧美国产视频| 日韩视频免费观看高清完整版| 亚洲一区视频在线| 欧美精品午夜| 在线观看久久av| 一本色道久久88综合亚洲精品ⅰ | 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美国产日本| 亚洲精品极品| 欧美专区日韩专区| 欧美体内she精视频在线观看| 亚洲三级免费观看| 欧美一区二区三区四区在线| 午夜精品三级视频福利| 欧美三级精品| 欧美深夜福利| 午夜一级久久| 欧美日韩国产bt| 亚洲国产一区二区三区青草影视| 久久国产日韩| 精东粉嫩av免费一区二区三区| 亚洲视频图片小说| 欧美高清视频一区| 国产揄拍国内精品对白| 在线视频中文亚洲| 亚洲一区二区欧美日韩| 欧美日本在线| 一本大道久久精品懂色aⅴ| 亚洲免费福利视频| 美日韩丰满少妇在线观看| 国产日本欧洲亚洲| 亚洲欧美日韩综合| 久久激情视频免费观看| 国产欧美亚洲视频| 欧美伊人久久久久久午夜久久久久 | 国产一区视频在线观看免费| 日韩视频二区| avtt综合网| 欧美视频精品在线观看| 亚洲午夜av在线| 久久国产精品久久久久久久久久| 久久男人资源视频| 日韩一级精品| 欧美日韩视频第一区| 老司机一区二区| 亚洲韩国一区二区三区| 欧美全黄视频| 亚洲午夜羞羞片| 久久久999精品| 亚洲欧洲日韩女同| 麻豆精品在线视频| 亚洲激情一区| 国产精品久久久久aaaa樱花| 午夜免费在线观看精品视频| 久久久国产精品一区二区三区| 欧美尤物巨大精品爽| 免费久久精品视频| 狠色狠色综合久久| 美女成人午夜| 一本在线高清不卡dvd| 欧美亚洲一区在线| 一区二区在线观看视频| 欧美日韩午夜在线视频| 久久国产精品亚洲va麻豆| 日韩网站在线| 国产日韩欧美一区二区三区四区| 亚洲国产精品精华液网站| 国产日本欧美在线观看| 免播放器亚洲一区| 免费成人高清| 国产精品午夜电影| 麻豆精品一区二区综合av | 亚洲欧美成人一区二区在线电影| 久久夜色精品国产亚洲aⅴ| 亚洲国产精品va在线看黑人动漫| 国产美女一区二区| 美女日韩在线中文字幕| 久久精品日产第一区二区三区| 亚洲欧美日韩区| 在线观看欧美黄色| 国产精品亚洲产品| 亚洲一区二区三区乱码aⅴ| 老司机精品视频网站| 国产区精品在线观看| 欧美激情视频在线免费观看 欧美视频免费一 | 欧美aⅴ99久久黑人专区| 国产一区二区三区不卡在线观看| 在线性视频日韩欧美| 欧美激情日韩| 国产日韩欧美91| 国产精品hd|