apache 와 Nginx 의 주요 차이 점 (커 널 다 중 I / O 의 select 와 epoll 의 차이)
왜 Nginx 의 성능 은 Apache 보다 훨씬 높 습 니까?이 는 Nginx 가 최신 epoll (Linux 2.6 커 널) 과 kquue (freebsd) 네트워크 I / O 모델 을 사 용 했 고 아파 치 는 전통 적 인 select 모델 을 사용 한 덕분이다.현재 Linux 에서 높 은 동시 방문 을 견 딜 수 있 는 Squid, Memcached 는 모두 epoll 네트워크 I / O 모델 을 사용 하고 있다.
epoll 모델 이 무엇 인지 설명 하 겠 습 니 다.
epoll 은 리 눅 스 커 널 이 대량의 구문 을 처리 하기 위해 개 선 된 poll 입 니 다. 리 눅 스 에서 다 중 으로 IO 인터페이스 select / poll 을 재 활용 하 는 증강 버 전 입 니 다. 프로그램 이 대량의 병렬 연결 에서 소량 만 활발 한 상황 에서 시스템 CPU 이 용 률 을 현저히 감소 시 킬 수 있 습 니 다.파일 설명자 집합 을 재 활용 하여 결 과 를 전달 하기 때문에 개발 자 들 이 사건 을 기다 리 기 전에 수사 대상 파일 설명자 집합 을 다시 준비 해 야 합 니 다. 다른 하 나 는 사건 을 가 져 올 때 수사 대상 설명자 집합 전 체 를 옮 겨 다 닐 필요 가 없습니다.커 널 I / O 이벤트 에 의 해 비동기 적 으로 깨 어 나 Ready 대기 열 에 들 어 가 는 설명자 집합 을 옮 겨 다 니 면 됩 니 다.
헤더 파일 을 포함 하 는 \ # include < sys / epoll. h > 와 몇 개의 간단 한 API 를 통 해 네트워크 서버 의 지원 자 를 크게 늘 릴 수 있 습 니 다.
epoll 동작 총 4 개 API: epollcreate, epoll_ctl, epoll_wait 와 close.epoll 의 인 터 페 이 스 는 다음 과 같 습 니 다.
int epoll_create(int size);
int epoll_ctl(int epfd,int op, int fd, struct epoll_event *event);
int epoll_wait(int epfd,struct epoll_event * events, int max_events, int timeout);
그 중 에 사 용 된 두 개의 epoll 데이터 형식:
typedef union epoll_data {
void *ptr;
int fd;
__uint32_t u32;
__uint64_t u64;
} epoll_data_t;
struct epoll_event {
__uint32_t events; /* Epoll events */
epoll_data_t data; /* User data variable */
};
epoll_create 함수 가 epoll 파일 설명 자 를 만 듭 니 다. 매개 변수 size 는 epoll 이 감청 할 수 있 는 설명자 의 최대 개 수 를 제한 하 는 것 이 아니 라 커 널 초기 에 내부 데이터 구 조 를 할당 하 는 것 에 대한 건의 일 뿐 입 니 다.되 돌아 오 는 것 은 epoll 설명자 입 니 다. -1. 생 성 에 실 패 했 음 을 나타 낸다.여기 서 주의해 야 할 것 은 epoll 이 만들어 지면 fd 의 값 을 차지 합 니 다.
epoll_ctl 지정 한 설명자 fd 에 대한 op 작업 을 제어 합 니 다.
op 작업 은 세 가지 가 있 습 니 다.
EPOLL_CTL_ADD: 새로운 설명자 fd 추가 하기;
EPOLL_CTL_DEL: 파일 설명자 fd 삭제;
EPOLL_CTL_MOD: 파일 설명자 fd 의 감청 사건 을 수정 합 니 다.
이 함수 의 epfd 는 epoll 입 니 다.create 의 반환 값 입 니 다.
이 벤트 는 fd 와 관련 된 감청 사건 으로 이 사건 들 은 주로 다음 과 같은 몇 가지 가 있 습 니 다.
EPOLLIN: 해당 하 는 파일 설명 자 를 읽 을 수 있 음 을 표시 합 니 다 (엔 드 SOCKET 의 정상 적 인 닫 기 포함).EPOLLOUT: 대응 하 는 파일 설명 자 를 표시 합 니 다.EPOLLPRI: 대응 하 는 파일 설명자 에 읽 을 수 있 는 긴급 한 데이터 가 있 음 을 표시 합 니 다 (여 기 는 외부 데이터 가 왔 음 을 표시 해 야 합 니 다).EPOLLERR: 대응 하 는 파일 설명자 에 오류 가 발생 했 음 을 표시 합 니 다.EPOLLHUP: 대응 하 는 파일 설명자 가 끊 겼 음 을 표시 합 니 다.EPOLLET: EPOLL 을 가장자리 트리거 (Edge Triggered) 모드 로 설정 합 니 다. 이것 은 수평 트리거 (Level Triggered) 에 비해 말 합 니 다.EPOLLONESHOT: 사건 을 한 번 만 감청 합 니 다. 이번 사건 을 감청 한 후에 도 이 socket 을 계속 감청 해 야 한다 면 이 socket 을 다시 EPOLL 대기 열 에 넣 어야 합 니 다.
epoll_wait epfd 의 io 이 벤트 를 기다 리 고 최대 max 이벤트 개 이 벤트 를 되 돌려 줍 니 다.
select / poll 에서 프로 세 스 는 일정한 방법 을 호출 한 후에 만 커 널 에서 모든 감시 파일 설명 자 를 스 캔 할 수 있 으 며, epoll 은 사전에 epoll 을 통 해ctl () 은 파일 설명 자 를 등록 합 니 다. 파일 설명자 가 준비 되면 커 널 은 callback 과 같은 리 셋 체 제 를 사용 하여 이 파일 설명 자 를 신속하게 활성화 합 니 다. 프로 세 스 가 epoll 을 호출 할 때wait () 시 알림 을 받 습 니 다.
epoll 의 장점 은 주로 몇 가지 측면 입 니 다.
1. 감시 하 는 설명자 의 수량 은 제한 을 받 지 않 습 니 다. 지원 하 는 FD 상한 선 은 파일 을 열 수 있 는 최대 수량 입 니 다. 이 숫자 는 보통 2048 보다 훨씬 큽 니 다. 예 를 들 어 1GB 메모리 의 기계 에 서 는 약 10 만 정도 입 니 다. 구체 적 인 수량 은 cat / proc / sys / fs / file - max 에서 볼 수 있 습 니 다. 한편, 이 숫자 는 시스템 메모리 와 관계 가 매우 큽 니 다.select 의 가장 큰 단점 은 프로 세 스 가 열 린 fd 가 수량 제한 이 있다 는 것 이다.이 는 접속 수가 많은 서버 로 서 는 만족 할 수 없다.다 중 프로 세 스 솔 루 션 (Apache 는 이렇게 이 루어 집 니 다) 을 선택 할 수도 있 지만 Liux 에서 프로 세 스 를 만 드 는 대가 가 비교적 적 지만 무시 할 수 없습니다. 게다가 프로 세 스 간 데이터 동기 화 는 온라인 에서 동기 화 되 지 않 는 것 보다 훨씬 효율 적 이기 때문에 완벽 한 방안 도 아 닙 니 다.
2. IO 의 효율 은 fd 의 수량 증가 에 따라 떨 어 지지 않 습 니 다.epoll 은 select 와 poll 폴 링 방식 과 달리 모든 fd 가 정의 하 는 리 턴 함수 로 이 루어 집 니 다.준 비 된 fd 만 리 셋 함 수 를 실행 할 수 있 습 니 다.
3. 레벨 트리거 와 사 이 드 트리거 를 지원 합 니 다.
4. mmap 는 커 널 과 사용자 공간의 정보 전달 을 가속 화 합 니 다.epoll 은 커 널 을 통 해 사용자 공간 mmap 와 같은 메모리 로 불필요 한 메모리 복사 가 피 할 수 있 습 니 다.
epoll 에 대한 구체 적 인 사용 참고: 클릭 하여 링크 열기
몇 가지 다 중 I / O 비교: 클릭 하여 링크 열기
예 를 들 면 이렇다.
만약 당신 이 대학 에서 공부한다 고 가정 하면 기숙사 건물 에 방 이 많 습 니 다. 당신 의 친구 가 당신 을 찾 아 올 것 입 니 다.selection 판 숙 관 아 줌 마 는 친 구 를 데 리 고 방 을 찾 아 갈 것 이다.그리고 epoll 판 숙 관 아 줌 마 는 먼저 모든 친구 들 의 방 번 호 를 기록 할 것 입 니 다. 당신 의 친구 가 올 때 당신 의 친구 에 게 어느 방 에 사 는 지 알려 주면 됩 니 다. 당신 의 친 구 를 데 리 고 빌딩 에 사람 을 찾 지 않 아 도 됩 니 다.10000 명 이 오 면 이 건물 에 사 는 친 구 를 찾 아야 할 때 select 판 과 epoll 판 숙 관 아 줌 마 는 누구의 효율 이 더 높 은 지 는 자명 하 다.마찬가지 로 높 은 병발 서버 에서 폴 링 I / O 는 가장 시간 을 소모 하 는 작업 중 하나 이 며, select 와 epoll 의 성능 은 누구의 성능 이 더 높 은 지, 마찬가지 로 10 이 분명 하 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.