Nginx 탐색 5

6738 단어
성능 을 향상 시 키 기 위해 nginx 는 자원 을 관리 하 는 데이터 구 조 를 스스로 실현 할 것 입 니 다. 내 려 와 보 세 요.
ngx_pool_t(100%)
ngx_pool_t 는 매우 중요 한 데이터 구조 로 많은 중요 한 장소 에서 사용 되 고 많은 중요 한 데이터 구조 도 이 를 사용 하고 있다.그렇다면 그것 은 도대체 무엇 일 까?쉽게 말 하면 이 는 일련의 자원 (예 를 들 어 메모리, 파일 등) 을 관리 하 는 데 도움 을 주 고 이러한 자원 에 대한 사용 과 방출 을 통일 적 으로 진행 하 며 사용 과정 에서 각종 자원 에 대한 언제 방출 되 는 지, 방출 이 누락 되 었 는 지 에 대한 걱정 을 면제 했다.
예 를 들 어 메모리 관리 에 있어 서 메모리 가 필요 하 다 면 항상 ngxpool_t 의 대상 에서 메모 리 를 가 져 옵 니 다. 마지막 순간 에 우 리 는 이 ngx 를 소각 합 니 다.pool_t 대상, 이 모든 메모리 가 방출 되 었 습 니 다.이렇게 하면 우 리 는 이 메모리 들 에 대해 malloc 와 free 작업 을 할 필요 가 없습니다. malloc 에서 나 온 메모리 가 방출 되 지 않 았 는 지 걱정 할 필요 가 없습니다.왜냐하면 ngxpool_t 대상 이 소각 되 었 을 때 이 대상 에서 분 배 된 모든 메모리 가 통일 적 으로 방출 됩 니 다.
그리고 예 를 들 어 우 리 는 일련의 파일 을 사용 해 야 합 니 다. 그러나 우리 가 열 면 최종 적 으로 모두 닫 아야 합 니 다. 그러면 우 리 는 이 파일 들 을 하나의 ngx 에 통일 적 으로 등록 합 니 다.pool_t 대상 중, 이 ngxpool_t 대상 이 소각 되면 모든 파일 이 닫 힙 니 다.
위 에서 열거 한 두 가지 예 에서 우 리 는 ngx 를 사용 하 는 것 을 알 수 있다.pool_t. 이 데이터 구 조 를 할 때 모든 자원 의 방출 은 이 대상 이 소각 되 는 시간 에 통일 적 으로 방출 되면 문 제 를 가 져 올 수 있 습 니 다. 바로 이러한 자원 의 생존 주기 (또는 점용 되 는 시간) 는 ngx 와pool_t 의 생존 주기 가 기본적으로 일치 합 니 다 (ngx pool t 도 소량의 조작 을 제공 하여 자원 을 미리 방출 할 수 있 습 니 다).가장 효율 적 인 측면 에서 볼 때 이것 은 결코 가장 좋 은 것 이 아니다.예 를 들 어 우 리 는 A, B, C 세 개의 자원 을 순서대로 사용 해 야 한다. 그리고 B 를 다 사 용 했 을 때 A 는 더 이상 사용 되 지 않 고 C 를 사용 할 때 A 와 B 는 사용 되 지 않 는 다.ngx 를 사용 하지 않 으 면pool_t. 이 세 가지 자원 을 관리 합 니 다. 그러면 우 리 는 시스템 에서 A 를 신청 하고 A 를 사용 한 후에 A 를 방출 할 수 있 습 니 다.이 어 B 를 신청 하고 B 를 사용 하 며 B 를 풀 어 준다.마지막 으로 C 를 신청 하고 C 를 사용 한 후에 C 를 석방 합 니 다.하지만 우리 가 ngx 를 사용 하면pool_t 대상 이 이 세 가지 자원 을 관리 할 때 A, B 와 C 의 방출 은 마지막 에 함께 발생 한 것 이다. 즉, C 를 사용 한 후에 발생 한 것 이다.물론 이것 은 객관 적 으로 프로그램의 한동안 자원 사용량 을 증가 시 켰 다.그러나 이 는 프로그래머 가 각각 세 자원 의 생명 주 기 를 관리 하 는 작업 도 줄 였 다.이것 이 바로 소득 이 있 으 면 반드시 잃 는 이치 다.사실은 취사선택 의 문제 이다. 구체 적 인 상황 에서 당신 이 더 중요 하 게 생각 하 는 것 이 무엇 인지 봐 야 한다.
nginx 에서 전형 적 인 사용 ngx 를 볼 수 있 습 니 다.pool_t 의 장면 은 nginx 가 처리 하 는 http request 마다 nginx 를 생 성 합 니 다.pool_t 대상 은 이 http request 와 연결 되 어 있 으 며, 모든 처리 과정 에서 신청 해 야 할 자원 은 이 ngx 에서pool_t 대상 에서 가 져 옵 니 다. 이 http request 처리 가 완료 되면 처리 과정 에서 신청 한 모든 자원 은 이 관련 ngx 에 따라pool_t 대상 의 소각 로 석방.
ngx_pool_t 관련 구조 및 작업 은 파일 src / core / ngx 로 정의 되 었 습 니 다.palloc. h | c 중.
typedef struct ngx_pool_s        ngx_pool_t;

