存档

2011年9月 的存档

中秋节

2011年9月13日 3 条评论 3,757 次浏览

中秋节,部门同事一起在中山公园happy,玩得很开心,也吃撑了,O(∩_∩)O~。 贴图三张,留作纪念。 中山公园: 中秋之月: 三盏孔明灯: ... [阅读更多]

分类: 生活点滴 标签:

利用timer_resolution设置减少gettimeofday调用的次数

2011年9月10日 没有评论 6,923 次浏览

请关注最新修正合订:http://lenky.info/ebook/ 这一系列的文章还是在09年写的,存在电脑里很久了,现在贴出来。顺序也不记得了,看到那个就发那个吧,最近都会发上来。欢迎转载,但请保留链接:http://lenky.info/,谢谢。 http://wiki.nginx.org/NginxCoreModule 配置选项:timer_resolution 设置语法:timer_resolution... [阅读更多]

分类: nginx, 源码分析 标签: ,

打开nginx调试

2011年9月10日 没有评论 6,775 次浏览

请关注最新修正合订:http://lenky.info/ebook/ 这一系列的文章还是在09年写的,存在电脑里很久了,现在贴出来。顺序也不记得了,看到那个就发那个吧,最近都会发上来。欢迎转载,但请保留链接:http://lenky.info/,谢谢。 第一:打开debug模式进行编译,简单操作如下: sudo... [阅读更多]

分类: nginx, 源码分析 标签: ,

快速定位指针函数名称

2011年9月10日 2 条评论 3,889 次浏览

请关注最新修正合订:http://lenky.info/ebook/ 这一系列的文章还是在09年写的,存在电脑里很久了,现在贴出来。顺序也不记得了,看到那个就发那个吧,最近都会发上来。欢迎转载,但请保留链接:http://lenky.info/,谢谢。 nginx中应用了大量的指针,函数指针也不例外,到处可见,比如: rev->handler(rev); ls->handler(c); … 这样的回调处理大大增加了我们阅读/理解nginx源码的难度,因为一下子根本就不知道(或者说很难)这个函数指针指向的到底是哪个函数,有没有方便的办法快速知道这个函数指针指向的是哪个函数呢?有,看看下面的实例: 看下ngx_event_accept.c源文件的函数ngx_event_accept(ngx_event_t... [阅读更多]

分类: nginx, 源码分析 标签: ,

模块的统一架构

2011年9月10日 没有评论 2,707 次浏览

请关注最新修正合订:http://lenky.info/ebook/ 这一系列的文章还是在09年写的,存在电脑里很久了,现在贴出来。顺序也不记得了,看到那个就发那个吧,最近都会发上来。欢迎转载,但请保留链接:http://lenky.info/,谢谢。 当我们configure配置nginx后,将在一个名为objs的文件夹里找一个ngx_modules.c源文件,该文件内就包含了我们待编译生成的nginx程序即将包含的模块。 nginx的模块可以简单点分为core、conf、event、http和mail五种类型,这从nginx源码的目录结构也可以依稀看出。 封装nginx模块的结构体为ngx_module_s,定义如下: typedef... [阅读更多]

分类: nginx, 源码分析 标签: ,

nginx的信号管理

2011年9月10日 没有评论 3,101 次浏览

请关注最新修正合订:http://lenky.info/ebook/ 这一系列的文章还是在09年写的,存在电脑里很久了,现在贴出来。顺序也不记得了,看到那个就发那个吧,最近都会发上来。欢迎转载,但请保留链接:http://lenky.info/,谢谢。 Nginx对所有发往其自身的信号进行了统一管理,这部分相关实现代码不多,而且十分清晰易懂,下面来逐步解析。 首先,Nginx对一种信号以及该信号的处理封装了一个对应的名为ngx_signal_t的结构体: typedef... [阅读更多]

分类: nginx, 源码分析 标签: ,

利用gdb调试nginx

2011年9月10日 24 条评论 11,234 次浏览

请关注最新修正合订:http://lenky.info/ebook/ 这一系列的文章还是在09年写的,存在电脑里很久了,现在贴出来。顺序也不记得了,看到那个就发那个吧,最近都会发上来。欢迎转载,但请保留链接:http://lenky.info/,谢谢。 利用gdb调试nginx和利用gdb调试其它程序没有两样,不过nginx可以是daemon程序,也可以以多进程运行,因此利用gdb调试和平常会有些许不一样。当然,我们可以选择将nginx设置为非daemon模式并以单进程运行,而这需做如下设置即可: daemon... [阅读更多]

分类: nginx, 源码分析 标签: ,

获得nginx程序执行流程

2011年9月10日 没有评论 3,418 次浏览

