最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

nginx中共享內(nèi)存的使用詳解

 更新時間:2019年06月16日 08:30:21   作者:atskyline  
這篇文章主要介紹了nginx中共享內(nèi)存的使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

在nginx的進(jìn)程模型下,類似流量統(tǒng)計、流量控制、數(shù)據(jù)共享、等需要多個工作進(jìn)程共同配合完成任務(wù),共享內(nèi)存是一個重要的進(jìn)程通訊的方案。本文介紹在nginx的代碼中與共享內(nèi)存相關(guān)的功能,包括ngx_shmem與ngx_slab的使用與注意事項(xiàng),但不包括ngx_slab中實(shí)現(xiàn)的內(nèi)存管理算法。

ngx_shmem的使用

ngx_shmem.c/h文件只是對mmap()/munmap()系統(tǒng)調(diào)用或者shmget()/shmdt()的一個很簡單的封裝。實(shí)現(xiàn)了ngx風(fēng)格的基礎(chǔ)庫,可以申請和釋放一段連續(xù)的共享內(nèi)存空間。一般用于固定長度的共享數(shù)據(jù)使用,使用過程中數(shù)據(jù)長度固定不會伸縮。

typedef struct {
  u_char   *addr;
  size_t    size;
  ...
} ngx_shm_t;
ngx_int_t ngx_shm_alloc(ngx_shm_t *shm);
void ngx_shm_free(ngx_shm_t *shm);

在ngxin中共享內(nèi)存的使用流程,一般是由master進(jìn)程創(chuàng)建,worker進(jìn)程通過繼承的方式獲得內(nèi)存指針。

關(guān)于ngx_shmem的使用,可以參考ngx_event_module_init()中部分片段,這部分代碼在共享內(nèi)存中創(chuàng)建了若干個變量,用于記錄各個狀態(tài)(accepted/reading/writing...)的請求數(shù)量,并在ngx_event_module中的幾個關(guān)鍵事件入口對這幾個變量進(jìn)行加減統(tǒng)計操作。實(shí)現(xiàn)統(tǒng)計所有worker進(jìn)程當(dāng)前的請求狀態(tài)。

shm.size = size;
ngx_str_set(&shm.name, "nginx_shared_zone");
shm.log = cycle->log;

if (ngx_shm_alloc(&shm) != NGX_OK) {
  return NGX_ERROR;
}

shared = shm.addr;
...
ngx_stat_accepted = (ngx_atomic_t *) (shared + 3 * cl);
ngx_stat_handled = (ngx_atomic_t *) (shared + 4 * cl);
ngx_stat_requests = (ngx_atomic_t *) (shared + 5 * cl);
ngx_stat_active = (ngx_atomic_t *) (shared + 6 * cl);
ngx_stat_reading = (ngx_atomic_t *) (shared + 7 * cl);
ngx_stat_writing = (ngx_atomic_t *) (shared + 8 * cl);
ngx_stat_waiting = (ngx_atomic_t *) (shared + 9 * cl);

關(guān)于這個功能的更多細(xì)節(jié),可以查看代碼中的NGX_STAT_STUB宏定義相關(guān)代碼與ngx_http_stub_status_module。

ngx_slab的使用

ngx_shmem是一層極簡的封裝,實(shí)現(xiàn)了共享內(nèi)存的基本功能。但我們程序中大部分的場景共享數(shù)據(jù)并不會一個固定大小的結(jié)構(gòu),而更多是像ngx_array、ngx_list、ngx_queue、ngx_rbtree這類大小可以變化的數(shù)據(jù)結(jié)構(gòu)。

我們期望能有像ngx_pool_t一樣可以動態(tài)申請釋放空間一個內(nèi)存池。ngx_slab正是一個這樣的結(jié)構(gòu)體,原理上與系統(tǒng)的malloc()有相識之處都是通過一系列算法實(shí)現(xiàn)對一段段內(nèi)存片段的申請與釋放。只不過ngx_slab操作的對象是基于ngx_shmem的共享內(nèi)存。

