先看现象。CentOS 7 上 ansible 对本机做部署,forks 设成 20,跑到一半报 ssh_exchange_identification: Connection closed by remote host,sshd 日志里是 error: no more sessions。

原因不止一个,得分开看。MaxSessions 默认 10,同一 TCP 连接上的复用会话一超就被拒。另一种情况是开启了 ControlPersist 连接复用,20 个 task 挤在一条连接里。

另外,MaxStartups 默认 10:30:100,新连接在高峰时被随机丢弃。

上来先看两边限制值

sshd -T | grep -Ei 'maxsessions|maxstartups'

调大会话与并发起连上限

在 sshd_config 写 MaxSessions 50 与 MaxStartups 30:30:100

校验后平滑重载

sshd -t && systemctl reload sshd

必要时关掉连接复用

ansible.cfg 里把 ssh_args 里的 ControlPersist 去掉,或设 pipelining=False

改之前先确认了最近有没有人动过配置,避免白查一遍。

这次没动代码,只在配置和运行环境上找原因。

隔了一天再看,现象没变,说明不是偶发。

那几天正好在做别的变更,先把时间线对齐才敢动手。

改完先别撤,确认这几项。20 并发的部署完整跑完,sshd 日志里不再出现 no more sessions,ss -s 的 estab 连接数稳定且不随时间堆积。

批量部署报连接被断先看 sshd 日志,客户端提示永远只有一句 reset;MaxSessions 调大要配合 MaxStartups,否则只是把瓶颈往前挪。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189