sendfile 원리, 파일 전송 성능 향상 실현

2065 단어 Linux
apache, nginx, lighttpd 등 웹 서버 에 sendfile 과 관련 된 설정 이 있 습 니 다. 일부 인터넷 자료 에서 sendfile 이 파일 전송 성능 을 향상 시 킬 것 이 라 고 언급 했 습 니 다. 그러면 sendfile 은 도대체 무엇 입 니까?그것 의 원 리 는 또 어 떻 습 니까?
전통 적 인 파일 전송 에서 (read / write 방식) 실현 에 있어 서 는 비교적 복잡 합 니 다. 여러 번 문맥 의 전환 을 거 쳐 다음 과 같은 두 줄 의 코드 를 살 펴 보 겠 습 니 다.

read(file, tmp_buf, len);
write(socket, tmp_buf, len);

상기 두 줄 코드 는 전통 적 인 read / write 방식 으로 파일 을 socket 으로 전송 하 는 것 입 니 다.
파일 을 전송 해 야 할 때 구체 적 인 절 차 는 다음 과 같 습 니 다.
1. read 함 수 를 호출 하고 파일 데 이 터 를 커 널 버퍼 에 복사 합 니 다.
2, read 함수 반환, 파일 데 이 터 는 커 널 버퍼 copy 에서 사용자 버퍼 로
3. write 함수 호출, 파일 데 이 터 를 사용자 버퍼 에서 커 널 과 socket 관련 버퍼 로 복사 합 니 다.
4. 데 이 터 는 socket 버퍼 에서 관련 프로 토 콜 엔진 으로 복사 합 니 다.
이상 의 세부 사항 은 전통 적 인 read / write 방식 으로 네트워크 파일 을 전송 하 는 방식 입 니 다. 이 과정 에서 파일 데 이 터 는 실제 적 으로 네 번 의 copy 작업 을 거 쳤 음 을 알 수 있 습 니 다.
하 드 디스크 - > 커 널 buf - > 사용자 buf - > socket 관련 버퍼 - > 프로 토 콜 엔진
한편, sendfile 시스템 호출 은 상기 여러 번 의 copy 를 줄 이 고 파일 전송 성능 을 향상 시 키 는 방법 을 제공 했다.Sendfile 시스템 호출 은 2.1 버 전 커 널 에서 도 입 된 것 입 니 다.

sendfile(socket, file, len);

실행 프로 세 스 는 다음 과 같 습 니 다.
1. sendfile 시스템 호출, 파일 데 이 터 는 커 널 버퍼 에 복사 되 었 습 니 다.
2. 커 널 버퍼 copy 에서 커 널 socket 과 관련 된 버퍼 로 이동 합 니 다.
3. 마지막 으로 socket 과 관련 된 버퍼 를 프로 토 콜 엔진 으로 복사 합 니 다.
전통 적 인 read / write 방식 에 비해 2.1 버 전의 커 널 이 도입 한 sendfile 은 커 널 버퍼 에서 user 버퍼 까지 줄 였 고 user 버퍼 에서 socket 관련 버퍼 까지 의 파일 copy 를 줄 였 으 며 커 널 버 전 2.4 이후 파일 설명자 결과 가 바 뀌 었 습 니 다. sendfile 은 더욱 간단 한 방식 을 실 현 했 습 니 다. 시스템 호출 방식 은 똑 같 습 니 다. 디 테 일 은 2.1 버 전과 다른 점 은..파일 데이터 가 커 널 버퍼 에 복사 되 었 을 때 모든 데 이 터 를 socket 과 관련 된 버퍼 에 복사 하지 않 고 데이터 위치 와 길이 에 관 한 데 이 터 를 socket 과 관련 된 캐 시 에 저장 합 니 다. 실제 데 이 터 는 DMA 모듈 에서 프로 토 콜 엔진 으로 직접 보 내 복사 작업 을 다시 한 번 줄 입 니 다.
이상 의 묘 사 는 간단 하지만 실제 상황 은 더욱 복잡 해 질 것 입 니 다. 본 고 는 간단 한 방식 으로 sendfile 의 원 리 를 대체적으로 설명 하고 자 합 니 다. 본 고 를 통 해 모든 세부 사항 을 논술 하 는 것 을 바라 지 않 습 니 다. 저도 이런 수준 이 없 기 때문에 이 글 이 친구 들 에 게 도움 이 되 기 를 바 랍 니 다.
참고:http://www.linuxjournal.com/article/6345

좋은 웹페이지 즐겨찾기