如何查找linux的套接字缓冲区大小
- 2024-10-29 08:35:00
- admin 原创
- 51
问题描述:
Linux 默认的套接字缓冲区大小是多少?有命令可以查看吗?
解决方案 1:
如果您想在终端中查看缓冲区大小,您可以查看:
/proc/sys/net/ipv4/tcp_rmem
(供阅读)/proc/sys/net/ipv4/tcp_wmem
(用于写入)
它们包含三个数字,分别是最小、默认和最大内存大小值(以字节为单位)。
解决方案 2:
为了在 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
解决方案 3:
同时,正如已经指出的那样,可以在中查看当前默认套接字缓冲区大小/proc
,也可以使用以下命令检查它们sysctl
(注意:虽然名称包含 ipv4,但这些大小也适用于 ipv6 套接字 - ipv6 tcp_v6_init_sock() 代码只调用 ipv4 tcp_init_sock() 函数):
sysctl net.ipv4.tcp_rmem
sysctl net.ipv4.tcp_wmem
这将返回最小、默认和最大缓冲区大小。但是,默认套接字缓冲区仅在初始化套接字时设置,但内核随后会在这些限制内动态调整它们的大小,除非应用程序使用带有套接字选项的 setsockopt() 更改最大发送缓冲区大小(尽管内核使用双倍的值)SO_SNDBUF
。
可以使用命令( /包ss
的一部分)检查当前打开的套接字的缓冲区的实际大小,该命令还可以提供有关套接字的更多信息,如拥塞控制参数等。例如,列出当前打开的 TCP(选项)套接字和相关内存()信息:iproute
`iproute2t
m`
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)
接收缓冲区带有前缀rb
,发送/传输缓冲区带有前缀tb
。ss手册页skmem
现在显示了返回的各种(套接字内存)信息的定义。
skmem:(r<rmem_alloc>,rb<rcv_buf>,t<wmem_alloc>,tb<snd_buf>, f<fwd_alloc>,w<wmem_queued>,o<opt_mem>,bl<back_log>,d<sock_drop>) <rmem_alloc> the memory allocated for receiving packet <rcv_buf> the total memory can be allocated for receiving packet <wmem_alloc> the memory used for sending packet (which has been sent to layer 3) <snd_buf> the total memory can be allocated for sending packet <fwd_alloc> the memory allocated by the socket as cache, but not used for receiving/sending packet yet. If need memory to send/receive packet, the memory in this cache will be used before allocate additional memory. <wmem_queued> The memory allocated for sending packet (which has not been sent to layer 3) <opt_mem> The memory used for storing socket option, e.g., the key for TCP MD5 signature <back_log> The memory used for the sk backlog queue. On a process context, if the process is receiving packet, and a new packet is received, it will be put into the sk backlog queue, so it can be received by the process immediately <sock_drop> the number of packets dropped before they are de- multiplexed into the socket
该信息来自内核 - 这里是对相关 skmem 变量的简要说明 - 有关更多详细信息,请查看内核源代码(即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 # space allocated forward w:sk_wmem_queued # persistent transmit queue size o:sk_omem_alloc bl:sk_backlog d:sk_drops
解决方案 4:
我仍在尝试拼凑细节,但为了补充已经给出的答案,以下是一些重要的命令:
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
解决方案 5:
原子大小为 4096 字节,最大大小为 65536 字节。Sendfile 使用 16 个管道,每个管道大小为 4096 字节。cmd:ioctl(fd、FIONREAD、&buff_size)。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件