9

리눅스 커널 (또는 다른 주류 OS)에 제로 카피 네트워킹을위한 기능이없는 이유를 알고 싶습니다. 제로 카피 (zero copy) 란 패킷/데이터 스트림이 사용자 공간에서 애플리케이션으로 전달하기 위해 복사되지 않는다는 것을 의미합니다. 메모리 풀 유형의 할당자를 사용하여 커널과 사용자 공간간에 메모리를 공유합니다. 나는 3 이론을 독자적으로 생각해 냈다 :왜 리눅스 커널에서 zero-copy 네트워킹이 필요하지 않습니까?

a) 보안 문제가 있다고 생각됩니다. 하지만 실제로 버퍼로 사용되는 경우 사용자 공간과 커널간에 메모리를 안전하게 공유 할 수있는 방법이 없습니까?

b) 안정성 문제가 있다고 생각합니다. 하지만 제로 복사 네트워킹을 사용하는 사람은 누구나 커널 호출을 위해 메모리 풀을 초기화하고 전달해야하며 메모리 관리를 알고 있습니까? 누출을 피하기에 충분합니까?

c) 지금까지 완료되지 않았거나 필요하지 않았습니다. 나는 작은 패킷 크기를 사용하는 모든 사람들이 일반적으로 "느린"TCP 스택 구현으로 병목 현상이 발생하고 특수한 용도로 사용하기 위해 0 카피 네트워킹을 위해 제 3 자 도구가 제공되므로이 기능을 요청한 사람은 아무도 없다고 상상할 수 없습니다 네트워크 카드.

어떤 추측을 게시 자유롭게하지만, 표시하시기 바랍니다 당신이 가정 여부

+3

글쎄, 리눅스는 그 기능을 가지고있다. 문제는 바로 그것이다.) 어떤 것들은 옳다는 것이 사소한 것이 아니지만, 이러한 세부 사항을 생각하기 전에 _something_을 구현했다. 그리고 b) 문서는 열악한 소변이다. 관심이 있으시면'splice','tee','vmsplice'를 살펴보십시오. 이를 통해 소켓, 파일 및 파이프 (커널 버퍼) 사이에서 복사하고 페이지를 다시 참조하여 페이지를 다시 매핑 할 수 있으며 페이지를 다시 매핑하여 사용자와 커널 공간간에 복사 할 수 있습니다. 좋은 이론에 대한 많은 부분을 실제로 연습하면 페이지를 만져서는 안되며, 언제 ... 그리고 bleh를 언제 풀 것인지 모릅니다. – Damon

+1

haproxy에 대한 출처를 확인하십시오. 사용자 공간을 통해 복사하는 것을 방지하기 위해'splice'와 파이프를 사용합니다 (이벤트 루프와 파이프 풀 사용으로 소스가 조금 거칩니다). 나는 haproxy의 저자가 소켓을 직접 접합하기위한 커널 패치를 만들고 있다고 들었지만 실제로 더 빨라질지는 확신하지 못했다. – JimB

답변

4

제 3 자 zero-copy networking for Linux가있다, 그것은 표준되지 않습니다 :-) StackOverflow의 품질을 유지하는 이유의 깊은 지식을 가지고 그러나 특징.

TCP 세그먼트가 헤더와 페이로드를 전달하지만 응용 프로그램이 페이로드에만 관련되어 있으므로 페이로드는 처리되지만 헤더는 응용 프로그램의 연속 버퍼에 복사해야하므로 TCP가 포함 된 제로 사본은 불편할 수 있습니다.

+0

세그먼트 헤더가 아직 표준이 아닌 이유가 될 수 있습니다. 그러나 응용 프로그램에서 성능을 떨어 뜨리기 때문에 응용 프로그램에서 볼 수 있는지 여부는 알 수 없으며 페이로드 복사본의 이유를 볼 수 없습니다. +1 – user1610743

+0

@ user1610743 C++에서 프레임 헤더를 건너 뛰고 페이로드를 반복하는 out-of-the-box 반복기가있을 수 있습니다. –

+1

링크가 사망했습니다. 사이트는 아직 가동 중이지만 수명이 길고 유용 할 수있는 링크를 선택해야합니다. –

관련 문제