struct ngx_pool_s {
    ngx_pool_data_t       d;
    size_t                max;
    ngx_pool_t           *current;
    ngx_chain_t          *chain;
    ngx_pool_large_t     *large;
    ngx_pool_cleanup_t   *cleanup;
    ngx_log_t            *log;
};

부터 ngxpool_t 의 일반 사용자 의 측면 에서 볼 때 ngx 에 관심 을 가 질 필요 가 없습니다.pool_t 구조 에서 각 필드 역할.그래서 여기 서도 상세 한 설명 을 하지 않 습 니 다. 물론 일부 조작 함수 의 사용 을 설명 할 때 필요 하 다 면 설명 을 하 겠 습 니 다.
다음은 우리 가 각각 ngx 를 설명 하 겠 습 니 다.pool_t 의 관련 조작.
ngx_pool_t *ngx_create_pool(size_t size, ngx_log_t *log);

초기 노드 크기 가 size 인 pool 을 만 듭 니 다. log 는 이 pool 에서 작업 할 때 로 그 를 출력 하 는 대상 입 니 다.설명 할 것 은 size 의 선택 입 니 다. size 의 크기 는 NGX 보다 작 아야 합 니 다.MAX_ALLOC_FROM_POOL, 그리고 sizeof (ngx pool t) 보다 커 야 합 니 다.
NGX 보다 큰 선택MAX_ALLOC_FROM_POOL 의 값 은 낭 비 를 초래 할 수 있 습 니 다. 이 제한 보다 큰 공간 은 사용 되 지 않 기 때 문 입 니 다.
sizeof (ngx pool t) 보다 작은 값 을 선택 하면 프로그램 이 무 너 집 니 다.초기 크기 의 메모리 블록 중 일 부 를 사용 하여 ngx 를 저장 해 야 하기 때 문 입 니 다.pool_t. 이 정보 자체.
ngxpool_t 대상 이 생 성 된 후 이 대상 의 max 필드 는 size - size of (ngx pool t) 와 NGX 로 할당 되 었 습 니 다.MAX_ALLOC_FROM_POOL 둘 중 에 작은 거.다음 에 이 pool 에서 분 배 된 메모리 블록 은 첫 번 째 메모리 사용 이 끝 난 후에 계속 분 배 를 하려 면 운영 체제 에서 메모 리 를 신청 해 야 합 니 다.메모리 의 크기 가 max 필드 보다 작 을 때 새로운 메모리 블록 을 분배 하고 d 이 필드 (실제 d. next 필드) 에서 관리 하 는 링크 에 연결 합 니 다.할당 할 메모리 블록 이 max 보다 크 면 시스템 에서 신청 한 메모 리 는 large 필드 관리 링크 에 걸 려 있 습 니 다.우 리 는 잠시 이것 을 큰 메모리 체인 과 작은 메모리 체인 이 라 고 부른다.
void *ngx_palloc(ngx_pool_t *pool, size_t size);

이 pool 에서 size 크기 의 메모 리 를 할당 합 니 다.이 함수 가 할당 한 메모리 의 시작 주 소 는 NGX 에 따라ALIGNMENT 가 정렬 되 었 습 니 다.정렬 작업 은 시스템 처리 속 도 를 높 일 수 있 지만 소량의 메모리 낭 비 를 초래 할 수 있다.
void *ngx_pnalloc(ngx_pool_t *pool, size_t size);

이 pool 에서 size 크기 의 메모 리 를 할당 합 니 다.그러나 이 함수 가 분배 한 메모 리 는 위의 함수 처럼 정렬 된 적 이 없다.
void *ngx_pcalloc(ngx_pool_t *pool, size_t size);

이 함수 도 size 크기 의 메모 리 를 할당 하고 분 배 된 메모리 블록 을 제거 합 니 다.내 부 는 사실상 호출 ngxpalloc 가 실 현 했 습 니 다.
void *ngx_pmemalign(ngx_pool_t *pool, size_t size, size_t alignment);

지정 한 크기 에 따라 alignment 를 정렬 하여 크기 가 size 인 메모 리 를 신청 합 니 다.이 곳 에서 가 져 온 메모 리 는 크기 와 상 관 없 이 큰 메모리 블록 체인 에 관리 되 어 있 습 니 다.
ngx_int_t ngx_pfree(ngx_pool_t *pool, void *p);

