Linux报 “no buffer space available”,系统打开文件数过多,系统内存不足,网络接口缓冲区大小设置过小 异常的原因以及解决办法(图文详解1)
Linux 系统中出现 “no buffer space available” 异常是由于网络缓冲区资源耗尽导致的。这可能是由于以下几个原因造成的:
- 系统配置问题:
- 网络接口缓冲区大小设置过小
- 系统打开文件数过多
- 系统内存不足
- 应用程序问题:
- 应用程序没有及时读取或释放网络数据
- 应用程序创建过多的网络连接
- 应用程序使用非阻塞 I/O 操作时未正确处理错误
解决方案如下:
- 调整系统配置:
- 增加网络接口缓冲区大小:
# 临时修改 sysctl -w net.core.rmem_max=16777216 sysctl -w net.core.wmem_max=16777216 # 永久修改 echo "net.core.rmem_max=16777216" >> /etc/sysctl.conf echo "net.core.wmem_max=16777216" >> /etc/sysctl.conf sysctl -p
- 增加系统打开文件数限制:
# 临时修改 ulimit -n 65536 # 永久修改 echo "* soft nofile 65536" >> /etc/security/limits.conf echo "* hard nofile 65536" >> /etc/security/limits.conf
- 增加系统总内存
- 增加网络接口缓冲区大小:
- 优化应用程序:
- 尽快读取或释放网络数据
- 合理控制网络连接数量
- 正确处理非阻塞 I/O 操作的错误
示例代码 (C 语言):
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#define BUFFER_SIZE 1024
int main() {
int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
perror("socket");
return 1;
}
struct sockaddr_in addr = {
.sin_family = AF_INET,
.sin_port = htons(8080),
.sin_addr.s_addr = INADDR_ANY
};
if (bind(sock, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
perror("bind");
close(sock);
return 1;
}
if (listen(sock, 10) < 0) {
perror("listen");
close(sock);
return 1;
}
while (1) {
int client = accept(sock, NULL, NULL);
if (client < 0) {
if (errno == EWOULDBLOCK || errno == EAGAIN) {
// 非阻塞 I/O 操作返回 EWOULDBLOCK 或 EAGAIN, 需要重试
usleep(100000);
continue;
} else {
perror("accept");
close(sock);
return 1;
}
}
char buf[BUFFER_SIZE];
ssize_t bytes_read = read(client, buf, BUFFER_SIZE);
if (bytes_read < 0) {
perror("read");
close(client);
continue;
}
// 处理读取到的数据
close(client);
}
close(sock);
return 0;
}
在这个示例中, 我们创建了一个简单的 TCP 服务器, 监听 8080 端口。当客户端连接时, 我们读取客户端发送的数据, 并在读取过程中处理 EWOULDBLOCK
和 EAGAIN
错误, 以避免出现 “no buffer space available” 异常。
Numpy中np.dot与np.matmul的区别详解(图文)
详解Numpy transpose()/np.transpose函数/numpy转置(转置数组)函数的作用与使用方法(图文详解1)