http:接受错误:接受 tcp [::]:9000:接受 4:打开的文件太多;在 1 秒内重试



进程的pid 1996291。

/proc/1996291/fd有65534个FD,大多数FDS都是插座,像这样:

lrwx------ 1 root root 64 Dec 30 13:59 10000 -> socket:[952574733]
lrwx------ 1 root root 64 Dec 30 13:59 10001 -> socket:[952566188]

我知道括号中的数字是插座的索引节点。对于每个套接字,/proc/net/tcp中应该有一个相同的索引节点。但是,可以找到一些索引节点,但有些找不到:

cat /proc/net/tcp | grep 952574733

如果我找到了索引节点,输出如下:

  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode
 336: 4114C80A:271A 1914C80A:0CEA 01 00000000:00000000 02:0000BE1B 00000000     0        0 962759319 2 ffff88035a20cb00 20 4 30 10 16

这是一个真正的联系。

我使用netstat -tnp来显示连接并获得大量TIME_WAIT连接。我不知道他们是否与我的问题有关。

我用lsof -p 1996291,输出是这样的,很多套接字:

app    1996291 root *520u     sock       0,8      0t0 953021420 protocol: TCP
app    1996291 root *521u     sock       0,8      0t0 953027193 protocol: TCP
app    1996291 root *522u     sock       0,8      0t0 953021422 protocol: TCP
app    1996291 root *523u     sock       0,8      0t0 953038715 protocol: TCP

有三个内核选项已设置为 1:

net.ipv4.tcp_tw_reuse
net.ipv4.tcp_tw_recycle
net.ipv4.tcp_syncookies

几天都解决不了这些问题,有人能帮我吗?

对于机器上的每个套接字,都有一个文件描述符。当您有太多打开的连接时,打开的文件会太多,它会崩溃。

您可以尝试通过同时限制打开的连接量或通过关闭返回的响应正文来正确关闭 fd 来防止这种情况。快速回收插座也可能有所帮助。

另一种黑客方法是通过以下方式提高打开文件的限制:

ulimit -n [new limit]

最新更新