nginx 의 이벤트 모듈

3088 단어
이벤트 에서 이벤트 구동 모듈 을 크로스 플랫폼 을 지원 하기 때문에 이벤트 모듈 을 추상 화 했 습 니 다.지원 하 는 이벤트 형식 은 다음 과 같 습 니 다.
1. AIO (비동기 I / O)
2. / dev / poll (solaris 와 유 닉 스 특유)
3. epoll (linux 2.6 특유)
4. eventport (solaris 10 특유)
5. kqueue (BSD 특유)
6、poll
7. rtsig (실시 간 신호)
8、select
이벤트 모듈 의 주요 기능 은 accept 를 감청 한 후 만들어 진 연결 을 통 해 읽 기와 쓰기 이 벤트 를 추가 삭제 하 는 것 이다.이벤트 구동 모델 과 비 차단 I / O 모델 을 결합 하여 사용 합 니 다.I / O 가 읽 고 쓸 수 있 을 때 해당 읽 기와 쓰기 이벤트 가 깨 어 나 고 이 때 이벤트 의 리 셋 함 수 를 처리 합 니 다.
Linux 에 대해 nginx 대부분의 이 벤트 는 epoll EPOLLET (변두리 트리거) 방법 으로 이 벤트 를 깨 웁 니 다. listen 포트 의 읽 기 이 벤트 는 EPOLLLT (수평 트리거) 입 니 다. 변두리 트리거 에 대해 읽 기 가능 한 이벤트 가 발생 하면 제때에 처리 해 야 합 니 다. 그렇지 않 으 면 읽 기 파일 이 더 이상 트리거 되 지 않 고 처리 되 지 않 은 상황 이 발생 할 수 있 습 니 다.
이벤트 의 구조 체 는:
typedef struct {
    ngx_int_t  (*add)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);
    ngx_int_t  (*del)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);

    ngx_int_t  (*enable)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);
    ngx_int_t  (*disable)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);

    ngx_int_t  (*add_conn)(ngx_connection_t *c);
    ngx_int_t  (*del_conn)(ngx_connection_t *c, ngx_uint_t flags);

    ngx_int_t  (*process_changes)(ngx_cycle_t *cycle, ngx_uint_t nowait);
    ngx_int_t  (*process_events)(ngx_cycle_t *cycle, ngx_msec_t timer,
                   ngx_uint_t flags);

    ngx_int_t  (*init)(ngx_cycle_t *cycle, ngx_msec_t timer);
    void       (*done)(ngx_cycle_t *cycle);
} ngx_event_actions_t;

accept 자물쇠
커 널 accpet 가 연결 되 어 있 을 때 기다 리 는 모든 프로 세 스 를 깨 웁 니 다. 그러나 실제로 하나의 프로 세 스 만 연결 을 가 져 올 수 있 습 니 다. 다른 프로 세 스 는 깨 울 수 없습니다.
nginx 의 이벤트 처리 입구 함 수 는 ngxprocess_events_and_timers (), 잠 금 추가 과정 은?
if (ngx_use_accept_mutex) {
        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;
                }
            }
        }
    }

재 ngxtrylock_accept_mutex 에서 자 물 쇠 를 가 져 오 면 listen 의 포트 읽 기 이 벤트 를 이벤트 처리 에 추가 하고 새로운 연결 이 올 때 accept 할 수 있 습 니 다.
ngx_process_이벤트 함 수 는 모든 이벤트 처리 의 입구 입 니 다. 모든 이 벤트 를 옮 겨 다 닙 니 다.accept 잠 금 을 빼 앗 는 프로 세 스 는 일반 프로 세 스 와 차이 가 있 습 니 다. 게다가 NGXPOST_EVENTS 플래그 표시 ngxprocess_events 는 사건 을 post이벤트 이벤트 의 대기 열 에서 처리 하지 않 습 니 다.ngx 까지accept_mutex 자 물 쇠 를 제거 한 후에 야 사건 을 처리 합 니 다.왜 이래?이렇게 하면 이 프로 세 스 가 자 물 쇠 를 빼 앗 은 후 accept 부터 끝 날 때 까지 다른 프로 세 스 가 새로운 연결 을 계속 받 아들 이 고 스루풋 을 높 일 수 있 기 때문이다.
ngx_posted_accept_이벤트 와 ngxposted_이 벤트 는 accept 지연 이벤트 큐 와 일반 지연 이벤트 큐 입 니 다.사실 ngxposted_accept_이벤트accept_mutex 자물쇠 에서 처 리 된 것 입 니 다. 이 대기 열 은 accept 이 벤트 를 처리 합 니 다. 커 널 backlog 에서 기다 리 는 연결 을 모두 accept 로 들 어 와 읽 기와 쓰기 이벤트 에 등록 합 니 다.

좋은 웹페이지 즐겨찾기