共有メモリを使用することでnginxの

トラフィックの統計情報と同様のプロセスモデルnginxの、において、制御、データの共有を流れ、他のタスクの完了とともに、複数のワーカープロセスを必要とする、共有メモリは、重要なプロセス通信プログラムです。この記事では、ngx_shmemとngx_slab使用と注意事項などnginxの共有メモリ機能に関連付けられたコードを記載したが、ngx_slabに実装メモリ管理アルゴリズムが含まれていません。

ngx_shmem使用

ngx_shmem.c / Hファイルのみ()/と、munmap()システムやたshmget()/にshmdt(MMAPの呼び出し)は、単純なパッケージです。スタイルライブラリを達成するために、NGXの基礎、あなたが適用され、連続した共有メモリ領域を解放することができます。通常、共有データを使用して固定長、データ長が伸びずに使用中に固定されています。

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プロセスで使用され、プロセスは、一般的に、マスターによって作成され、ワー​​カープロセスは、継承の方法によりメモリポインタを取得します。

(受け入れ/読み取り/書き込み...)各記録状態のために、要求の数、及びngx_event_moduleをngx_shmemについて用い、ngx_event_module_init(部分断片)を参照し、共有メモリ内の変数のコード番号の一部を作成しますいくつかの重要なイベントの入り口統計演算は、これらの変数の数を加算および減算します。すべてのワーカープロセスの要求統計の現在の状態を達成するために。

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);

この機能の詳細については、次のコードngx_http_stub_status_module関連コードNGX_STAT_STUBマクロ定義を表示することができます。

ngx_slab使用

ngx_shmem層は、ミニマリストのパッケージで、基本的な機能は、メモリを共有しました。しかし、我々のプログラムではなく、固定サイズの共有データ構造のシーンのほとんどが、よりngx_arrayように、ngx_list、ngx_queue、ngx_rbtreeは、これらのデータ構造のサイズを変更することができます。

我々は、動的に空き領域のメモリプールの申請ngx_pool_tとして持っていることを期待しています。ngx_slabは、構造、原理とのmallocのシステム()知人が一連のアルゴリズムを介してアプリケーションとメモリ・セグメントの解放のセクションで達成したです。しかしngx_slab操作対象はngx_shmem共有メモリに基づいています。

ngx_slabインターフェースを見てください

typedef struct {
    ngx_shmtx_t       mutex;
    ...
    void             *data; /* 一般存放从pool中申请获得的根数据地址(pool中第一个申请的数据接口) */
    void             *addr; /* 使用ngx_shmem申请获得的共享内存基地址 */
} 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);

あなたがALLOCとのcalloc差は、メモリ・セグメントかどうかをアプリケーションがクリアされていることにある、インターフェースが複雑ではありません見ることができ、プールインタフェースは、すでにロックを獲得_locked操作の終了を表します。同時シーンのプールにアクセス同時に複数のプロセスを同期させるためngx_shmtx_tミューテックスを持ってngx_slab_pool_t構造では。最初のロックを取得して、スペースを申請し、最終的にロックを解除します)(ngx_slab_alloc注意してください。ngx_slab_alloc_locked()を直接プログラムは、他のロジックでロックを取得したと仮定し、空間に適用されます。

Ngx_shmemは、一般的に初期化プロセスを実行する必要がありnginxの開発に使用します。

  • モジュールは、()インターフェース、共有メモリ構成の解析のための登録をngx_shared_memory_add呼び出します。これは、共有メモリサイズとメモリの初期化コールバック関数を提供しています。
  • 初期化関数フレームngx_init_cycle()ngx_shmemメモリに使用され、ngx_slabを初期化し、その後、登録されたコールバックモジュール
  • インタフェースかどうかモジュールngx_slabアプリケーション/

このプロセスにおいて、ngx_shm_zone_t対応ngx_shared_memory_add()インターフェース構造を含みます。

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);

これは、リロードプロセスnginxのは、共有メモリに再適用するかどうかを制御するNOREUSEプロパティを言及する価値があります。

()長いngx_init_cycle機能するので、このプロセスは、/ *共有メモリを作成* /このコメントまたはサイクル - を見つけることができます>このオブジェクトコードを表示SHARED_MEMORY。

ngx_slab使用の詳細については、それが参照ngx_http_limit_conn_module推奨され、これは共有メモリモジュール接続限界を介して達成され、端部でモジュールの複雑さは、それが良い参考例です。

参考資料

時間のオタクで著者タオホイ「nginxのの深い理解」の波が、618は最近の活動を割り引いているようだ「nginxのは、コアの知識が100の言う」公表アムウェイ同じ時間は、私も今、背中の一部を取得します、リンクの私の分け前を通じて購入する、ありがとうサポート。

おすすめ

転載: www.cnblogs.com/atskyline/p/11029068.html