udp套接字接收缓冲区大小
udp socket receive buffer size
我正在使用 Netty(一个 java 网络框架)来处理 UDP 请求。
我找到了
SO_RCVBUF
和
/proc/sys/net/core/rmem_default
和
/proc/net/udp
输出混乱:
根据socket的手册(man 7 socket)是这样解释的:
rmem_default
contains the default setting in bytes of the socket receive
buffer.
rmem_max
contains the maximum socket receive buffer size in bytes which
a user may set by using the SO_RCVBUF socket option.
和 /proc/net/udp 显示 udp 接收队列大小:
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
60: 00000000:2F3C 00000000:0000 07 00000000:0003E094 00:00000000 00000000 500 0 2224362 2 ffff810066908cc0
我可以得到 SO_RCVBUF = 12904,但是 rx_queue 大小是 254100(3E094) , 而 rmem_default 是 262142
我的困惑是,为什么 SO_RCVBUF 不等于 rmem_default,为什么队列大小不等于 SO_RCVBUF(但大于它)?
它接缝 ctx.channel().config().getOption(ChannelOption.SO_RCVBUF)
的值是 /proc/sys/net/core/rmem_default
的一半,实际接收缓冲区大小(队列大小)也是 /proc/sys/net/core/rmem_default
的值
那么为什么 ctx.channel().config().getOption(ChannelOption.SO_RCVBUF)
不等于系统的配置?
您似乎误读了输出。当您正确排列列时,rx_queue
为零。
接受的答案是错误的。正确的对齐方式是:
tx_queue rx_queue
00000000:0003E094
所以 rx_queue
是 0x0003E094
或 254100
。这可以使用 netstat -unlp | grep pid
来确认,Recv-Q
是第二列。示例输出:
cat /proc/net/udp
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode ref pointer drops
8101: 41FD080A:06A5 00000000:0000 07 00000000:00005A00 00:00000000 00000000 1000 0 3892411 2 0000000000000000 0
netstat --udp -nl
Proto Recv-Q Send-Q Local Address Foreign Address State
udp 23040 0 10.8.253.65:1701 0.0.0.0:*
这里,0x00005A00
==23040
我正在使用 Netty(一个 java 网络框架)来处理 UDP 请求。
我找到了
SO_RCVBUF
和
/proc/sys/net/core/rmem_default
和
/proc/net/udp
输出混乱:
根据socket的手册(man 7 socket)是这样解释的:
rmem_default contains the default setting in bytes of the socket receive buffer.
rmem_max contains the maximum socket receive buffer size in bytes which a user may set by using the SO_RCVBUF socket option.
和 /proc/net/udp 显示 udp 接收队列大小:
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
60: 00000000:2F3C 00000000:0000 07 00000000:0003E094 00:00000000 00000000 500 0 2224362 2 ffff810066908cc0
我可以得到 SO_RCVBUF = 12904,但是 rx_queue 大小是 254100(3E094) , 而 rmem_default 是 262142
我的困惑是,为什么 SO_RCVBUF 不等于 rmem_default,为什么队列大小不等于 SO_RCVBUF(但大于它)?
它接缝 ctx.channel().config().getOption(ChannelOption.SO_RCVBUF)
的值是 /proc/sys/net/core/rmem_default
的一半,实际接收缓冲区大小(队列大小)也是 /proc/sys/net/core/rmem_default
那么为什么 ctx.channel().config().getOption(ChannelOption.SO_RCVBUF)
不等于系统的配置?
您似乎误读了输出。当您正确排列列时,rx_queue
为零。
接受的答案是错误的。正确的对齐方式是:
tx_queue rx_queue
00000000:0003E094
所以 rx_queue
是 0x0003E094
或 254100
。这可以使用 netstat -unlp | grep pid
来确认,Recv-Q
是第二列。示例输出:
cat /proc/net/udp
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode ref pointer drops
8101: 41FD080A:06A5 00000000:0000 07 00000000:00005A00 00:00000000 00000000 1000 0 3892411 2 0000000000000000 0
netstat --udp -nl
Proto Recv-Q Send-Q Local Address Foreign Address State
udp 23040 0 10.8.253.65:1701 0.0.0.0:*
这里,0x00005A00
==23040