【问题标题】:TCP connect error "No buffer space available"TCP 连接错误“没有可用的缓冲区空间”
【发布时间】:2012-04-26 23:27:31
【问题描述】:

我在大规模(2048 台机器)测试自制分布式键值存储时遇到此错误,它在 1024 台机器上运行良好。通信模式是 n:n,这意味着每台机器都会向其他机器发送大量请求。 我使用 C TCP socket 来实现它, SO_REUSEADDR 来回收那些套接字。 谁能给我一些关于可能导致此错误的可能性的提示?代码很复杂,很难在不丢失必要逻辑的情况下简化并在此处发布。所以我只想知道开始调试的所有可能原因。

顺便说一句,我将设置更改为: echo 8000 > /proc/sys/kernel/threads-max

echo 8000 > /proc/sys/net/core/somaxconn #监听队列的限制,默认为128

echo 8000 > /proc/sys/net/core/netdev_max_backlog

echo 10 > /proc/sys/net/ipv4/tcp_fin_timeout

echo "10000 65000" > /proc/sys/net/ipv4/ip_local_port_range

我这样做只是为了启用最大连接数。

谢谢, -托尼

【问题讨论】:

  • 打开的描述符太多可能会导致此错误,还有 MTU 错误配置和许多其他情况,我想。如果没有一些显示问题的最小代码示例,就无法确定。
  • 错误不是我之前遇到的“打开的文件描述符太多”。我也有这些设置: echo 8000 > /proc/sys/kernel/threads-max;;回声 8000 > /proc/sys/net/core/somaxconn;;回声 8000 > /proc/sys/net/core/netdev_max_backlog;;回声 10 > /proc/sys/net/ipv4/tcp_fin_timeout;; echo "10000 65000" > /proc/sys/net/ipv4/ip_local_port_range

标签: c sockets tcp connection


【解决方案1】:

我遇到了与您的“没有可用的缓冲区空间”错误相同的问题。你做的那个回声补丁被认为是临时设置。

使用 echo 更改临时设置后(如上所述),您将需要重新启动网络,这将清除“没有可用的缓冲区空间”错误。

您需要通过在 /etc/sysctl.conf 文件末尾添加以下行来添加永久设置:

somaxconn = 8000

请看这里: http://www.cyberciti.biz/files/linux-kernel/Documentation/networking/ip-sysctl.txt

希望对你有帮助。

罗伯特

http://NetworkCities.com

【讨论】:

    猜你喜欢
    • 2016-08-08
    • 2015-06-05
    • 2011-05-25
    • 2018-03-11
    • 2013-08-22
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多