큰 메모리 체인, 즉 large 필드 에서 관리 하 는 메모리 의 한 블록 을 방출 합 니 다.이 함수 의 실현 은 large 관 리 를 순서대로 옮 겨 다 니 는 큰 메모리 링크 입 니 다.그래서 효율 이 떨 어 집 니 다.이 링크 에서 이 메모 리 를 찾 으 면 방출 하고 NGX 로 돌아 갑 니 다.OK。그렇지 않 으 면 NGX 로 돌아 갑 니 다.DECLINED。
이 조작 효율 이 비교적 낮 기 때문에 필요 하지 않 으 면 이 메모리 가 매우 크 므 로 제때에 방출 해 야 한다. 그렇지 않 으 면 일반적으로 호출 할 필요 가 없다.어차피 메모리 가 이 pool 이 소각 되 었 을 때, 어쨌든 모두 방출 될 거 야!
ngx_pool_cleanup_t *ngx_pool_cleanup_add(ngx_pool_t *p, size_t size);

ngx_pool_t 의 cleanup 필드 는 특수 한 링크 를 관리 하고 있 습 니 다. 이 링크 의 모든 항목 은 특수 한 방출 이 필요 한 자원 을 기록 하고 있 습 니 다.이 링크 에 포 함 된 모든 노드 에 포 함 된 자원 을 어떻게 방출 하 는 지 는 스스로 설명 한 것 이다.이것 도 매우 큰 유연성 을 제공 했다.의미, ngxpool_t. 메모 리 를 관리 할 수 있 을 뿐만 아니 라 이 체 제 를 통 해 방출 해 야 할 모든 자원 을 관리 할 수 있 습 니 다. 예 를 들 어 파일 을 닫 거나 파일 을 삭제 하 는 등 입 니 다.다음은 이 링크 의 각 노드 유형 을 살 펴 보 겠 습 니 다.
typedef struct ngx_pool_cleanup_s  ngx_pool_cleanup_t;
typedef void (*ngx_pool_cleanup_pt)(void *data);

struct ngx_pool_cleanup_s {
    ngx_pool_cleanup_pt   handler;
    void                 *data;
    ngx_pool_cleanup_t   *next;
};

data:
이 노드 에 대응 하 는 자원 을 가 리 켰 다.
handler:
데이터 에 대응 하 는 자원 을 방출 할 수 있 는 함수 포인터 입 니 다.이 함 수 는 매개 변수 가 하나 밖 에 없 는데 바로 data 입 니 다.
next:
이 링크 의 다음 요 소 를 가리 키 고 있 습 니 다.
여기 보면, ngxpool_cleanup_add 이 함수 의 용법 은 모두 가 좀 알 것 이 라 고 믿 습 니 다.그런데 이 매개 변수 size 는 어떤 역할 을 합 니까?이 size 는 이 data 필드 가 가리 키 는 자원 의 크기 를 저장 하 는 것 입 니 다. 이 함 수 는 data 에 size 크기 의 공간 을 분배 합 니 다.
예 를 들 어 우 리 는 마지막 으로 파일 을 삭제 해 야 한다.이 함 수 를 호출 할 때 size 를 파일 이름 을 저장 하 는 문자열 의 크기 로 지정 한 다음 이 함 수 를 호출 하여 cleanup 링크 에 하 나 를 추가 합 니 다.이 함 수 는 새로 추 가 된 이 노드 를 되 돌려 줍 니 다.우 리 는 그 다음 에 이 노드 의 data 필드 를 파일 이름 으로 복사 합 니 다.hander 필드 를 파일 을 삭제 하 는 함수 로 할당 합 니 다. (물론 이 함수 의 원형 은 void (* ngx pool cleanup pt) (void * data) 에 따라 야 합 니 다.
void ngx_destroy_pool(ngx_pool_t *pool);

이 함 수 는 pool 에 있 는 모든 메모 리 를 방출 하고 cleanup 필드 에서 관리 하 는 링크 의 모든 요소 의 handler 필드 가 가리 키 는 함 수 를 순서대로 호출 하여 이 pool 관리 자원 을 방출 하 는 것 입 니 다.그리고 pool 을 가리 키 는 ngxpool_t 도 풀 려 서 전혀 사용 할 수 없습니다.
void ngx_reset_pool(ngx_pool_t *pool);

이 함 수 는 pool 의 모든 큰 메모리 링크 의 메모 리 를 방출 하고 작은 메모리 체인 의 메모리 블록 을 사용 가능 하 게 수정 합 니 다.하지만 cleanup 링크 에 있 는 프로젝트 는 처리 하지 않 습 니 다.

좋은 웹페이지 즐겨찾기