nginx 스 레 드 탱크 모델 연구

4780 단어 nginx
nginx 의 IO 모델 은 사실 여러분 이 알 아야 합 니 다. 쉽게 말 하면 하나의 master 프로 세 스 와 여러 개의 worker 프로 세 스 (프로 세 스 수 는 설정 에 의 해 결정) 입 니 다. master 프로 세 스 는 accept 요청 과 대기 열 화 를 책임 지고 마지막 으로 worker 프로 세 스에 전송 하 며 요청 과 응답 을 처리 하 는 전체 과정 입 니 다.그러나 이것 은 프로 세 스 차원 에서 모든 프로 세 스 의 단일 라인 처리 입 니 다.nginx 는 1.7.11 버 전에 서 다 중 스 레 드 특성 (multi - threading) 을 제공 합 니 다. 그러나 이 다 중 스 레 드 는 ao 모델 (IO 모델) 에서 로 컬 파일 을 조작 하 는 데 만 사 용 됩 니 다. 출발점 은 비 차단 모드 로 파일 IO 의 효율 과 병행 능력 을 향상 시 키 는 것 입 니 다.따라서 이 다 중 스 레 드 는 nginx 가 다 중 스 레 드 를 통 해 proxy request 를 처리 하 는 것 이 아니 라 로 컬 의 정적 파일 을 처리 하 는 것 입 니 다.
 
    여기 에는 몇 가지 명령 이 포함 되 어 있 습 니 다. sendfile, ao, directio 는 모두 로 컬 파일 의 조작 과 관련 이 있 습 니 다. 우 리 는 먼저 그들의 의 미 를 봅 시다.
1、sendfile:
    시스템 'sendfile ()' 파라미터 와 같은 의 미 를 가진다. sendfile 의 목적 은 로 컬 파일 이 socket 을 통 해 보 내 는 효율 을 높이 는 것 이다.디스크, 네트워크 드라이브, 메모 리 는 세 가지 서로 다른 전송 매체 입 니 다. 로 컬 에서 파일 을 읽 고 socket 을 통 해 보 내 면 보통 다음 과 같은 몇 가지 절차 가 들 어 갑 니 다.
    1) 디스크 드라이브 는 CPU 스케줄 에 따라 디스크 에서 일정 길이 (chunk) 의 바이트 데이터 2) 바이트 데 이 터 를 읽 고 커 널 메모리 로 복사 합 니 다. 3) 커 널 메모리 의 데 이 터 를 프로 세 스 작업 영역 메모리 로 복사 합 니 다. 4) 프로 세 스 는 socket 을 통 해 데 이 터 를 네트워크 드라이브 캐 시 로 복사 하고 해당 하 는 전송 프로 토 콜 을 통 해 보 냅 니 다.
    우 리 는 데이터 의 전송 과정 이 여러 번 copy 와 관련 되 는데 이것 은 컴퓨터 시스템 의 디자인 문제 에 국한 된다 는 것 을 간단하게 알 수 있다.그러면 sendfile 의 주요 출발점 은 데이터 의 copy 를 줄 여 전송 효율 을 높이 는 것 입 니 다. sendfile 은 Liux 시스템 급 호출 입 니 다. socket 은 DMA (직접 메모리 접근) 방식 으로 파일 데 이 터 를 직접 방문 하고 전송 프로 토 콜 을 통 해 보 내 며 2 차 데이터 copy (디스크 에서 커 널, 커 널 에서 작업 공간) 를 줄 일 수 있 습 니 다.
    sendfile_max_chunk 매개 변 수 는 매번 sendfile () 호출 에서 보 내 는 최대 데이터 사 이 즈 를 제한 하 는 데 사 용 됩 니 다. 크기 를 제한 하지 않 으 면 전체 워 커 프로 세 스 를 독점 합 니 다. 기본 값 은 '무제 한' 입 니 다.
    nginx 의 경우 에이전트 정적 로 컬 의 정적 파일 자원 (보통 작은 파일) 은 매우 효율 적일 것 입 니 다. 일부 정적 파일, 예 를 들 어 html, 그림 등 을 열 어 이 인 자 를 여 는 것 을 권장 합 니 다.
