1. <tr id="33chb"><label id="33chb"></label></tr>
  2. <pre id="33chb"></pre>
    當前位置:首頁 > 短網址資訊 > 正文內容

    深入剖析nginx時間緩存

    本文適合對nginx實現原理比較感興趣的同學閱讀,需要具備一定的服務端編程知識。

    一、背景

    在服務器開發領域,時間的準確度關系到系統能否正常運行,尤其是當系統中存在超時事件需要處理時。但是系統時間的獲取需要一次昂貴的系統調用,作為一款成熟的服務器軟件,Nginx是如何優化這部分的性能開銷?

    二、時間緩存

    接觸過系統設計的同學都知道,對于頻繁的數據獲取,在數據未變化的情形下,可以通過增加緩存來優化性能,因為緩存的訪問速度遠高于源數據的訪問速度。這樣的例子有很多,比如CPU設計有二級緩存,在傳統的database基礎上有了我們今天的redis、memcache等nosql。對于系統時間也一樣,既然獲取系統時間開銷較大,可以嘗試著將獲取到的時間緩存起來,需要時直接從緩存中取就可以了。但與此同時,也引入了緩存時間與實際時間不一致的可能,下面看看Nginx是如何解決這一問題。

    三、設計與實現

    Nginx時間緩存設計

    如上圖所示,Nginx時間緩存包括時間讀取和時間寫入者,當需要更新時間時,nginx調用gettimeofday系統調用獲取時間,然后更新緩存。需要獲取時間的代碼直接從time cache中取出即可。

    這里又產生了新的問題,具體包括:

    • 讀寫并發,即讀和寫同時操作時間緩存會造成獲取的時間混亂。

    • 多寫并發,多個執行體同時更新時間緩存,同樣造成時間混亂。

    而常見的解決互斥的方案包括:

    • 加鎖保證數據串行化

    • 無鎖化設計

    像Nginx這樣對于性能有著極致追求的server來說,自然不會使用系統自帶的鎖機制。其實現的ngx_lock和ngx_unlock的背后都是無鎖化的原子操作。

    1. 對于多寫并發,nginx在ngx_time_update函數中通過全局的ngx_time_lock進行互斥,確保同一時刻只會存在一個執行體更新時間緩存。

    2. 對于讀寫并發,nginx設計了NGX_TIME_SLOTS個slot,用于隔離讀寫操作的時間緩存。同時引入時間緩存指針,原子地更新當前緩存的指向位置。

    Nginx時間緩存實現

    下面看具體實現代碼(以nginx-1.13.1為例src/core/ngx_times.c):

    void ngx_time_update(void)
    {
    ...
    //ngx_time_lock用于互斥,避免同時更新時間
        if (!ngx_trylock(&ngx_time_lock)) {
            return;
        }
    //獲取當前時間
        ngx_gettimeofday(&tv);
        sec = tv.tv_sec;
        msec = tv.tv_usec / 1000;
        ngx_current_msec = (ngx_msec_t) sec * 1000 + msec;
        tp = &cached_time[slot];
    
    //秒值一致則只需要更新當前slot的msec
        if (tp->sec == sec) {
            tp->msec = msec;
            ngx_unlock(&ngx_time_lock);
            return;
        }
    //獲取下一slot
        if (slot == NGX_TIME_SLOTS - 1) {
            slot = 0;
        } else {
            slot++;
        }
        tp = &cached_time[slot];
        tp->sec = sec;
        tp->msec = msec;
        ngx_gmtime(sec, &gmt);
        p0 = &cached_http_time[slot][0];
        (void) ngx_sprintf(p0, "%s, %02d %s %4d %02d:%02d:%02d GMT",
                           week[gmt.ngx_tm_wday], gmt.ngx_tm_mday,
                           months[gmt.ngx_tm_mon - 1], gmt.ngx_tm_year,
                           gmt.ngx_tm_hour, gmt.ngx_tm_min, gmt.ngx_tm_sec);
        ...//類似更新ngx_cached_err_log_time.data等
        ngx_memory_barrier();
    
        ngx_cached_time = tp;
        ngx_cached_http_time.data = p0;
        ngx_cached_err_log_time.data = p1;
        ngx_cached_http_log_time.data = p2;
        ngx_cached_http_log_iso8601.data = p3;
        ngx_cached_syslog_time.data = p4;
    
        ngx_unlock(&ngx_time_lock);
    }

    ngx_time_update的流程圖為: 

    值得一提的是,這里采用了ngx_memory_barrier來避免指令重排,這樣可以盡可能地保證ngx_cached_time、ngx_cached_http_time.data、ngx_cached_err_log_time.data、ngx_cached_http_log_time.data、ngx_cached_http_log_iso8601.data、ngx_cached_syslog_time.data中存儲的時間數據一致。

    slot設計

    上面談到了nginx采用slot來從空間上避免讀寫執行體同時操作時間緩存,slot的設計規則為: 

    • 獲取時間的執行體采用ngx_timeofday獲取了當前ngx_cached_time的快照,隨后讀取對應的slot中數據,包括sec和msec。

    • 更新時間的執行體通過ngx_time_update原子更新ngx_cached_time指向,這樣更新之后的時間讀取就是新的slot中的時間數據。

    這里,nginx利用了修改指針的原子性,確保讀寫不會造成時間數據混亂。而時間數據本身包括sec和msec,無法完成修改的原子性,這種將非原子性修改操作轉換為原子性修改操作的手法,值得借鑒。

    想要獲取最新技術文章?歡迎訂閱微信公眾號----軟件編程之路

    掃描二維碼推送至手機訪問。

    版權聲明:本文由短鏈接發布,如需轉載請注明出處。

    本文鏈接:http://www.virginiabusinesslawupdate.com/article_389.html

    分享給朋友:

    相關文章

    京東年底前將投資泰國,海外擴張野心顯性

    京東年底前將投資泰國,海外擴張野心顯性

    【FT12短網址資訊】據路透社報導,京東方案在今年年底曾經對泰國進行投資,擴展海外業務。京東創始人兼CEO劉強東表示,公司方案以泰國為中心,為越南、馬來西亞等別的東南亞國家提供服務,但并未透露將對泰國投資金額。近期,京東好像在有意加碼東南亞...

    Magic Leap D輪融資估值將達$80億 阿里巴巴或領投

    據Backchannel援引內幕人士消息,一度炒作非常厲害但出現了宣傳門事件之后似乎消無聲息的AR初創企業Magic Leap目前正在進行新一輪的D輪融資,領投方仍然是阿里巴巴,據稱其投后估值將達60到80億美元之間。Backchannel...

    如何用Python從海量文本抽取主題?

    你在工作、學習中是否曾因信息過載叫苦不迭?有一種方法能夠替你讀海量文章,并將不同的主題和對應的關鍵詞抽取出來,讓你談笑間觀其大略。本文使用Python對超過1000條文本做主題抽取,一步步帶你體會非監督機器學習LDA方法的魅力。想不想試試呢...

    信息流廣告崛起自媒體時代互聯網營銷新玩法層出不窮

    信息流廣告崛起自媒體時代互聯網營銷新玩法層出不窮

    目前,信息流廣告已經覆蓋絕大多數網民朋友,信息流廣告基本是基于移動互聯網終端的,最簡單直觀地信息流廣告出現在各大門戶網站的移動APP中,如騰訊新聞、天天快報、今日頭條、百度新聞、網易新聞、搜狐新聞、一點資訊等等移動資訊APP。根據國內知名數...

    消費者變成“智”人,供應鏈要變成“人工”智能

    消費者變成“智”人,供應鏈要變成“人工”智能

    [ ft12短網址導讀 ] 智能供應鏈包含:①智能預測;②智能商品;③智能定價;④智能庫存;⑤科學地分配訂單生產路徑及快遞安排;⑥基于模式識別等技術的風險控制系統,及時預警訂單的風險級別等。圖片來自“123rf.com.cn”【編...

    短網址和二維碼在共享單車掃碼開車上的應用

    如果我問大家現在城市和以前的城市最大的變化是什么,估計大部分人會不假思索的想到共享單車。目前共享單車正以不可阻擋之勢席卷全國,大街上以及城市的每一個角落正在被ofo、摩拜單車、小鳴單車等等所占領。共享單車這項期初并不被看好的項目,正在逐漸改...

    發表評論

    訪客

    ◎歡迎參與討論,請在這里發表您的看法和觀點。
    一本色综合网久久
    1. <tr id="33chb"><label id="33chb"></label></tr>
    2. <pre id="33chb"></pre>