套接字缓冲区大小不增加
Socket buffer size not increasing
int n = 0;
if ( 0 != getsockopt(iSockFd,SOL_SOCKET,SO_RCVBUF, &n, sizeof(n)))
{
printf("Get socket option failed, errno: %d\n",errno);
}
else
{
printf("Current socket buff len = %d\n", n);
}
n = 225280;
if(0 != setsockopt(iSockFd, SOL_SOCKET, SO_RCVBUF, (const void *)&n, sizeof(n)))
{
printf("setsock err errno %d\n", errno);
}
else
{
printf("setsock opt success\n");
}
n = 0;
if ( 0 != getsockopt(iSockFd,SOL_SOCKET,SO_RCVBUF, &n, sizeof(n)))
{
printf("Get socket option failed, errno: %d\n",errno);
}
else
{
printf("After setting socket buff len = %d\n", n);
}
输出为-
当前套接字buff len = 41600
setsock opt 成功
设置socket buff len = 41600后。
看起来接收缓冲区大小没有增加,知道为什么会这样吗?
提前致谢!
如果内核是较新版本(2.6.17或更高),请通过验证文件/proc/sys/net/ipv4/tcp_moderate_rcvbuf检查是否启用了自动调整。如果 tcp_moderate_rcvbuf 的值为 1,则启用自动调整。在这种情况下,接收缓冲区将由内核动态更新并绑定到 /proc/sys/net/ipv4/tcp_rmem 中的值。检查是否达到此限制。
如果内核是旧版本,请检查SO_RCVBUF是否受限于/proc/sys/net/core/rmem_default和/proc/sys/net/core/rmem_max中的值。
如果是 TCP,还要检查 /proc/sys/net/ipv4/tcp_rmem
的值
还要注意 'Manually adjusting socket buffer sizes with setsockopt() disables autotuning' 。 link 关于 linux http://www.psc.edu/index.php/networking/641-tcp-tune
的调整很好
经常看看 man
页面上写的是什么:
SO_RCVBUF
Sets or gets the maximum socket receive buffer in bytes. The kernel doubles this value (to allow space for bookkeeping
overhead) when it is set using setsockopt(2)
, and this doubled value
is returned by getsockopt(2)
. The default value is set by the
/proc/sys/net/core/rmem_default
file, and the maximum allowed value
is set by the /proc/sys/net/core/rmem_max
file. The minimum
(doubled) value for this option is 256.
http://man7.org/linux/man-pages/man7/socket.7.html
所以有一个上限,任何设置更大值的尝试都会默默地失败,这意味着不会有错误,只是不会增加大小。几乎所有现有系统都存在这样的限制,而不仅仅是 Linux。另请注意,即使您的 setsockopt()
成功,getsockopt()
也会 return 更大的值,因为该值在内部加倍(这是 Linux 独有的,其他系统不这样做那个)。
int n = 0;
if ( 0 != getsockopt(iSockFd,SOL_SOCKET,SO_RCVBUF, &n, sizeof(n)))
{
printf("Get socket option failed, errno: %d\n",errno);
}
else
{
printf("Current socket buff len = %d\n", n);
}
n = 225280;
if(0 != setsockopt(iSockFd, SOL_SOCKET, SO_RCVBUF, (const void *)&n, sizeof(n)))
{
printf("setsock err errno %d\n", errno);
}
else
{
printf("setsock opt success\n");
}
n = 0;
if ( 0 != getsockopt(iSockFd,SOL_SOCKET,SO_RCVBUF, &n, sizeof(n)))
{
printf("Get socket option failed, errno: %d\n",errno);
}
else
{
printf("After setting socket buff len = %d\n", n);
}
输出为-
当前套接字buff len = 41600
setsock opt 成功
设置socket buff len = 41600后。
看起来接收缓冲区大小没有增加,知道为什么会这样吗?
提前致谢!
如果内核是较新版本(2.6.17或更高),请通过验证文件/proc/sys/net/ipv4/tcp_moderate_rcvbuf检查是否启用了自动调整。如果 tcp_moderate_rcvbuf 的值为 1,则启用自动调整。在这种情况下,接收缓冲区将由内核动态更新并绑定到 /proc/sys/net/ipv4/tcp_rmem 中的值。检查是否达到此限制。
如果内核是旧版本,请检查SO_RCVBUF是否受限于/proc/sys/net/core/rmem_default和/proc/sys/net/core/rmem_max中的值。 如果是 TCP,还要检查 /proc/sys/net/ipv4/tcp_rmem
的值还要注意 'Manually adjusting socket buffer sizes with setsockopt() disables autotuning' 。 link 关于 linux http://www.psc.edu/index.php/networking/641-tcp-tune
的调整很好经常看看 man
页面上写的是什么:
SO_RCVBUF
Sets or gets the maximum socket receive buffer in bytes. The kernel doubles this value (to allow space for bookkeeping overhead) when it is set usingsetsockopt(2)
, and this doubled value is returned bygetsockopt(2)
. The default value is set by the/proc/sys/net/core/rmem_default
file, and the maximum allowed value is set by the/proc/sys/net/core/rmem_max
file. The minimum (doubled) value for this option is 256.
http://man7.org/linux/man-pages/man7/socket.7.html
所以有一个上限,任何设置更大值的尝试都会默默地失败,这意味着不会有错误,只是不会增加大小。几乎所有现有系统都存在这样的限制,而不仅仅是 Linux。另请注意,即使您的 setsockopt()
成功,getsockopt()
也会 return 更大的值,因为该值在内部加倍(这是 Linux 独有的,其他系统不这样做那个)。