无法打开 ssh 连接,因为已达到最大套接字数

无法打开 ssh 连接,因为已达到最大套接字数

我有一个 VPS 和大约 100 个通过 ssh 反向连接连接到 VPS 的无头设备。最近几天,VPS 在重新启动几分钟后拒绝 ssh 连接并显示此消息kex_exchange_identification: read: Connection reset by peer

如果我使用 debug ssh 标志连接到 VPS,有时我会看到.debug1: client_input_channel_req: channel 0 rtype [email protected] reply 1

我读到了相关内容,似乎该错误是由于达到允许的最大套接字数而引起的。

ss -xa | wc -l

494

430如下所示,我不知道什么服务打开此套接字:

Netid  State      Recv-Q Send-Q   Local Address:Port       Peer Address:Port
u_dgr ESTAB      0      0               * 2147483647                  * 0

cat /proc/user_beancounters

Version: 2.5
       uid  resource                     held              maxheld              barrier                limit              failcnt
   103848:  kmemsize                 66312098             68554752  9223372036854775807  9223372036854775807                    0
            lockedpages                     0                  503               262144               262144                    0
            privvmpages                369146               386161  9223372036854775807  9223372036854775807                    0
            shmpages                    74623                74943  9223372036854775807  9223372036854775807                    0
            dummy                           0                    0  9223372036854775807  9223372036854775807                    0
            numproc                       357                  393  9223372036854775807  9223372036854775807                    0
            physpages                  146470               154269                    0               262144                    0
            vmguarpages                     0                    0               294912  9223372036854775807                    0
            oomguarpages                99708               106874               262144  9223372036854775807                    0
            numtcpsock                    338                  339  9223372036854775807  9223372036854775807                    0
            numflock                       59                   64  9223372036854775807  9223372036854775807                    0
            numpty                          2                    4  9223372036854775807  9223372036854775807                    0
            numsiginfo                      0                   24  9223372036854775807  9223372036854775807                    0
            tcpsndbuf                 7093000              7110440  9223372036854775807  9223372036854775807                    0
            tcprcvbuf                 5766768              5783152  9223372036854775807  9223372036854775807                    0
            othersockbuf               523272               871456  9223372036854775807  9223372036854775807                    0
            dgramrcvbuf                     0                30520  9223372036854775807  9223372036854775807                    0
            numothersock                  500                  500                  500                  500                 8621
            dcachesize               26527977             26991757  9223372036854775807  9223372036854775807                    0
            numfile                      6064                 6290  9223372036854775807  9223372036854775807                    0
            dummy                           0                    0  9223372036854775807  9223372036854775807                    0
            dummy                           0                    0  9223372036854775807  9223372036854775807                    0
            dummy                           0                    0  9223372036854775807  9223372036854775807                    0
            numiptent                      30                   30  9223372036854775807  9223372036854775807                    0

我怎么知道什么服务打开了这么多套接字?

答案1

包含/proc/user_beancounters告诉我这是一个在 OpenVZ 主机上运行的虚拟化实例。其限制由您的提供商自行决定。

失败的计数器被numothersock定义为“非 TCP 套接字的最大数量(本地套接字、UDP 和其他类型的套接字)”。

ss -xa检查(所有 unix 套接字)和ss -ua(所有 UDP 套接字)的输出。我发现“本地地址:端口”列对于查找哪些进程正在持有这些套接字很有用。

然后,您将使用上面找到的端口查看输出lsof并挖掘进程名称和编号:

lsof | grep $PORT

这应该可以告诉您哪些进程正在持有这些套接字。

相关内容