现象
Komari 一直推送公司电脑上那台 WSL2 的离线告警,过十几分钟又恢复。可 WSL 已经连续运行 6 天,SSH 也一直能连。
原因
对照面板和 agent 两边的日志:
agent 要过约 16 分钟才发现连接断了。其他节点同样会心跳超时,但 2 分钟左右就重连上,不触发告警。
这 16 分钟来自内核的 TCP 重传:连接上有数据没被确认时,Linux 默认的 tcp_retries2 = 15 要重传约 924 秒才放弃。agent 每秒都在上报,连接从不空闲,所以 keep-alive 不起作用。WSL 里又开着 mihomo 的 TUN,agent 实际只连到本机的 mihomo,只能等 mihomo 那条出站连接重传超时,才收到断开。
至于为什么最近才收到告警:Komari 1.6.0 把通知渠道改成了插件,升级后几天没配,告警都静默失败了。问题早就存在。
修复
echo 'net.ipv4.tcp_retries2 = 8' | sudo tee /etc/sysctl.d/90-tcp-fast-fail.confsudo sysctl --system调成 8 后约 100 秒就判定断开,agent 能赶在告警前重连;真断网几分钟,告警照发。这个改动只影响「有数据发出、对方一直不回」的连接,代价是长时间断网恢复后,正在传数据的连接不能接着用。阿里云 ECS 镜像的默认值就是 8。
小结
监控报离线但机器正常时,对照两端的时间线,看是断线本身还是发现断线太慢。
一直有数据在发的长连接,断线后多久报错由
tcp_retries2决定,默认 15 分钟。告警「最近才出现」,先确认以前的告警有没有发出去。
默认评论
Halo系统提供的评论