Linux   发布时间:2022-04-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了linux – 连接时“没有可用的缓冲区空间”大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

当进程在 Linux虚拟机上调用“connect”时,我看到错误消息“No buffer space available”.我无法追查原因 – 希望有人可以提供帮助! 我检查了以下内容: (1)文件句柄: cat /proc/sys/fs/file-nr 4672 0 810707 我正在读这个(已分配,未使用,可用)所以这看起来不错. (2)套接字或TCP内存: cat /proc/sys/ne
当进程在 Linux虚拟机上@L_450_1@“connect”时,我看到错误消息“No buffer space available”.我无法追查原因 – 希望有人可以提供帮助!

我检查了以下内容

(1)文件句柄:

cat /proc/sys/fs/file-nr
4672 0 810707

我正在读这个(已分配,未使用,可用)所以这看起来不错.

(2)套接字或TCP内存:

cat /proc/sys/net/ipv4/tcp_mem
191889 255854 383778

cat /proc/net/sockstat
sockets: used 579
TCP: inuse 169 orphan 0 tw 245 alloc 187 mem 5
UDP: inuse 31 mem 4
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0

读这个只使用了579个套接字,页面总数低于最大值.

谷歌上有很多随机的TCP调整 – 我在答案中希望的是(1)我正在耗尽的资源,(2)如何确定当前值以及(3)如何调整天花板.我发现的大多数页面都缺少除(3)以外的所有内容

**更新#1 **

在Flup的建议中,当它发生时我做了一个systrace(使用ping):

socket(PF_INET,SOCK_DGRAM,IPPROTO_Ip) = 4
connect(4,{sa_family=AF_INET,sin_port=htons(1025),sin_addr=inet_addr("10.140.0.65")},16) = -1 ENOBUFS (No buffer space availablE)

**更新#2 **

我对linux内核源代码了解不多,但是我有一个挖掘,而且我可以看到ENOBUFS在connect()路径中唯一的位置:
http://lxr.free-electrons.com/source/net/ipv4/af_inet.c?v=3.11#L353

这看起来像是在内核中使用kmem_cache_alloc和security_sk_alloc来分配内容……?

解决方法

@H_801_48@ 在3.6之前的内核中,您可能已经被ENOBUFS用于常规IPv4 / v6流量,
当net.ipv4.route.max_size或net.ipv6.route.max_size limit was depleated,accordingly时.

从内核3.6,routing cache was removed和net.ipv4.route.max_size开始,它失去了对dst条目数量的影响.所以,通常情况下,这将不再可能.

但是,在使用IPSec时,您仍然可以像我一样遇到此错误.在创建了一定数量的IPSec隧道之后,我无法ping远程主机:

# ping 10.100.0.1
connect: No buffer space available

从iputils ping创建测试文件描述符,并在其上使用COnnect()来绑定dst ip.当它发生时,内核创建给定AF的dst缓存条目,
在我的情况下,xfrm4 dst缓存条目限制已经耗尽.此限制由sysctl设置控制:

xfrm4_gc_thresh - IntegeR
    The threshold at which we will start garbage collecTing for IPv4
    desTination cache entries.  At twice this value the system will
    refuse new alLOCATIOns.

我使用内核3.10.59遇到了这个问题,认限制非常低 – 1024.
从内核3.10.83开始,此限制增加到32768,并且将是much harder to hit.

所以,我发了:

# sysctl net.ipv4.xfrm4_gc_thresh=32768

它为我做了一件事.

使用IPSec的内核中的近似路径:

ip4_datagram_connect() -> ip_route_connect() -> ip_route_output_flow() ->
xfrm_lookup() -> xfrm_resolve_and_create_bundle() ->
... -> xfrm_alloc_dst() -> dst_alloc() with xfrm4_dst_ops,where gc is set.

大佬总结

以上是大佬教程为你收集整理的linux – 连接时“没有可用的缓冲区空间”全部内容,希望文章能够帮你解决linux – 连接时“没有可用的缓冲区空间”所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。