2012-11-16 3 views
2

요청 당 대량의 데이터 (~ 1-2 기가)를 전송해야하는 서버가 있습니다. 보낼 각 호출에 대해 권장되는 데이터 양은 얼마입니까? 그게 그렇게 중요한 건가?C에서 보내기위한 권장 청크 크기는 무엇입니까?

+2

대답은 파일 시스템 블록 크기와 클라이언트와 서버 간의 PMTU와 같은 여러 요소에 따라 달라집니다. PMTU에서 패킷 헤더를 뺀 다음 해당 값보다 작거나 같은 파일 시스템 블록 크기의 최대 배수를 사용하십시오. – cdhowie

+0

실험을하고 더 잘 작동하는 크기를 선택하십시오. – alinsoar

+2

아마도 네트워크 내 조각화를 피하기 위해 MTU 크기와 같거나 그보다 작은 80 %의 크기로 이동하려고합니다. LAN을 통해서만 갈 건가요? 아니면 인터넷을 통해 가고 있습니까? – jedwards

답변

1

TCP/IP 스택은 PATH MTU보다 큰 패킷을 전송하지 않으므로 처리량에 도움이되지 않는 방식으로 보다 작은 패킷을 MTU보다 작게 만들어야합니다. 경로 PTU가 실제로 주어진 연결에 대해 무엇인지를 dsicovering 할 수있는 방법이 없습니다. 따라서 경로 MTU에 대한 모든 고려 사항을 남겨 두십시오.

send()은 가능한 한 크게 만들 수 있습니다.

+0

'send()'1-2 gb를 크게 만들 수는 있지만 메모리 대역폭 때문에 너무 비합리적입니다. 그렇다면 중간 지점은 어디입니까? – chacham15

+0

@ chacham15 '메모리 대역폭'이 아니라 메모리 * 사용법 * 때문에 부당합니다. 따라서 메모리 예산에 맞는 버퍼를 선택하십시오. 나는 8192를 사용하지만 메가 바이트를 사용하지 않을 이유가 없습니다. – EJP

0

패킷 크기는 프로토콜의 최대 전송 단위 (MTU)로 제한됩니다. MTU보다 큰 패킷을 보내면 패킷 단편화가 발생합니다.

당신은 어떤 수학 할 수있는

: http://www.speedguide.net/articles/mtu-what-difference-does-it-make--111 더 참고 : http://en.wikipedia.org/wiki/Maximum_transmission_unit

그러나를 궁극적으로 나의 제안이다 당신이 충분 목표로하고 당신이 원시 소켓 프로그래밍을하지 않는 운영 체제 네트워크 계층, 그 일을 할 경우 또는 몇 가지 펑키 옵션을 전달하면, OS가 네트워크 버퍼를 가지고 최선을 다할 것입니다.

이 마지막 옵션을 고려하면 socket.send()는 사용자 프로세스 메모리에서 커널의 개인 메모리로 메모리를 전송하는 것 외에는 아무것도 없다. 일반적으로 4KB 인 가상 메모리 페이지 크기 인 http://en.wikipedia.org/wiki/Page_(computer_memory을 초과하지 않아야합니다.

+0

그래, 나는 이것을 처리하는 버퍼가있을 것이라고 생각했지만 확실하지는 않았다. 그래도 '합리적인'금액은 무엇입니까? – chacham15

+0

MTU보다 더 큰 패킷을 보낼 수없고 패킷 단편화를 얻을 수 없습니다. TCP/IP 스택은 그렇게하지 않을 것입니다. 소켓 전송 버퍼는 4k보다 훨씬 커야하며 이상적으로는 64k-1이어야합니다. – EJP

관련 문제