ngixn如何控制多进程连接的平衡

来源:互联网 发布:linux weblogic创建域 编辑:程序博客网 时间:2024/06/01 13:53

nginx是一个多进程异步非阻塞的网络服务器。其一般有一个master进程和多个worker进程共同处理请求。其中master进程负责接收客户端的请求和管理work进程。work进程具体处理每个客户端的连接。当客户端请求到来时,多个work进程会去争取对该请求进行连接,那么如何能够保证多个进程的连接数保持一定的平衡而不至于使得某些进程负载过重呢?

nginx通过使每个进程都保存一个自己的连接池,且每个进程都有最大连接限制work_connections. nginx服务器就是通过计算每个进程的空闲连接数来限制该进程是否去抢占接收连接的锁accept_mutex.如当空闲连接数小于最大连接数的1/8时,该进程放弃抢占锁,并对空闲连接数执行虚拟加1的操作,当一个进程在一段时间内一直没有去抢占锁使得虚拟的空闲连接数大于1/8时,则该进程尝试着去抢占锁,当抢占到锁后重新计算真实的空闲连接数。伪代码如下:

ngx_accept_disabled = ngx_cycle->connection_n / 8    - ngx_cycle->free_connection_n;if (ngx_accept_disabled > 0) {    ngx_accept_disabled--;} else {    if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR) {        return;    }    if (ngx_accept_mutex_held) {        flags |= NGX_POST_EVENTS;    } else {        if (timer == NGX_TIMER_INFINITE                || timer > ngx_accept_mutex_delay)        {            timer = ngx_accept_mutex_delay;        }    }}

原创粉丝点击