2013-05-09 2 views
9

Linux UDP 수신 버퍼의 최대 크기는 얼마입니까? 나는 그것을에만 사용할 수 RAM에 의해 제한의 사상,하지만 난 rmem_max에 대한Linux UDP 수신 버퍼의 최대 크기

5기가바이트을 설정할 때 : I 측정

gen_udp:listen(Port, [{recbuf, 4000000000}]) 

: (얼랑에서) 실제의 소켓 버퍼

echo 5000000000 > /proc/sys/net/core/rmem_max 

4GB의 버퍼 사용률은 다음과 같습니다 :

# netstat -u6anp | grep 5050 
udp6 1409995136  0 :::5050 :::*  13483/beam.smp 

이 1.4GB를 초과 할 수 없습니다. 더 작은 버퍼 크기, 예를 들면. 500MB, 실제 버퍼 크기는 구성된 값과 일치합니다. 제 시스템은 데비안 6.0입니다.이 시스템은 50GB RAM을 사용할 수 있습니다.

+1

사용 가능한 RAM에 의해서만 제한적이라고 말하는 곳은 어디입니까? 왜 4GB 버퍼가 필요하다고 생각하십니까? – EJP

+0

그렇지 않습니다. 다른 방법으로도 제한적이라고 말하지는 않습니다. 더 긴 네트워크 트래픽 엿봄 동안에 자료 손실을 피하기 위하여 그런 완충기를 필요로한다. –

+1

반대로. 커널이 여러분이 제공 한 값을 조정할 수도 있고, 실제로 할당 된 값을 알아보기 위해 getsockopt()를 호출 할 것을 조언합니다. 트래픽 최고치를 처리하는 데 4GB가 필요하다고 생각하기 어렵습니다. 아마 당신은 단지 더 빨리 읽어야합니다. – EJP

답변

9

리눅스에는 한계가있는 것으로 보입니다. 나는 rmem_max를 2^32-1로 설정하려고 시도했다.^32

[email protected]:/proc/sys/net/core# echo 2147483647 > rmem_max 
    [email protected]:/proc/sys/net/core# cat rmem_max 
    2147483647 

이 너무 많이했다 :

[email protected]:/proc/sys/net/core# echo 2147483648 > rmem_max 
    [email protected]:/proc/sys/net/core# cat rmem_max 
    -18446744071562067968 

은 5,000,000,000 수율로 설정 :

[email protected]:/proc/sys/net/core# echo 5000000000 > rmem_max 
    [email protected]:/proc/sys/net/core# cat rmem_max 
    705032704 

내가 설정하고 소켓을 점점

ss.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufferSize) 
    print ss.getsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF) 
와 수신 버퍼 것을 파이썬에서 테스트 한

'bufferSize' 1024^3 프로그램 인쇄가 두 배가 된 'bufferSize'보다 작 으면 256으로 되돌아갑니다.

값 705032704 * 2 = 1410065408은 netstat에서 얻은 1409995136에 가깝습니다. /proc 파일 시스템에 반향

+0

실제로 저는 rmem_max에 실제 값을 넣었는지 확인하지 않았습니다. 감사. 버퍼 크기가 명시적인 이유없이 부호있는 int로 제한되는 것 같습니다. –

0

2^32-1 (2,147,483,647 최대 32 비트 부호있는 정수)

[email protected]@localhost:~# sysctl -w net.core.rmem_max=2147483647 
net.core.rmem_max = 2147483647 

[email protected]:~# sysctl -w net.core.rmem_max=2147483648 
sysctl: setting key "net.core.rmem_max": Invalid argument 
net.core.rmem_max = 2147483648 

큰 값을 설정하려고 할 때 오버플로 나타난다.