【发布时间】:2021-03-23 10:56:52
【问题描述】:
我正在一个廉价的 Digital Ocean 液滴上测试我的代码(2GB 内存,但我也尝试添加 4GB 交换空间,但没有任何改变)。
我的程序的一部分有许多 UDP 客户端 DGRAM 套接字打开到各种本地端口(从/到 127.0.0.1)。
有时,在没有发送大量数据的情况下,send() 调用会失败并显示No buffer space available(错误 105)。
然后我的程序尝试使用所有其他可用的套接字(用于其他本地端口),但它们同时都失败了。
我已将 /proc/sys/net/core/wmem_max(和 /proc/sys/net/core/rmem_max)设置为 16MB,每个套接字都将 setsockopt SOL_SOCKET, SO_SNDBUF 设置为 8MB。这些都不会改变任何东西。
send() 怎么会因No buffer space available 而失败?这不应该只在我们 send() 太快时发生吗?但这里是本地的,我不会发送很多数据。
最让我困惑的是,当进程重试任何另一个套接字时,它会得到相同的错误。套接字缓冲区不应该是完全独立的吗?
可能的原因是什么?
【问题讨论】:
标签: linux sockets networking udp kernel