码迷,mamicode.com
首页 > 其他好文 > 详细

Nginx系列三 内存池的设计

时间:2014-05-08 00:37:29      阅读:403      评论:0      收藏:0      [点我收藏+]

标签:nginx   内存池   

Nginx的高性能的是用很多细节来保证,epoll下的多路io异步通知,阶段细分化的异步事件驱动,那么在内存管理这一块也是用了很大心血,上一篇我们讲到了slab分配器,我们可以可以看到那是对共享内存的管理的优化。Nginx在进程内也实现了自己的内存池,目的在于减少内存碎片,减少向操作系统的申请次数,减低模块开发难度。Nginx实现的内存池实际上非常简单:

Nginx内存池的管理是分大内存和小内存的,具体说来,Nginx在向系统初始化内存池后,当我们调用ngx_palloc申请小内存后,再调用ngx_free()  内存池是不负责回收的,仅仅在销毁内存池时候一并销毁。

但是我们在ngx_palloc申请大于4KB的内存时候当我们ngx_free()的时候内存池是否则回收的,这一点非常合理和自然,内存池未来提高内存的利用度,需要处理大内存的回收和再利用。

struct ngx_pool_s {
    ngx_pool_data_t       d;
    size_t                max;         //最大分配出去的大小
    ngx_pool_t           *current;
    ngx_chain_t          *chain;
    ngx_pool_large_t     *large;          //本内存池下的大内存域
    ngx_pool_cleanup_t   *cleanup;
    ngx_log_t            *log;
};

struct ngx_pool_large_s {
    ngx_pool_large_t     *next;      //大于4KB的内存管理(可回收再利用)
    void                 *alloc;
};

typedef struct {
    u_char               *last;
    u_char               *end; 
    ngx_pool_t           *next;          //管理内存池
    ngx_uint_t            failed;   //经验值 查找失败大于6次则重新分配
} ngx_pool_data_t;

这三个数据结构构成了基本的内存池的主体.通过ngx_create_pool可以创建一个内存池,通过ngx_palloc可以从内存池中分配指定大小的内存。可以看到是内存池对于内存的管理是区分大内存和小内存的,实际上大于4KB的申请,实际上是最终调用了malloc直接申请,不过后续由Nginx的内存池来管理。

通常每一个请求都有一个这种简单独立的内存池,Nginx为每一个TCP请求分配一个内存池,自然也为每一个HTTP请求分配一个内存池,在连接释放后,销毁内存池,同一归还给操作系统。内存的分配管理消耗系统极少资源。总结一下内存池的好处:最大优点就是把多次向系统申请内存的 操作整合成一次,这大大减少了CPU的资源消耗,同时减少了内存碎片。
参考资料:《深入理解Nginx》  陶辉   

                  《深入剖析Nginx》 高凯群

                  Nginx开发从入门到精通

Nginx系列三 内存池的设计,布布扣,bubuko.com

Nginx系列三 内存池的设计

标签:nginx   内存池   

原文地址:http://blog.csdn.net/qq112928/article/details/25218423

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!