2013-05-09 54 views
9

Kích thước tối đa của bộ đệm nhận UDP Linux là gì? Tôi nghĩ nó chỉ bị giới hạn bởi bộ nhớ RAM có sẵn, nhưng khi tôi đặtKích thước tối đa của Linux UDP của bộ đệm nhận

5GB cho rmem_max:

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

và 4GB cho bộ đệm ổ cắm thực tế (trong Erlang):

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

Khi tôi đo lường việc sử dụng bộ đệm hiển thị:

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

Tôi không thể vượt quá 1,4 GB này. Đối với kích thước bộ đệm nhỏ hơn, ví dụ: 500MB, kích thước bộ đệm thực tế phù hợp với giá trị được định cấu hình. Hệ thống của tôi là Debian 6.0, máy có RAM 50GB.

+1

Trường hợp nói nó chỉ bị giới hạn bởi RAM có sẵn? Và tại sao bạn nghĩ rằng bạn cần một bộ đệm 4GB? – EJP

+0

Không. Nó không nói nó bị hạn chế theo bất kỳ cách nào khác. Tôi cần một bộ đệm như vậy để tránh mất dữ liệu trong thời gian lưu lượng truy cập mạng dài hơn. –

+1

Ngược lại. Nó nói rằng hạt nhân có thể điều chỉnh giá trị bạn cung cấp lên hoặc xuống, và khuyên bạn nên gọi 'getsockopt()' để xem giá trị nào thực sự được phân bổ. Tôi thấy khó tin rằng bạn cần 4GB để xử lý các điểm lưu lượng truy cập. Có lẽ bạn nên đọc nhanh hơn. – EJP

Trả lời

9

Dường như có giới hạn trong linux. Tôi đã thử cài đặt rmem_max thành 2^32-1 thành công.

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

2^32 là quá nhiều:

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

Thiết đến 5000000000 sản lượng:

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

Tôi đã thử nghiệm trong python rằng cài đặt và nhận được ổ cắm nhận đệm với

ss.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufferSize) 
    print ss.getsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF) 

Nếu 'bufferSize' là ít hơn 1024^3 bản in chương trình tăng gấp đôi 'bufferSize', nếu không nó sẽ giảm xuống 256.

Giá trị 705032704 * 2 = 1410065408 gần với 1409995136 thu được bằng netstat.

+0

Thật vậy, tôi chưa xác minh giá trị thực được đưa vào rmem_max. Cảm ơn. Dường như kích thước bộ đệm được giới hạn trong int đã ký không có lý do rõ ràng. –

0

2^32-1 (2147483647, tối đa 32bit ký số nguyên)

[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 

Vang vọng vào /proc hệ thống tập tin dường như tràn khi cố gắng thiết lập các giá trị lớn hơn.