先看一下ngx_slab的接口

typedef struct {
  ngx_shmtx_t    mutex;
  ...
  void       *data; /* 一般存放從pool中申請獲得的根數(shù)據(jù)地址(pool中第一個申請的數(shù)據(jù)接口) */
  void       *addr; /* 使用ngx_shmem申請獲得的共享內(nèi)存基地址 */
} ngx_slab_pool_t;

void ngx_slab_init(ngx_slab_pool_t *pool);
void *ngx_slab_alloc(ngx_slab_pool_t *pool, size_t size);
void *ngx_slab_alloc_locked(ngx_slab_pool_t *pool, size_t size);
void *ngx_slab_calloc(ngx_slab_pool_t *pool, size_t size);
void *ngx_slab_calloc_locked(ngx_slab_pool_t *pool, size_t size);
void ngx_slab_free(ngx_slab_pool_t *pool, void *p);
void ngx_slab_free_locked(ngx_slab_pool_t *pool, void *p);

可以看到接口并不復(fù)雜,alloc與calloc的區(qū)別在于是否對申請獲得的內(nèi)存段清零,_locked結(jié)尾的接口表示操作的pool已經(jīng)是獲取到鎖的。在ngx_slab_pool_t的結(jié)構(gòu)體有一個ngx_shmtx_t的互斥鎖用于同步多進(jìn)程同時訪問pool的并發(fā)場景。注意ngx_slab_alloc()會先獲取鎖、然后申請空間、最后釋放鎖。而ngx_slab_alloc_locked()則直接申請空間,認(rèn)為程序已經(jīng)在其他邏輯中獲得鎖了。

在nginx的開發(fā)中使用ngx_shmem一般需要遵循以下初始化流程:

  • 模塊在配置解析過程中調(diào)用ngx_shared_memory_add()接口,注冊一段共享內(nèi)存。提供共享內(nèi)存大小與內(nèi)存初始化的回調(diào)函數(shù)。
  • 框架在ngx_init_cycle()中使用ngx_shmem申請內(nèi)存,并初始化ngx_slab,然后回調(diào)模塊注冊的初始化函數(shù)
  • 模塊使用ngx_slab的申請/是否接口

在這個流程中,涉及到ngx_shared_memory_add()接口與對應(yīng)的ngx_shm_zone_t結(jié)構(gòu)體。

struct ngx_shm_zone_s {
  void           *data;
  ngx_shm_t         shm;
  ngx_shm_zone_init_pt   init;
  void           *tag;
  void           *sync;
  ngx_uint_t        noreuse; /* unsigned noreuse:1; */
};
ngx_shm_zone_t *ngx_shared_memory_add(ngx_conf_t *cf, ngx_str_t *name,
  size_t size, void *tag);

其中值得一提的是noreuse屬性,這個屬性控制了在nginx的reload過程中是否會重新申請共享內(nèi)存。

由于關(guān)于ngx_init_cycle()函數(shù)較長,這個流程可以通過查找/* create shared memory */這個注釋或者cycle->shared_memory這個對象查看相關(guān)代碼。

關(guān)于ngx_slab更多細(xì)節(jié)的使用,建議可以參考ngx_http_limit_conn_module,這是通過共享內(nèi)存實(shí)現(xiàn)連接數(shù)限制的模塊,模塊復(fù)雜度底,是一個很好的參考范例。

 參考資料

深入理解Nginx(第2版) https://book.douban.com/subject/26745255/