location /video {
    sendfile on;
    sendfile_max_chunk 128k;
    aio on;
}

  
2、directio
    오픈 대 ODIRECT 태그 (BSD, linux) 의 사용 은 directio () 라 는 시스템 호출 에 대응 합 니 다. 이 인 자 는 큰 파일 을 대상 으로 설정 되 어 있 습 니 다. sendfile 은 작은 파일 을 대상 으로 하고 directio 를 통 해 한 정 된 크기 를 지정 할 수 있 습 니 다. 이 size 를 초과 한 파일 은 directio (sendfile 을 사용 하지 않 음) 를 사용 합 니 다.directio 의 디자인 취지 에 따라 sendfile 의 기본 원 리 를 가지 고 있 습 니 다. 커 널 cache 를 사용 하지 않 고 DMA 를 직접 사용 합 니 다. 또한 사용 후 메모리 cache (페이지 정렬 부분) 도 방출 되 기 때문에 directio 는 보통 큰 파일 읽 기 에 적용 되 고 읽 기 빈도 가 낮 으 며 고주파 읽 기 에 효율 적 이지 않 습 니 다.(cache 를 다시 사용 하지 않 고 매번 DMA 를 사용 하기 때 문 입 니 다. 성능 평가 문제 가 있 기 때문에 이 매개 변 수 는 기본적으로 off 입 니 다.
location /video {
    sendfile on;
    directio 8m;
    aio on;
}

 
3、aio 
    저 희 는 ao 모델 을 연상 시 킬 수 있 습 니 다. 사실은 의미 도 대체적으로 같 습 니 다. 즉, 비동기 파일 IO 입 니 다. nginx 는 기본적으로 이 기능 을 닫 습 니 다. 이 기능 은 높 은 버 전의 Liux 플랫폼 에서 만 지원 해 야 합 니 다 (2.6.22 +)Liux 플랫폼 에서 directio 는 512 바이트 경 계 를 기반 으로 정렬 된 blocks 만 읽 을 수 있 습 니 다. 파일 이 끝 난 정렬 되 지 않 은 block 은 차단 모드 로 읽 습 니 다. 마찬가지 로 파일 이 시작 에 정렬 되 지 않 았 을 때 전체 파일 은 차단 식 으로 읽 습 니 다. 여기 서 정렬 이란 파일 데이터 가 메모리 페이지 에 있 는 cache 상황 입 니 다.
    aio 와 sendfile 이 모두 열 렸 을 때, directio 설정 값 보다 크기 가 큰 파일 에 대해 aio 메커니즘 을 사용 합 니 다. 즉, directio 설정 값 보다 작은 파일 은 sendfile (aio 가 참여 하지 않 음) 을 직접 사용 합 니 다.
    ao 는 간단하게 말 하면 다 중 스 레 드 비동기 모드 로 비교적 큰 파일 을 읽 어서 IO 효율 을 높 일 수 있 지만 사실은 향상 되 지 않 을 수 있 습 니 다. 큰 파일 의 읽 기 는 cache 를 사용 할 수 없고 그 자체 도 시간 이 걸 립 니 다. 다 중 스 레 드 라 도 request 의 대기 시간 을 예측 할 수 없습니다. 특히 동시 요청 이 높 을 때 ao 는 IO 를 향상 시 킵 니 다.병발 능력 은 확실 하 다.
 
    기본적으로 다 중 스 레 드 모드 는 닫 혀 있 습 니 다. "- with - threads" 설정 을 통 해 시작 해 야 합 니 다. 이 기능 은 epoll, kquue 를 지원 하 는 플랫폼 에서 호 환 됩 니 다. 스 레 드 풀 설정 에 대해 서 는 "thread pool" 을 통 해 설명 하고 ao 명령 에서 지정 할 수 있 습 니 다.
thread_pool default_pool threads=16;##main   
...
location /video {
    sendfile on;
    sendfile_max_chunk 128k;
    directio 8M;
    aio threads=default_pool;
}

    스 레 드 탱크 의 모든 스 레 드 가 busy 상태 에 있 으 면 새로운 task 요청 이 대기 열 에 추 가 됩 니 다. thread pool 에서 "max quue" 파 라 메 터 를 사용 하여 대기 열의 크기 를 지정 할 수 있 습 니 다. 기본 대기 열 크기 는 65536 입 니 다. 대기 열 이 가득 차 면 다음 요청 은 error 를 던 집 니 다.
 
4. 기타
    nginx 는 공식 적 으로 다 중 스 레 드 모드 를 사용 하여 ao 에서 파일 을 읽 는 장면 에서 성능 이 9 배 향상 되 었 고 문 서 를 참조 하 겠 다 고 발 표 했 습 니 다. 그러나 저 는 이 테스트 에 대해 어느 정도 의심 하 는 태 도 를 가지 고 있 습 니 다. 다 중 스 레 드 + ao 는 어느 정도 에 파일 IO 의 읽 기 성능 을 향상 시 킬 수 있 지만 큰 파일 에 있어 서 이것 은 생각 보다 우수 하지 않 은 것 같 습 니 다. 이것 은 Liux 플랫폼 밑 에 있 는 것 에 제약 을 받 습 니 다.nginx 가 파일 cache 에 대해 추가 작업 을 하지 않 는 한 자체 특성 이 있 습 니 다.
    지금까지 우 리 는 여전히 여러분 에 게 건의 합 니 다.
    1) 작은 파일 의 정적 에이전트 에 대해 우 리 는 sendfile 을 열 어야 한다. 이것 은 성능 향상 에 현저 하 다.
    2) 큰 파일 읽 기 (저주파) 에 대해 저 희 는 ao, directio 를 열 어 병행 능력 을 향상 시 키 는 전제 에서 request 의 실제 응답 효율 에 관심 을 가 질 수 있 습 니 다.정부 가 이렇게 추천 한 이상 우 리 는 시도 하 는 태 도 를 보일 수 있다.
    3) 고주파 단일 파일 읽 기, ao, directio 의 성능 향상 은 현저 하지 않 을 수 있 으 나 성능 이 떨 어 지지 않 을 것 이다.

좋은 웹페이지 즐겨찾기