请关注最新修正合订:http://lenky.info/ebook/ 这一系列的文章还是在09年写的,存在电脑里很久了,现在贴出来。顺序也不记得了,看到那个就发那个吧,最近都会发上来。欢迎转载,但请保留链接:http://lenky.info/,谢谢。 nginx函数众多,指针复杂,加上大量函数指针的干扰,要仅靠阅读源代码来理清nginx程序的执行流程难度较大,这一节,我将提供一个获得nginx程序执行流程的快速方法,方便大家阅读源码。 gcc提供了一个名为“-finstrument-functions”编译选项,也许不少人都用过,这个选项有什么作用,我这里就省略暂且不讲,不过它将是这一节的主角,阅读了下面的内容,大家会逐渐了解,如果需要马上知道的,可以google或查阅man手册。 第一: 首先,我们要把这个“-finstrument-functions”选项添加到nginx源码的编译过程里,这可以通过修改Makefile做到。大家肯定知道*nix下编译源代码的三步骤: ./configure make make... [阅读更多]

分类: nginx, 源码分析 标签: ,

IO复用模型的统一

2011年9月10日 没有评论 3,285 次浏览

请关注最新修正合订:http://lenky.info/ebook/ 这一系列的文章还是在09年写的,存在电脑里很久了,现在贴出来。顺序也不记得了,看到那个就发那个吧,最近都会发上来。欢迎转载,但请保留链接:http://lenky.info/,谢谢。 nginx内统一的IO复用模型一共有8种,分别列表如下: select:标准的IO复用模型,几乎所有的类unix系统上都有提供,但性能相对较差。如果在当前系统平台找不到更优的IO复用模型,那么nginx默认编译并使用select复用模型。当然,如果当前系统平台提供有更优的IO复用模型,那么我们也可以通过使用–with-select_module或–without-select_module配置选项来启用或禁用select复用模型模块的编译。 poll:也属于标准的IO复用模型,但理论上比select复用模型要优。同select复用模型类似,可以通过使用–with-poll_module或–without-poll_module配置选项来启用或禁用poll复用模型模块的编译。 kqueue:在系统FreeBSD... [阅读更多]

分类: nginx, 源码分析 标签: ,

nginx的执行模型

2011年9月10日 没有评论 3,811 次浏览

请关注最新修正合订:http://lenky.info/ebook/ 这一系列的文章还是在09年写的,存在电脑里很久了,现在贴出来。顺序也不记得了,看到那个就发那个吧,最近都会发上来。欢迎转载,但请保留链接:http://lenky.info/,谢谢。 Nginx的进程模型和大多数同类服务程序一样,按职责将进程分成监控进程和工作进程两类。在多进程模型下,主进程就充当监控进程,而由主进程fork出来的子进程则充当工作进程;在单进程模型下,主进程就是工作进程,此时没有监控进程。Nginx的单进程模型比较简单,下面主要分析多进程模型。 分析Nginx多进程模型的入口函数为主进程的ngx_master_process_cycle,在该函数做完信号处理设置等之后就会调用一个名为ngx_start_worker_processes的函数用于fork产生出子进程(子进程数目通过函数调用的第二个参数指定),子进程作为一个新的实体开始充当工作进程的角色处理客户端的服务请求;而主进程继续执行ngx_master_process_cycle函数,也就是作为监控进程执行主体for循环,这是一个死循环,直到进程终止才退出,服务进程基本都是这种写法,所以不用详述,下面先看看这个模型的图示: 图示里表现得很明朗,监控进程和工作进程各有一个无限for循环,以便进程持续的等待和处理自己负责的事务,直到进程退出。 监控进程的无限for循环内有一个关键的sigsuspend函数调用,该函数的调用使得监控进程的大部分时间都处于挂起状态,直到监控进程接收到信号为止,当监控进程接收到信号时,调用信号处理函数ngx_signal_handler进行处理。我们知道,信号处理函数一般都比较简单,故此在函数ngx_signal_handler内执行的动作主要也就是对一些标识字段进行设置,而更具体的处理逻辑仍直接放在for循环内,所以该for循环接下来的代码就是判断那些标识字段,比如ngx_reap(有子进程退出?)、ngx_quit或ngx_terminate(进行要退出或终止?)、ngx_reconfigure(重新加载配置?)等是否被置位并相应的做出处理。当所有信号都处理完时又挂起在函数sigsuspend调用处继续等待新的信号,如此反复,构成监控进程的主要执行体。 工作进程的执行主体与监控进程类似,不过工作进程既然是工作进程,那么它的主要关注点就是与客户端之间的数据可读/可写事件,而不是信号,所以,工作进程的阻塞点是在像select、epoll_wait等这样的函数调用处,以等待发生数据可读/可写事件或是被新收到的信号中断。Nginx的IO复用模型封装得相当不错,当然也非一两句言语能够说得清楚,这将在我们的IO复用模型的统一一章做详细介绍。 ... [阅读更多]

分类: nginx, 源码分析 标签: ,