ngx_http_limit_conn_module http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Nginx 安裝筆記(含PHP支持、虛擬主機(jī)、反向代理負(fù)載均衡)

    Nginx 安裝筆記(含PHP支持、虛擬主機(jī)、反向代理負(fù)載均衡)

    Nginx安裝簡記(含PHP支持、虛擬主機(jī)、反向代理負(fù)載均衡) Nginx,據(jù)說高性能和穩(wěn)定性比Apache還牛,并發(fā)連接處理能力強(qiáng),低系統(tǒng)資源消耗。目前已有250多萬web站點(diǎn)在使用
    2009-10-10
  • nginx重寫rewrite基礎(chǔ)及實(shí)例分享

    nginx重寫rewrite基礎(chǔ)及實(shí)例分享

    這篇文章主要介紹了nginx重寫rewrite基礎(chǔ)及實(shí)例分享,需要的朋友可以參考下
    2016-04-04
  • Nginx+Keepalived實(shí)現(xiàn)雙機(jī)熱備

    Nginx+Keepalived實(shí)現(xiàn)雙機(jī)熱備

    這篇文章主要介紹了Nginx+Keepalived實(shí)現(xiàn)雙機(jī)熱備,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • Nginx IP限制與路徑訪問控制配置

    Nginx IP限制與路徑訪問控制配置

    在某些應(yīng)用場景下,特定路徑需要免登錄訪問,本文主要介紹了Nginx IP限制與路徑訪問控制配置,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • nginx 配置特定IP訪問的實(shí)現(xiàn)

    nginx 配置特定IP訪問的實(shí)現(xiàn)

    本文主要介紹了nginx 配置特定IP訪問的實(shí)現(xiàn),通過合理設(shè)置Nginx的配置文件,管理員可以根據(jù)實(shí)際需求,靈活地控制對網(wǎng)站資源的訪問,提高網(wǎng)站的安全性,感興趣的可以了解一下
    2024-01-01
  • Ubuntu下nginx編譯安裝參數(shù)配置

    Ubuntu下nginx編譯安裝參數(shù)配置

    這篇文章主要介紹了Ubuntu下nginx編譯安裝參數(shù)配置,本文總結(jié)了一些依賴庫的安裝以及編碼配置參數(shù),需要的朋友可以參考下
    2015-06-06
  • Nginx 緩存清理的具體實(shí)現(xiàn)

    Nginx 緩存清理的具體實(shí)現(xiàn)

    Nginx通過緩存機(jī)制加速Web服務(wù),并提供高效的響應(yīng)和減少后端服務(wù)器負(fù)載,緩存數(shù)據(jù)需要定期清理以管理磁盤空間和確保數(shù)據(jù)時效性,下面就來介紹一下,感興趣的可以了解一下
    2024-12-12
  • nginx 負(fù)載均衡 多站點(diǎn)共享Session

    nginx 負(fù)載均衡 多站點(diǎn)共享Session

    這里我們就 演練一下 以數(shù)據(jù)庫的形來存儲Session,來實(shí)現(xiàn)多站點(diǎn)共享Session
    2012-11-11
  • 在nginx中設(shè)置三級域名的方法示例

    在nginx中設(shè)置三級域名的方法示例

    這篇文章主要介紹了在nginx中設(shè)置三級域名的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • Nginx+uwsgi+ssl配置https的詳細(xì)步驟

    Nginx+uwsgi+ssl配置https的詳細(xì)步驟

    nginx是一個輕量級的web服務(wù)器,在處理靜態(tài)資源和高并發(fā)有優(yōu)勢,uwsgi是一個基于python的高效率的協(xié)議,處理后端和動態(tài)網(wǎng)頁有優(yōu)勢,我這里使用的是Ubuntu18.04版本,服務(wù)器在阿里云,感興趣的朋友跟隨小編一起看看吧
    2023-10-10

最新評論

海盐县| 太白县| 阜宁县| 大竹县| 屯留县| 阳西县| 锡林郭勒盟| 化德县| 亳州市| 重庆市| 灯塔市| 鸡西市| 静海县| 罗甸县| 神池县| 崇义县| 冕宁县| 阿巴嘎旗| 山丹县| 长乐市| 丰镇市| 临西县| 北京市| 九龙坡区| 沛县| 福州市| 惠来县| 保山市| 孙吴县| 航空| 同德县| 兴宁市| 庆云县| 望都县| 乌海市| 若羌县| 乐业县| 益阳市| 家居| 阜阳市| 南昌市|