What's the default socket buffer size of linux? Is there any command to see it?
4 Answers
If you want see your buffer size in terminal, you can take a look at:
/proc/sys/net/ipv4/tcp_rmem(for read)/proc/sys/net/ipv4/tcp_wmem(for write)
They contain three numbers, which are minimum, default and maximum memory size values (in byte), respectively.
-
21There is also `/proc/sys/net/core/rmem_default` for recv and `/proc/sys/net/core/wmem_default` for send, as referenced http://man7.org/linux/man-pages/man7/socket.7.html – Okkenator May 23 '14 at 19:56
-
2I found more detailed descriptions for these inside `man 7 tcp` and `man 7 udp`. – Vladimír Čunát Jul 01 '19 at 13:39
For getting the buffer size in c/c++ program the following is the flow
int n;
unsigned int m = sizeof(n);
int fdsocket;
fdsocket = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); // example
getsockopt(fdsocket,SOL_SOCKET,SO_RCVBUF,(void *)&n, &m);
// now the variable n will have the socket size
- 9,073
- 146
- 84
- 117
- 6,378
- 5
- 33
- 44
-
1Is it safe to call `socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)` instead? I'm using this C call in my Swift TCP framework to get the buffer size to reduce `recv` calls. – DevAndArtist Jun 18 '16 at 09:25
-
2Note: this is also only the read buffer size, use SO_SNDBUF to get the size of the write buffer. Under at least linux, you can use ioctl SIOCINQ and SIOCOUTQ, to respectfully get the current used state of the buffer. – Rahly Jun 07 '17 at 22:01
Whilst, as has been pointed out, it is possible to see the current default socket buffer sizes in /proc, it is also possible to check them using sysctl (Note: Whilst the name includes ipv4 these sizes also apply to ipv6 sockets - the ipv6 tcp_v6_init_sock() code just calls the ipv4 tcp_init_sock() function):
sysctl net.ipv4.tcp_rmem
sysctl net.ipv4.tcp_wmem
However, the default socket buffers are just set when the sock is initialised but the kernel then dynamically sizes them (unless set using setsockopt() with SO_SNDBUF). The actual size of the buffers for currently open sockets may be inspected using the ss command (part of the iproute/iproute2 package), which can also provide a bunch more info on sockets like congestion control parameter etc. E.g. To list the currently open TCP (t option) sockets and associated memory (m) information:
ss -tm
Here's some example output:
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.56.102:ssh 192.168.56.1:56328
skmem:(r0,rb369280,t0,tb87040,f0,w0,o0,bl0,d0)
Here's a brief explanation of skmem (socket memory) - for more info you'll need to look at the kernel sources (i.e. sock.h):
r:sk_rmem_alloc rb:sk_rcvbuf # current receive buffer size t:sk_wmem_alloc tb:sk_sndbuf # current transmit buffer size f:sk_forward_alloc w:sk_wmem_queued # persistent transmit queue size o:sk_omem_alloc bl:sk_backlog d:sk_drops
- 5,588
- 37
- 55
Atomic size is 4096 bytes, max size is 65536 bytes. Sendfile uses 16 pipes each of 4096 bytes size. cmd : ioctl(fd, FIONREAD, &buff_size).
- 685
- 6
- 13
-
6What does 'atomic size' mean; what does `sendfile()` have to do with it; and where have you answered the question about the default socket buffer size? – user207421 Oct 02 '15 at 07:37
-
@ EJP Atomic size - Linux internals assert for 4096b socket transfer - MT-safe, mutex, 1/16 internal pipes. sandfile has a lot to do with it. I think i have. Default buffer size is 16*4096b. – Dawid Szymański Oct 02 '15 at 10:47
-
1None of this answers the question. It is about socket send and receive buffer sizes. Not about `sendfile()`, which therefore has *nothing* to do with it, nor atomic transfer sizes either, ditto. – user207421 Apr 25 '17 at 22:36