TCP连接错误“没有可用的缓冲区空间”

问题描述:

我在测试超大规模(2048台机器)上的自制分布式键值存储时遇到此错误,它在1024台计算机上正常工作。通信模式是n:n,这意味着每台机器都会向其他人发送大量请求。 我使用C TCP套接字来实现它,SO_REUSEADDR来回收这些套接字。 任何人都可以给我一些关于可能导致这个错误的提示吗?代码很复杂,很难简化它并在这里发布而不会丢失必要的逻辑。所以我只想知道所有可能的原因开始调试。TCP连接错误“没有可用的缓冲区空间”

BTW我改变设置: 呼应8000>的/ proc/sys目录/内核/线程-MAX

呼应听队列8000>的/ proc/SYS /网/核心/ SOMAXCONN #limit,默认为128

回声8000>的/ proc/SYS /净/型芯/ netdev_max_backlog

回声10>的/ proc/SYS /净/的IPv4/tcp_fin_timeout

回声 “10000 65000”>/PROC/SYS /净/ ipv4/ip_local_port_range

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

感谢, 托尼

+0

打开了太多的描述可能会导致这个错误,也MTU错误配置和其他一些条件,我想。不可能确保没有显示问题的最小代码示例。 – 2012-04-15 08:13:53

+0

这个错误并不是我之前遇到过的“太多打开的文件描述符”。我也有这些设置:echo 8000>/proc/sys/kernel/threads-max ;; echo 8000>/proc/sys/net/core/somaxconn ;; 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 – Tony 2012-04-15 08:19:16

我有同样的问题,因为你的“无缓冲区空间可用”的错误。你做的回声补丁被认为是临时设置。

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

您将需要通过增加线在/etc/sysctl.conf文件的末尾添加永久设置:

SOMAXCONN = 8000

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

希望它帮助。

罗伯特

http://NetworkCities.com