Linux UDP max size of receive buffer
It seems that there is a limit in linux.
I have tried setting rmem_max to 2^32-1 with success.
root@xxx:/proc/sys/net/core# echo 2147483647 > rmem_max
root@xxx:/proc/sys/net/core# cat rmem_max
2147483647
2^32 was too much:
root@xxx:/proc/sys/net/core# echo 2147483648 > rmem_max
root@xxx:/proc/sys/net/core# cat rmem_max
-18446744071562067968
Setting to 5000000000 yields:
root@xxx:/proc/sys/net/core# echo 5000000000 > rmem_max
root@xxx:/proc/sys/net/core# cat rmem_max
705032704
I have tested in python that setting and getting socket receive buffer with
ss.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufferSize)
print ss.getsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF)
If 'bufferSize' is less then 1024^3 program prints doubled 'bufferSize', otherwise it falls back to 256.
The value 705032704*2 = 1410065408 is close to the 1409995136 obtained by netstat.
How to monitor Linux UDP buffer available space?
Linux provides the files /proc/net/udp
and /proc/net/udp6
, which lists all open UDP sockets (for IPv4 and IPv6, respectively). In both of them, the columns tx_queue
and rx_queue
show the outgoing and incoming queues in bytes.
If everything is working as expected, you usually will not see any value different than zero in those two columns: as soon as your application generates packets they are sent through the network, and as soon those packets arrive from the network your application will wake up and receive them (the recv
call immediately returns). You may see the rx_queue
go up if your application has the socket open but is not invoking recv
to receive the data, or if it is not processing such data fast enough.
Specifying UDP receive buffer size at runtime in Linux
You can increase the value from the default, but you can't increase it beyond the maximum value. Use setsockopt
to change the SO_RCVBUF
option:
int n = 1024 * 1024;
if (setsockopt(socket, SOL_SOCKET, SO_RCVBUF, &n, sizeof(n)) == -1) {
// deal with failure, or ignore if you can live with the default size
}
Note that this is the portable solution; it should work on any POSIX platform for increasing the receive buffer size. Linux has had autotuning for a while now (since 2.6.7, and with reasonable maximum buffer sizes since 2.6.17), which automatically adjusts the receive buffer size based on load. On kernels with autotuning, it is recommended that you not set the receive buffer size using setsockopt
, as that will disable the kernel's autotuning. Using setsockopt
to adjust the buffer size may still be necessary on other platforms, however.
what size of the buffer is sufficient for UDP case of recvfrom?
The maximum size of an UDP datagram is 64k. Unless you're allocating a lot of buffers, just use this size.
Related Topics
Bash: Get List of Commands Starting with a Given String
Search Ms Word Files in a Directory for Specific Content in Linux
I Can't Execute Command Modprobe Vboxdrv
Rtnetlink Answers :No Such File or Directory Error
Is a Core Dump Executable by Itself
How to Make Awk Use the Variable Created in Bash Script
Linker Cannot Find Symbols, But Libraries Are Read and Symbols Exist
On Linux, How to Make Sure to Unlock a Mutex Which Was Locked in a Thread That Dies/Terminates
How Are Percpu Pointers Implemented in the Linux Kernel
Which Stack Is Used by Interrupt Handler - Linux
How to "Git Pull" - Host Key Verification Failed
Simulate Network Latency on Specific Port Using Tc
Determine Usb Device File Path