void ngx_master_process_cycle(ngx_cycle_t *cycle)
{
...
for ( ;; ) {
if (delay) {
if (ngx_sigalrm) {
sigio = 0;
delay *= 2;
ngx_sigalrm = 0;
}
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
"termination cycle: %M", delay);
// 定时检测部分
itv.it_interval.tv_sec = 0;
itv.it_interval.tv_usec = 0;
itv.it_value.tv_sec = delay / 1000;
itv.it_value.tv_usec = (delay % 1000 ) * 1000;
if (setitimer(ITIMER_REAL, &itv, NULL) == -1) {
ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
"setitimer() failed");
}
}
ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "sigsuspend");
//master等待信号产生
sigsuspend(&set);
ngx_time_update();
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
"wake up, sigio %i", sigio);
// master一直检测worker进程的状态,有问题直接拉起
if (ngx_reap) {
ngx_reap = 0;
ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "reap children");
live = ngx_reap_children(cycle);
}
if (!live && (ngx_terminate || ngx_quit)) {
ngx_master_process_exit(cycle);
}
...
}
worker进程10s~20s没有响应 。 那什么时候worker进程会没有响应,我目前遇到在多线程服务器里面就是死锁、高负载会触发watchdog重启服务器进程
nginx启动之后,只有master进程才接受外部信号(重启、优雅退出、强制退出),至于worker进程启动时会清空信号,后面通信则使用socketpair建立的channel来进行通信(修改全局标志位控制worker进程的行为)。