nginx 이벤트 구동 모델 진입

최근 아 리 도 휘 선배 가 쓴 'nginx 깊이 이해 하기' 의 nginx 사건 모듈 을 보고 있다.이 내용 을 보고 싶 은 이 유 는 nginx 가 방대 한 병렬 연결 을 처리 할 수 있 기 때 문 입 니 다. 그 뒤의 사건 구동 이 어떻게 구축 되 었 는 지 보고 싶 습 니 다.
이 박문 은 저도 코드 같은 것 을 붙 여 nginx 사건 의 구동 을 이야기 하고 싶 지 않 습 니 다. 첫째, 저 는 그렇게 철저하게 이해 하지 못 했 습 니 다. 그래서 오히려 읽 기 어 려 운 사람 이 지식 을 빨리 파악 하기 어렵 습 니 다. 그래서 저 는 앞으로 의 서비스 프로그램 개발 에 도움 이 될 수 있다 고 생각 하 는 몇 가지 지식 을 간단하게 말씀 드 리 겠 습 니 다.
nginx 의 epoll 모델 을 간단하게 논술 하 다.
본문 은 epoll 만 을 예 로 들 수 있다.
nginx 는 epoll 을 이벤트 구동 의 기초 로 하고 epoll 은 모두 4 가지 이 벤트 를 검 측 합 니 다. 각각 다음 과 같 습 니 다.
.       
.      
.        
.        

(1) 먼저 새로운 연결 이 벤트 를 처리 하 는 첫 번 째 이 야 기 를 하 겠 습 니 다. 저 희 는 평소에 서버 디자인 을 할 때 연결 이벤트 가 민감 하기 때문에 (빠 른 응답 에 대한 요구 가 높 습 니 다) 저 는 하나의 스 레 드 (프로 세 스) 만 열 어서 연결 을 처리 하고 연결 을 가 져 온 다음 에 각 I / O 재 활용 스 레 드 를 나 누 어 보 내 겠 습 니 다.그러나 nginx 의 연결 이 벤트 를 처리 하고 다른 이 벤트 를 처리 하 는 것 은 모두 같은 I / O 재 활용 입 니 다. 그러면 연결 이벤트 가 응답 에 대한 요 구 를 어떻게 보장 합 니까?niginx 는 가 져 온 이 벤트 를 리 셋 하지 않 고 두 개의 post 대기 열 에 먼저 넣 는 것 입 니 다. 이 두 개의 대기 열 은 각각
.ngx_posted_accept_events
.ngx_posted_events

첫 번 째 대기 열 은 연결 이 벤트 를 저장 하 는 데 사 용 됩 니 다. 두 번 째 대기 열 은 일반 읽 기와 쓰기 이 벤트 를 저장 하 는 데 사 용 됩 니 다. 그 다음 에 실행 할 때 ngx 를 보증 할 수 있 습 니 다.posted_accept_이벤트 의 이 벤트 를 먼저 처리 하면 응답 속도 에 대한 민감 성 을 확보 할 수 있 습 니 다 (2) 직렬 문 제 를 어떻게 방지 하 는 지 는 서버 프로그램 에서 처리 해 야 할 문제 라 고 할 수 있 습 니 다.직렬 문 제 는 방금 소켓 을 닫 았 고 또 새로운 연결 이 왔 다 는 것 을 말한다. 새로운 연결 이 마침 시스템 에 분 배 된 것 은 방금 닫 힌 소켓 이다. 그러면 방금 어떤 소켓 이 아직 처리 되 지 않 았 다 면 그 다음 에 해당 하 는 소켓 에 대한 발송 수 는 새로 만 든 사용자 에 게 보 낼 가능성 이 높다.그러면 nginx 는 어떻게 이 문 제 를 해결 합 니까?간단 합 니 다. nginx 는 새로운 연결 을 받 을 때마다 연결 에 있 는 로 고 를 거꾸로 설정 합 니 다. 그러면 이 연결 은 이전 연결 의 intance 와 다 르 고 모든 이벤트 에 연결 이 포함 되 어 있 기 때문에 이 벤트 를 처리 할 때마다 이벤트 의 intance 가 일치 하 는 지 비교 하면 됩 니 다. (3)'놀 라 운 문제' 를 어떻게 처리 하 느 냐 는 놀 라 운 문제 란 여러 프로 세 스 가 같은 포트 를 동시에 감청 하 는 것 이다. 연결 이 있 을 때 시스템 은 여러 프로 세 스 를 깨 우지 만 물론 하나의 프로 세 스 만 이 새로운 연결 을 처리 할 수 있 기 때문에 원래 다른 프로 세 스 는 깨 울 필요 가 없 지만 깨 어 났 다. 이것 이 바로 놀 라 운 문제 이다.nginx 가 해결 하 는 방법 도 간단 합 니 다. 같은 시간 에 하나의 프로 세 스 만 감청 포트 에 있 으 면 놀 라 운 문 제 를 피 할 수 있 습 니 다.문 제 는 같은 시간 에 하나의 프로 세 스 만 이 포트 를 감청 할 수 있 도록 하 는 것 이다.nginx 는 자 물 쇠 를 추가 하려 고 시 도 했 습 니 다. 자 물 쇠 를 추가 하 는 반환 값 에 따라 이 프로 세 스 가 다음 에 새로운 연결 사건 을 처리 해 야 하 는 지 확인 하여 '놀 라 운 문제' (4) 부하 균형 을 어떻게 해결 하 는 지 에 따라 제 가 사용 하 는 부하 균형 은 매우 간단 합 니 다. 바로 메 인 스 레 드 가 새로운 연결 을 받 아들 인 다음 에 돌아 가면 서 새로운 연결 을 각 키 스 레 드 에 나 누 어 주 는 것 입 니 다.한편, nginx 는 프로 세 스 간 의 부하 균형 문 제 를 해결 하 는 데 균형 적 인 배분 이 아니 라 모든 프로 세 스 가 처리 하 는 액 연결 수가 규정된 최대 연결 수의 7 / 8 을 초과 하면 이번 에는 연결 을 처리 하지 않 고 처리 하 는 연결 수 - 1 을 처리 하면 기 회 를 다른 스 레 드 에 양보 하여 부하 균형 을 이 루 는 것 과 같다.
총결산
nginx 구동 모듈 에 대해 서 는 먼저 이 점 을 쓰 세 요. 그 다음 에 볼 때 이 블 로 그 를 쓰 는 것 은 자신 이 공부 하도록 독촉 하 는 것 입 니 다.

좋은 웹페이지 즐겨찾기