Linux 不允许创建足够的套接字,但使用的套接字不多
Linux isn't allowing to create enough sockets but not many sockets are being used
我的 C++ 应用程序创建了 64-128 个 UDP 套接字。
它使用以下代码创建套接字:
int sock = socket(AF_INET, SOCK_DGRAM, 0);
assert(sock != -1, strerror(errno));
const u_int yes = 1;
int result = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));
printf("sock=%i result=%i errno=%i\n", sock, result, errno);
if(result != 0)
{
FATAL(strerror(errno));
}
但是,目前它只创建了 2 个套接字,因为 setsockopt()
returns -1 在第三个请求中:
sock=1023 result=-1 errno=0
(stderror(errno)
只是说 success
)
我很困惑,因为当我 运行 ss
时,看起来并没有很多套接字在使用中:
ss -s
Total: 238
TCP: 85 (estab 16, closed 40, orphaned 0, timewait 37)
Transport Total IP IPv6
RAW 2 1 1
UDP 24 17 7
TCP 45 30 15
INET 71 48 23
FRAG 0 0 0
我的理解是你可能有 1023 个套接字。所以以上暗示我应该能够创建 64-128?
How/what是这里的问题吗?
打开套接字的数量没有限制,但对打开的文件描述符的数量有更一般的限制。它在 fd=1023 上失败的事实表明这个限制确实达到了,因为在典型的 Linux:
- 文件描述符被分配以 0 开头的连续编号
- 默认限制 (
ulimit -n
) 是 1024 个打开的文件描述符
您可以使用 ls -l /proc/<pid>/fd | wc -l
检查打开的文件描述符的数量。我怀疑您有很多打开的(常规)文件。
我的 C++ 应用程序创建了 64-128 个 UDP 套接字。
它使用以下代码创建套接字:
int sock = socket(AF_INET, SOCK_DGRAM, 0);
assert(sock != -1, strerror(errno));
const u_int yes = 1;
int result = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));
printf("sock=%i result=%i errno=%i\n", sock, result, errno);
if(result != 0)
{
FATAL(strerror(errno));
}
但是,目前它只创建了 2 个套接字,因为 setsockopt()
returns -1 在第三个请求中:
sock=1023 result=-1 errno=0
(stderror(errno)
只是说 success
)
我很困惑,因为当我 运行 ss
时,看起来并没有很多套接字在使用中:
ss -s
Total: 238
TCP: 85 (estab 16, closed 40, orphaned 0, timewait 37)
Transport Total IP IPv6
RAW 2 1 1
UDP 24 17 7
TCP 45 30 15
INET 71 48 23
FRAG 0 0 0
我的理解是你可能有 1023 个套接字。所以以上暗示我应该能够创建 64-128?
How/what是这里的问题吗?
打开套接字的数量没有限制,但对打开的文件描述符的数量有更一般的限制。它在 fd=1023 上失败的事实表明这个限制确实达到了,因为在典型的 Linux:
- 文件描述符被分配以 0 开头的连续编号
- 默认限制 (
ulimit -n
) 是 1024 个打开的文件描述符
您可以使用 ls -l /proc/<pid>/fd | wc -l
检查打开的文件描述符的数量。我怀疑您有很多打开的(常规)文件。