转:Nginx源码剖析之内存池,与内存管理(3)

全文总结

    来自淘宝数据共享平台blog内的一篇文章对上述Nginx源码剖析之内存池,与内存管理总结得很好,特此引用之,作为对上文全文的一个总结:

    Nginx的内存池实现得很精巧,代码也很简洁。总的来说,所有的内存池基本都一个宗旨:申请大块内存,避免“细水长流”。
3.1、创建一个内存池
    nginx内存池主要有下面两个结构来维护,他们分别维护了内存池的头部和数据部。此处数据部就是供用户分配小块内存的地方。


    //该结构用来维护内存池的数据块,供用户分配之用。  
    typedef struct {  
        u_char *last; //当前内存分配结束位置,即下一段可分配内存的起始位置  
        u_char *end; //内存池结束位置  
        ngx_pool_t *next; //链接到下一个内存池  
        ngx_uint_t failed; //统计该内存池不能满足分配请求的次数  
    } ngx_pool_data_t;  
    //该结构维护整个内存池的头部信息。  
    struct ngx_pool_s {  
        ngx_pool_data_t d; //数据块  
        size_t max;  //数据块的大小,即小块内存的最大值  
        ngx_pool_t *current;    //保存当前内存池  
        ngx_chain_t *chain; //可以挂一个chain结构  
        ngx_pool_large_t *large;    //分配大块内存用,即超过max的内存请求  
        ngx_pool_cleanup_t *cleanup;    //挂载一些内存池释放的时候,同时释放的资源。 
        ngx_log_t *log;  
    }; 
有了上面的两个结构,就可以创建一个内存池了,nginx用来创建一个内存池的接口是:

    ngx_pool_t *ngx_create_pool(size_t size, ngx_log_t *log)(位于src/core/ngx_palloc.c中);

调用这个函数就可以创建一个大小为size的内存池了。

   

阅读剩余部分...

转:Nginx源码剖析之内存池,与内存管理(2)

Nginx源码剖析之内存管理


2、内存池操作


2.1、创建内存池


ngx_pool_t *
ngx_create_pool(size_t size, ngx_log_t *log)
{
    ngx_pool_t  *p;
    
    p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log);
    //ngx_memalign()函数执行内存分配,该函数的实现在src/os/unix/ngx_alloc.c文件中(假定NGX_HAVE_POSIX_MEMALIGN被定义):
    
    if (p == NULL) {
        return NULL;
    }
    
    p->d.last = (u_char *) p + sizeof(ngx_pool_t);
    p->d.end = (u_char *) p + size;
    p->d.next = NULL;
    p->d.failed = 0;
    
    size = size - sizeof(ngx_pool_t);
    p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL;
    //最大不超过4095B,别忘了上面NGX_MAX_ALLOC_FROM_POOL的定义
    
    p->current = p;
    p->chain = NULL;
    p->large = NULL;
    p->cleanup = NULL;
    p->log = log;
    
    return p;
}
例如,调用ngx_create_pool(1024, 0x80d1c4c)后,创建的内存池物理结构如下图:

3.jpg3.jpg

紧接着,咱们就来分析下上面代码中所提到的:ngx_memalign()函数。

阅读剩余部分...

转:Nginx源码剖析之内存池,与内存管理(1)

作者:July、dreamice、阿波、yixiao。
出处:http://blog.csdn.net/v_JULY_v/

