Linux的默认套接字缓冲区大小是多少? 有没有命令可以查看它?
如果你想在终端中查看缓冲区大小,可以查看以下内容:
/proc/sys/net/ipv4/tcp_rmem
(用于读取)/proc/sys/net/ipv4/tcp_wmem
(用于写入)它们包含三个数字,分别是最小值、默认值和最大内存大小值(以字节为单位)。
要在C/C++程序中获取缓冲区大小,可以按以下步骤进行
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
socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
是否安全?我在我的 Swift TCP 框架中使用这个 C 调用来获取缓冲区大小以减少 recv
调用。 - DevAndArtist正如已经指出的那样,可以在/proc
中查看当前默认套接字缓冲区大小,也可以使用sysctl
检查它们(注意:虽然名称包含ipv4,但这些大小也适用于ipv6套接字 - ipv6 tcp_v6_init_sock()代码只是调用ipv4 tcp_init_sock()函数):
sysctl net.ipv4.tcp_rmem
sysctl net.ipv4.tcp_wmem
ss -tm
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)
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
我仍在努力整理细节,但是除了已经给出的答案之外,以下是一些重要的命令:
cat /proc/sys/net/ipv4/udp_mem
cat /proc/sys/net/core/rmem_max
cat /proc/sys/net/ipv4/tcp_rmem
cat /proc/sys/net/ipv4/tcp_wmem
ss -m # see `man ss`
参考资料和帮助页面:
man 7 socket
man 7 udp
man 7 tcp
man ss
原子大小为4096字节,最大大小为65536字节。Sendfile使用16个管道,每个管道的大小为4096字节。 命令:ioctl(fd,FIONREAD,&buff_size)。
sendfile()
have to do with it; and where have you answered the question about the default socket buffer size?"请问什么是“原子大小”?sendfile()
与此有什么关系?你在哪里回答了关于默认套接字缓冲区大小的问题? - user207421sendfile()
无关,因此与之毫无关系,原子传输大小也是如此。 - user207421
/proc/sys/net/core/rmem_default
з”ЁдәҺжҺҘ收ж“ҚдҪңпјҢд»ҘеҸҠ/proc/sys/net/core/wmem_default
з”ЁдәҺеҸ‘йҖҒж“ҚдҪңпјҢеҸӮиҖғй“ҫжҺҘпјҡhttp://man7.org/linux/man-pages/man7/socket.7.htmlгҖӮ - Okkenatorman 7 tcp
和man 7 udp
中找到了更详细的描述。 - Vladimír Čunátman 7 socket
,并搜索proc interfaces
。 - Gabriel Staples