2011-12-28 3 views
4

네트워킹은 운영체제에서 최악의 영역이므로 불완전한 질문을하는 것을 용서합니다. 나는 이것에 대해 몇 시간 동안 읽고 있었지만, 그것은 내 머리 속에서 다소 수영하고있다. (내게는 네트워킹 프로토콜을 알아내는 것보다 칩 디자인이 쉽다.)리눅스 소켓 : 0 로컬 복사, TCP/IP 리모트

소켓을 통해 서로 통신하는 네트워크 서비스가 있습니다. 특히, 소켓은 fd = socket(PF_INET, SOCK_STREAM, 0);으로 작성되며, TCP/IP를 자동으로 가져옵니다. 이 서비스는 별도의 컴퓨터에서 실행될 수 있으므로 기본 케이스로 필요합니다.

그러나 한 프로젝트에서 우리는 Atom Z530P를 기반으로하는 부족한 임베디드 '어플라이언스'에 모든 것을 넣으려고합니다. 따라서 메모리 복사 오버 헤드는 우리가 최적화 할 수있는 것입니다. 나는 그것에 대해 여기에서 읽었습니다 : data-link-access-and-zero-copyLinux_packet_mmappacket_mmap.

이 경우에는 fd = socket(PF_PACKET, PF_RAW, 0);과 같은 소켓이 생성됩니다. 링 버퍼 할당, mmapping, 소켓 연결 등과 같이 데이터를 전송하기 위해 sendtorecvfrom을 사용하는 것으로 제한되어있는 것처럼 보입니다. 소켓은 로컬이므로 신뢰할 수있는 "스트림"유형 소켓이 필요하지 않으므로 원시 소켓이 적절한 인터페이스이고 나는 이라고 생각합니다. 페이지 버퍼에서 페이지 세분성을 사용한다고 추측합니다. 각 패킷 (또는 데이터 그램)은 페이지 경계에서 시작됩니다. 나는이 추가 조사를하려고 많은 시간을 할애하기 전에

, 나는 몇 가지 유용한 개인을 기대했다하는 것은 몇 가지 질문 좀 도와 수 있습니다

  • 얼마나 성능 이점 나는 제로에서 여기까지 기대한다 복사 소켓? 내가 마지막으로 점검 한 것, 우리는 최대을 한 프로세스에서 다른 프로세스로 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를 사용하고 있기 때문에 프로파일 링 할 수없는 커널이라는 두 장소에서 보냈다고합니다. 필자는 커널 시간이 유휴 시간과 데이터 복사의 조합이라고 가정합니다.

미리 도움을 청하십시오!

답변

6

지나치게 복잡하거나 잘못된 것을 최적화하고 있습니까?

가능합니다. PF_PACKET 소켓을 사용하는 것은 전문적인 것입니다. 당신은 아마

두 프로세스가 동일한 시스템에 을 것을 감지 할 수있는 가장 간단한 또는 가장 좋은 방법은 무엇입니까 보길 원하는?

이 정보를 "잊어 버리지"마십시오.

Linux가 동일한 머신에서 실행중인 프로세스 에 대해 최적화를 자동으로 수행합니까?

아니요, 직접 처리해야합니다.

2

TCP/IP와 원시 패킷 사이의 선택이 제로 복사 질문보다 훨씬 중요하다고 생각합니다. 안정적인 스트림 기반 통신이 필요하면 TCP/IP (즉, AF_INET + PF_STREAM)가 필요합니다. 신뢰할 수없는 패킷을 통해 안정적인 스트림을 구현하려는 시도는 매우 복잡하며 이미 완료되었습니다.

제로 사본 및 파일과 함께 TCP/IP를 사용하는 가장 좋은 방법은 @cnicutar가 말한 것처럼 sendfile (2) 및 splice (2)입니다. 제 생각에는 파일이 아닌 메모리에 데이터를 읽으려면 zero-copy를 사용하는 것이 좋지만 어떻게해야할지 모르겠습니다.

또한 CentOS는 오픈 소스이기 때문에 소스를 다운로드하고 컴파일하여 vmlinux 파일을 얻을 수 있습니다.