引言    


    Nginx(发音同 engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引擎Rambler(俄文:Рамблер)使用。  


    其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,目前中国大陆使用nginx网站用户有:新浪、网易、 腾讯,另外知名的微网志Plurk也使用nginx,以及诸多暂不曾得知的玩意儿。

    读者可以到此处下载Nginx最新版本的源码:http://nginx.org/en/download.html。同时,本文本不想给源码太多注释,因为这不像讲解算法,算法讲解的越通俗易懂越好,而源码剖析则不同,缘由在于不同的读者对同一份源码有着不同的理解,或深或浅,所以,更多的是靠读者自己去思考与领悟。

    ok,本文之中有任何疏漏或不正之处,恳请批评指正。谢谢。


Nginx源码剖析之内存池


1、内存池结构


    内存相关的操作主要在文件 os/unix/ngx_alloc.{h,c} 和 core/ngx_palloc.{h,c} 中实现,ok,咱们先来看内存管理中几个主要的数据结构:
typedef struct {    //内存池的数据结构模块
    u_char               *last;    //当前内存分配结束位置,即下一段可分配内存的起始位置
    u_char               *end;     //内存池的结束位置
    ngx_pool_t           *next;    //链接到下一个内存池,内存池的很多块内存就是通过该指针连成链表的
    ngx_uint_t            failed;  //记录内存分配不能满足需求的失败次数
} ngx_pool_data_t;   //结构用来维护内存池的数据块,供用户分配之用。

struct ngx_pool_s {  //内存池的管理分配模块
    ngx_pool_data_t       d;         //内存池的数据块(上面已有描述),设为d
    size_t                max;       //数据块大小,小块内存的最大值
    ngx_pool_t           *current;   //指向当前或本内存池
    ngx_chain_t          *chain;     //该指针挂接一个ngx_chain_t结构
    ngx_pool_large_t     *large;     //指向大块内存分配,nginx中,大块内存分配直接采用标准系统接口malloc
    ngx_pool_cleanup_t   *cleanup;   //析构函数,挂载内存释放时需要清理资源的一些必要操作
    ngx_log_t            *log;       //内存分配相关的日志记录
};

再来看看大块数据分配的结构体:
struct ngx_pool_large_s {
    ngx_pool_large_t     *next;
    void                 *alloc;
};

#define NGX_MAX_ALLOC_FROM_POOL (ngx_pagesize - 1)  //在x86体系结构下,该值一般为4096B,即4K

上述这些数据结构的逻辑结构图如下:

阅读剩余部分...

推荐OpenResty — Nginx全能插件版

官网: http://openresty.org/
虽然是中国人做的,但没几个汉字.....

我用Nginx,是这样一个过程:
1. 系统rpm中的nginx,能让其跑起来
2. 玩配置文件
3. 玩编译选项
4. 写插件,集成第三方插件

OpenResty , 是淘宝一位大牛(agentzh)集成的包含N多好插件的Nginx捆绑源码包,这位仁兄自称Nginx最活跃的第三方模块开发人员哦

下面,当然要列一下到底集成了什么模块:

LuaJIT -- 极速版Lua实现
ArrayVarNginxModule -- 数组类型的Nginx变量
AuthRequestNginxModule -- 鉴权,想象一下以C代码的速度判断一个请求是否合法,是不是很有快感呢?!
DrizzleNginxModule -- -MySQL桥,非阻塞的哦,我又爱又恨的一个模块,值得注意的是,其响应是RDS流
EchoNginxModule -- 以非常直观的方式在Nginx配置文件中编写简单的处理逻辑,源码包含大量注释,绝对是入门好例子!!
EncryptedSessionNginxModule -- 加密会话
FormInputNginxModule -- 解析post请求中的参数,这下子,简单请求根本不需要PHP/Java来处理啦
HeadersMoreNginxModule -- Nginx默认的header模块只能添加或忽略,这个给你CRUD全套的!!
IconvNginxModule -- 编码转换,不多说,也不懂
StandardLuaInterpreter -- 与Lua官方实现所匹配,一般用不上,因为我们用LuaJIT!!
MemcNginxModule -- 与Memcached的绝配,谁用谁知道!! 与upstram_keepalive一起用,你能更High!!
Nginx
NginxDevelKit -- N多第三方插件都依赖的东西,不知道为啥
LuaCjsonLibrary -- Lua版的Json处理库实在太慢,这个才叫速度!!
LuaNginxModule -- 我的最爱,一般逻辑,完全没必要用Java/PHP啦
LuaRdsParserLibrary -- 在Lua中直接处理RDS流,速度杠杠的!
LuaRedisParserLibrary -- 在Lua中处理Redia模块的响应,暂时我还没用上
PostgresNginxModule -- Nginx-Postgres桥,输出的也是RDS流
RdsCsvNginxModule -- RDS流转CVS格式,不知道能干啥,报表?
RdsJsonNginxModule -- RDS流转JSON字符串,之前经常用这个
Redis2NginxModule -- Nginx-Redis2桥
SetMiscNginxModule -- 提供很多很实用的方法,例如base64编解码,URL编解码,SQL防注入等等
SrcacheNginxModule -- 缓存模块,据说跟Memc模块一起用比较爽
UpstreamKeepaliveNginxModule -- 与Memc模块的标配,号称性能提升几倍呢
XssNginxModule -- 防跨站攻击的

OpenResty的最大的好处是帮你弄清楚各个模块的编译顺序,别小看,学问大大的呢

当初没有这东西,单单弄清楚模块间的编译顺序就耗费不少时间

来吧,试试这个国产的精品!!

refer:http://wendal.net/338.html

windows下手动配置nginx0.8.53+php 5.3.3

   这两天,看到有不少人讨论 ,其实这个东西也不算新鲜事了,三年前国内就已经有人关注了。国内最早关注的,我知道的应该算张宴吧,这位朋友和我同一年的,只是相比之下,我是逊色不少了。他写了不少在lunix下配置nginx的原创文章,可谓是在中国推动nginx的第一人吧。感兴趣的话可以看这里。》。
  看看维基上对它的介绍吧。
  
      Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器 。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的Rambler.ru 站点开发的,它已经在该站点运行超过四年多了。Igor 将源代码以类BSD许可证的形式发布。自Nginx 发布四年来,Nginx 已经因为它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名了。目前国内各大门户网站已经部署了Nginx,如新浪、网易、腾讯等;国内几个重要的视频分享网站也部署了Nginx,如六房间、酷6等。新近发现Nginx 技术在国内日趋火热,越来越多的网站开始部署Nginx。

因为 Nginx 的文档大部分是俄文的,本维基的目的是帮助使用中文世界的用户安装、配置和交换有关 Nginx 的使用经验。大部分文档源自(al-nginx AT none.at,Aleksandar Lazic) 的工作,有关本维基本身的问题请直接询问Cliff Wells[1] ,其他翻译请点击


      也有不少人对win下的nginx做了研究,我比较熟悉的有两位,一位是pinyShop的作者,也是PPC上的火跃会员,这里是他的主页http://dev.meettea.com。一位是CYDPHP的作者,陈毓端。这是他的主页:http://www.woyuw.com/
     都说nginx在LUNIX下十倍于apache,也都说在win下,nginx表现就不怎么了。今天就青紫动手搭建了个环境体验下。也花费了好几个小时,参考了上面两位的代码,终于算是搭好了。发现网上的资料,确实如我所说,参差不齐,看来百度在关键时刻还是帮不了我们的。还是要自己动手或者找师傅。。。
     搭建步骤:(1)安装PHP5.3.3。这个没什么好讲的,直接解压即可。php.ini也并非如网上所说要做什么设置。PHP.INI实际上不用做任何修改。比如说安装到e:/php533/目录下。建立d:\doc\目录用于存放代码。
                 (2)下载nginx最新版0.8.53的windows版本,下载地址http://nginx.org/en/download.html。解压到e:/nginx目录下。

阅读剩余部分...

    Page :
  1. 1