네트워킹은 운영체제에서 최악의 영역이므로 불완전한 질문을하는 것을 용서합니다. 나는 이것에 대해 몇 시간 동안 읽고 있었지만, 그것은 내 머리 속에서 다소 수영하고있다. (내게는 네트워킹 프로토콜을 알아내는 것보다 칩 디자인이 쉽다.)리눅스 소켓 : 0 로컬 복사, TCP/IP 리모트
소켓을 통해 서로 통신하는 네트워크 서비스가 있습니다. 특히, 소켓은 fd = socket(PF_INET, SOCK_STREAM, 0);
으로 작성되며, TCP/IP를 자동으로 가져옵니다. 이 서비스는 별도의 컴퓨터에서 실행될 수 있으므로 기본 케이스로 필요합니다.
그러나 한 프로젝트에서 우리는 Atom Z530P를 기반으로하는 부족한 임베디드 '어플라이언스'에 모든 것을 넣으려고합니다. 따라서 메모리 복사 오버 헤드는 우리가 최적화 할 수있는 것입니다. 나는 그것에 대해 여기에서 읽었습니다 : data-link-access-and-zero-copy 및 Linux_packet_mmap 및 packet_mmap.
이 경우에는 fd = socket(PF_PACKET, PF_RAW, 0);
과 같은 소켓이 생성됩니다. 링 버퍼 할당, mmapping, 소켓 연결 등과 같이 데이터를 전송하기 위해 sendto
과 recvfrom
을 사용하는 것으로 제한되어있는 것처럼 보입니다. 소켓은 로컬이므로 신뢰할 수있는 "스트림"유형 소켓이 필요하지 않으므로 원시 소켓이 적절한 인터페이스이고 나는 이라고 생각합니다. 페이지 버퍼에서 페이지 세분성을 사용한다고 추측합니다. 각 패킷 (또는 데이터 그램)은 페이지 경계에서 시작됩니다. 나는이 추가 조사를하려고 많은 시간을 할애하기 전에
, 나는 몇 가지 유용한 개인을 기대했다하는 것은 몇 가지 질문 좀 도와 수 있습니다
- 얼마나 성능 이점 나는 제로에서 여기까지 기대한다 복사 소켓? 내가 마지막으로 점검 한 것, 우리는 최대을 한 프로세스에서 다른 프로세스로 40MB/초로 이동하고 마침내 디스크로 이동한다고 생각합니다. 가장 기본적인 시나리오에서, 데이터는 캡처 프로세스에서 일대 다 프로세스 (다른 사람들이 스트림에서들을 수 있음)에서 디스크에 기록하는 아카이버 프로세스로 이동합니다. 디스크와 내부 물건을 포함하지 않는 2 개의 홉입니다.
- Linux는 자동으로 동일한 작업을 수행하며 동일한 시스템에서 실행되는 프로세스를 최적화합니까?
- 어쨌든 나는 TCP 포트에서 소켓을 듣고있다. 이들을 사용하여 프로세스간에 연결을 만들 수 있지만 여전히 제로 - 사본을 사용할 수 있습니까? 즉, PF_PACKET과 함께 AF_INET을 사용할 수 있습니까?
- SOCK_RAW가있는 PF_PACKET은 제로 복사 소켓에 대해서만 유효한 구성입니까?
- fallback으로 TCP/IP와 함께 zero-copy를 사용할 수있는 좋은 샘플 코드가 있습니까?
- 2 개의 프로세스가 동일한 시스템에 있음을 감지하는 가장 간단하거나 가장 좋은 방법은 무엇입니까? 그들은 서로의 IP 주소를 알고 있으므로 서로 다른 코드 경로를 비교하고 사용할 수 있습니다. 이 작업을 수행하는 더 간단한 방법이 있습니까?
- 패킷 기반 소켓에서 write() 및 read()를 사용할 수 있습니까? 아니면 스트림에만 유효합니까? (연결을 만드는 방법을 다시 작성하면 소켓 코드를 모두 다시 작성하는 것이 더 간단 해집니다.)
- 과도하게 복잡하거나 잘못된 것을 최적화하고 있습니까? OProfiler는 대부분의 CPU 시간이 (1) zlib과 (2) vmlinux를 제공하지 않는 CentOS 6.2를 사용하고 있기 때문에 프로파일 링 할 수없는 커널이라는 두 장소에서 보냈다고합니다. 필자는 커널 시간이 유휴 시간과 데이터 복사의 조합이라고 가정합니다.
미리 도움을 청하십시오!