병렬 서버가 말하지 않을 수 없는 기술 - sendfile

socket 발송 함수.
int send( SOCKET s, const char FAR *buf, int len, int flags );

만약 내용이 동적으로 생성된다면, 일반적으로 전송 내용을 buf에 직접 잃어버리고send 함수로 전송하는데 최적화된 공간이 없다.
파일 전송은 내용read를 buf에 먼저 보내야 하기 때문에 최소한 두 번의 내부 호출을 해야 합니다. 만약 파일이 매우 크면 순환 호출을 사용할 수 있습니다. 예를 들어
while( size ==  PER_SIZE )
{
size = read( fd,  buf, PER_SIZE );
if( size >0 )
{
send( sock, buf, size, 0 );
}
}

시스템 호출의 개수는 파일 크기/매번 읽기 크기*2가 될 것입니다. 시스템 호출은 내부 핵상태와 사용자 상태의 전환, 그리고 시스템 메모리와 사용자 내의 복사가 필요하기 때문에 귀중한 CPU 시간을 낭비하는 것을 알고 있습니다.
정적 파일의 전송은 대량으로 존재한다. 예를 들어 html, css, js, 전송 효율은 서버가 돌아가지 않는 문제이기 때문에 전문적인 최적화가 필요하다.
linux는 2.1 이후부터sendfile로 이런 문제를 전문적으로 해결하기 시작했다.
함수 설명을 살펴보겠습니다.
ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);

매개 변수가 이미 매우 뚜렷하니 더 이상 소개하지 않겠다.
이 함수는 사용자 상태와 내부 핵 상태를 한 번만 전환할 수 있고 모든 조작은 내부 핵에서 조작하여 대량의 CPU 시간을 절약할 수 있으며 사용자 메모리와 내부 핵 메모리의 전환도 없어'0 복사'를 실현했다.
함수 내부는 사실 in_fd,outfd는 이전에 파이프 전송을 건설했고 더 이상 소개하지 않습니다.
이 기술은 현재의 웹 서버에서 대량으로 사용되고 있으며, 정적 파일의 빠른 전송은 그것에 의존한다고 할 수 있다.

좋은 웹페이지 즐겨찾기