我有一个 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
这应该可以告诉您哪些进程正在持有这些套接字。