首页 > nginx, 源码分析 > 利用timer_resolution设置减少gettimeofday调用的次数

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

2011年9月10日 发表评论 阅读评论 10,202 次浏览

请关注最新修正合订:http://lenky.info/ebook/
这一系列的文章还是在09年写的,存在电脑里很久了,现在贴出来。顺序也不记得了,看到那个就发那个吧,最近都会发上来。欢迎转载,但请保留链接:http://lenky.info/,谢谢。

http://wiki.nginx.org/NginxCoreModule

配置选项:timer_resolution
设置语法:timer_resolution t
默 认 值:none
例子:timer_resolution? 100ms;
说明:该配置指令允许用户减少调用gettimeofday()的次数。默认情况下,该函数在每次I/O端口监听(比如epoll_wait)返回后都将被调用,而通过timer_resolution配置选项可以直接指定调用gettimeofday()函数的间隔时间。
下面就来看看该配置选项是如何起作用的。
如果设置了timer_resolution选项,那么设置值会反应在一个全局变量ngx_timer_resolution内,这个具体转换过程很容易理清楚,在源码工程内搜索关键字“timer_resolution”就可以找到相关代码。
在源文件ngx_event.c的函数ngx_process_events_and_timers内:

    if (ngx_timer_resolution) {
        timer = NGX_TIMER_INFINITE;
        flags = 0;

    } else {
        timer = ngx_event_find_timer();
        flags = NGX_UPDATE_TIME;

#if (NGX_THREADS)

        if (timer == NGX_TIMER_INFINITE || timer > 500) {
            timer = 500;
        }

#endif
    }

注意上面两行标为红色的代码,在timer_resolution选项未设置时:

flags = NGX_UPDATE_TIME;

而接下来的回调函数:

(void) ngx_process_events(cycle, timer, flags);

会将该flags值传到相应的事件处理函数里去,比如:

ngx_epoll_module.c : ngx_epoll_process_events()

而在这个函数内有:

if (flags & NGX_UPDATE_TIME) {
    ngx_time_update(0, 0);
}

可以看到当设置timer_resolution选项时,该if为假,因为flags = 0;,所以在epoll_wait后不会调用gettimeofday(这在函数ngx_time_update内调用)。而在哪儿调用呢?这在一个定时器信号处理函数内被调用:

Ngx_event.c: ngx_event_process_init

定时器在该函数内通过setitimer设置,定时信号处理函数设置为ngx_timer_signal_handler:

void
ngx_timer_signal_handler(int signo)
{
    ngx_event_timer_alarm = 1;

#if 1
    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ngx_cycle->log, 0, "timer signal");
#endif
}

转载请保留地址:http://www.lenky.info/archives/2011/09/69http://lenky.info/?p=69


备注:如无特殊说明,文章内容均出自Lenky个人的真实理解而并非存心妄自揣测来故意愚人耳目。由于个人水平有限,虽力求内容正确无误,但仍然难免出错,请勿见怪,如果可以则请留言告之,并欢迎来讨论。另外值得说明的是,Lenky的部分文章以及部分内容参考借鉴了网络上各位网友的热心分享,特别是一些带有完全参考的文章,其后附带的链接内容也许更直接、更丰富,而我只是做了一下归纳&转述,在此也一并表示感谢。关于本站的所有技术文章,欢迎转载,但请遵从CC创作共享协议,而一些私人性质较强的心情随笔,建议不要转载。

法律:根据最新颁布的《信息网络传播权保护条例》,如果您认为本文章的任何内容侵犯了您的权利,请以Email或书面等方式告知,本站将及时删除相关内容或链接。

分类: nginx, 源码分析 标签: ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.