2). 在子进程个数大于1个的情况下,可以通过配置项accept_mutex_delay控制epoll_wait等待的时长。 3). 通过设置 timer_resolution指定更新的时间粒度 当配置了timer_resolution以后,nginx在启动时,会通过setitimer告诉内核,每隔多长事件发送一次SIGALRM信号,同时设置捕获信号的回调处理函
在ngx_process_events_and_timers函数中首先会有如下的代码: if (ngx_timer_resolution) { timer = NGX_TIMER_INFINITE; flags = 0; } else { timer = ngx_event_find_timer(); //找到当前红黑树当中的最小的事件,传递给epoll的wait,保证epoll该时间内可以超时,可以使得超时的事件得到处理 flags = NGX_UP...
timer_resolution 指令 语法:timer_resolution interval; 默认值:— 上下文:main 降低工作进程中的计时器(timer)的解析,从而减少 gettimeofday() 系统调用的次数。默认情况下,每次收到内核事件时都会调用 gettimeofday()。降低计时器解析后,gettimeofday() 仅在每个指定时间间隔调用一次。 例子: timer_resolution 100ms; ...
在ngx_process_events_and_timers函数中首先会有如下的代码: if(ngx_timer_resolution) { timer=NGX_TIMER_INFINITE; flags=0; }else{ timer=ngx_event_find_timer();//找到当前红黑树当中的最小的事件,传递给epoll的wait,保证epoll可以该时间内可以超时,可以使得超时的事件得到处理flags =NGX_UPDATE_TIME;#if...
if(ngx_timer_resolution) { timer = NGX_TIMER_INFINITE; flags = 0; }else{ timer = ngx_event_find_timer();//找到当前红黑树当中的最小的时间,传递给epoll的wait,保证epoll可以该时间内可以超时,可以使得超时的事件得到处理 flags = NGX_UPDATE_TIME; ...
使用了timer_resolution指令,此处的timer将会被设置-1,否则就是调用ngx_event_find_timer()函数在定时器红黑树中找出最小定时时间。这个timer值最后将作为epoll_wait的超时时间(timeout)。此处需要注意timer_resolution指令的使用将会设置epoll_wait超时时间为-1,这表示epoll_wait将永远阻塞,不会自动唤醒,因此初始化里...
(node->key * NGX_TIMER_RESOLUTION - ngx_elapsed_msec); #endif // 如果相减结果小于0则返回0, 大于0则返回原值 return timer > 0 ? timer: 0 ; } /* 处理所有超时的定时器事件 * param timer: 与ngx_old_elapsed_msec的间隔时间 */
也就是说,配置文件中使用了timer_resolution指令后,epoll_wait将使用信号中断的机制来驱动定时器,否则将使用定时器红黑树的最小时间作为epoll_wait超时时间来驱动定时器 接下来我们看ngx_event_timer_init这个函数是怎么实现的, 在 src/event/ngx_event_timer.c 文件里...