nginx keepalive 연결 회수 메커니즘

2094 단어
nginx 1.0.12 코드 에서 ngx 라 는 이름 을 발 견 했 습 니 다.reusable_connection 의 함수 (어느 버 전에 붙 었 는 지 따 지지 않 습 니 다) 이 함수 가 무엇 을 하 는 지 궁금 합 니 다.나중에 한 번 은 내 그룹 에서 nginx 를 토론 할 때 어떤 사람 이 이상 한 현상 을 발견 했다. 이 학 우 는 병발 량 이 많 을 때 일부 keepalive 의 연결 은 새로운 연결 에 의 해 밀 려 날 것 이 라 고 보고 했다.
이 문제 에 대하 여 착안점 은 ngx 에 있 습 니 다.get_connection, 동시 다발 이 충분 할 때 연결 탱크 를 신속하게 소모 시 킵 니 다. 코드 측면 에서 볼 때:
여기 이런 함수 가 나 타 났 습 니 다: ngxdrain_connections。
    c = ngx_cycle->free_connections;
    //         
    if (c == NULL) {
        ngx_drain_connections(); //    keepalive      
        c = ngx_cycle->free_connections;
    }

그렇다면 위 에서 언급 한 reusable 연결 대기 열 은 어떻게 만 들 어 졌 을 까?이것 은 비교적 간단 하 다. 여기 서 대충 말 해 보 자.
재 ngxhttp_set_keepalive 함수 처리 의 마지막 단 계 는 두 번 째 를 1 로 하 는 형식 으로 ngx 를 호출 합 니 다.reusable_connection 함수.
그리고 ngxhttp_keepalive_handler 함수 에 서 는 인자 0 으로 ngx 를 호출 합 니 다.reusable_connection。
static void
ngx_drain_connections(void)
{
    ngx_int_t          i;
    ngx_queue_t       *q;
    ngx_connection_t  *c;
    
    //   32 keepalive  ,              
    for (i = 0; i < 32; i++) {
        if (ngx_queue_empty(&ngx_cycle->reusable_connections_queue)) {
            break;
        }
        
        // reusable          ,             ,    
        //         ,     ,     ,  LRU
        q = ngx_queue_last(&ngx_cycle->reusable_connections_queue);
        c = ngx_queue_data(q, ngx_connection_t, queue);

        ngx_log_debug0(NGX_LOG_DEBUG_CORE, c->log, 0,
                       "reusing connection");
        
        //    handler ngx_http_keepalive_handler,    ,  close  1,
        //      ngx_http_close_connection     ,       keepalive
        //            。
        c->close = 1;
        c->read->handler(c->read);
    }
}

고성능 서버 의 측면 에서 볼 때 nginx 가 이렇게 하 는 것 도 합 리 적 인 점 이 있 습 니 다. 만약 에 keepalive 가 장시간 동안 데 이 터 를 교환 하지 않 으 면
새로운 연결 이 와 도 연결 을 받 지 못 하고 구 덩이 를 차지 하 는 XX 녀석 들 을 처리 하 는 것 도 어 쩔 수 없 는 일이 다. 물론 함부로 drain 을 떨 어 뜨리 는 것 은 옳지 않다. 여 기 는 저울질 해 야 한다. 물고기 와 곰 발바닥 을 동시에 얻 을 수 없 기 때문이다.

좋은 웹페이지 즐겨찾기