此博客总结,主要是方便日后查看学习

一、如何实现负载均衡?

        只有打开了accept_mutex锁,才能实现worker子进程间的 负载均衡。在建立连接的第2步中,初始化了一个全局变量ngx_accept_disabled,它就是负载均衡 机制实现的关键阈值,实际上它就是一个整型数据。

ngx_int_t ngx_accept_disabled;

        这个阈值是与连接池中连接的使用情况密切相关的,在建立链接的第2步中它会进行赋值

ngx_accept_disabled = ngx_cycle->connection_n/8 - ngx_cycle->free_connection_n;

当它为负数时,不会进行触发负载均衡操作;而 当ngx_accept_disabled是正数时,就会触发Nginx进行负载均衡操作了。Nginx的做法也很简 单,就是当ngx_accept_disabled是正数时当前进程将不再处理新连接事件,取而代之的仅仅 是ngx_accept_disabled值减1,如下所示。

if (ngx_accept_disabled > 0) { 
    ngx_accept_disabled--; 
} else { 
    if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR) { 
        return; 
    }
    … 
}

        上面这段代码表明,在当前使用的连接到达总连接数的7/8时,就不会再处理新连接 了,同时,在每次调用process_events时都会将ngx_accept_disabled减1,直到 ngx_accept_disabled降到总连接数的7/8以下时,才会调用ngx_trylock_accept_mutex试图去处理新连接事件。
        因此,Nginx各worker子进程间的负载均衡仅在某个worker进程处理的连接数达到它最大 处理总数的7/8时才会触发,这时该worker进程就会减少处理新连接的机会,这样其他较空闲 的worker进程就有机会去处理更多的新连接,以此达到整个Web服务的均衡处理效果。虽然 这样的机制不是很完美,但在维护一定程度上的负载均衡时,很好地避免了当某个worker进 程由于连接池耗尽而拒绝服务,同时,在其他worker进程上处理的连接还远未达到上限的问 题。因此,Nginx将accept_mutex配置项默认设为accept_mutex on。