likes
comments
collection
share

代码能跑就不要动-spring boot使用sshd-core空闲连接超时自动断开

作者站长头像
站长
· 阅读数 34

编程第一法则:代码能跑就不要动

业务

代码中需要使用ssh连接执行机服务器执行py脚本进行一些耗时操作,比如拉取镜像进行更新等,使用的库是sshd-core

BUG

开发同事在更新完代码后,线上偶现ssh连接超时断开的错误

排查

排查一 找出问题

  1. 看日志只有断开的日志,找不到具体原因,在日志中显示超过10分钟就报错了
  2. 排查ssh连接的代码,发现代码中没有配置超时时间或保持连接的配置,只有一个接收返回值30分钟超时的处理,
  3. 更新前是没问题的,排查这次更新的代码,竟然没有相关修改
  4. 仔细询问同事发现有更改过py脚本,这个脚本是没有纳管的, 对比发现是去掉了一些无用日志

合理的怀疑: 长时间没有输出导致断开

排查二 排查原因

之前没怎么关注过相关知识, AI问答 + google一下

ssh空闲连接的相关参数
客户端(发起请求方): 单位为s,在ssh_config中配置 
ServerAliveInterval 600
ServerAliveCountMax 0

服务器端sshd_config(接收请求方):单位为s,在sshd_config中配置
ClientAliveInterval 600 
ClientAliveCountMax 0

看一下服务器的配置,和代码中接收消息30分钟超时的逻辑一致

ClientAliveInterval 180 
ClientAliveCountMax 10

查找客户端配置时发现:代码中使用的sshd-core和程序所在服务器的ssh配置无关,由于我们代码中没有配置,使用的是默认参数,参数如下,默认是10分钟, 和报错一致

public static final Property<Duration> IDLE_TIMEOUT
        = Property.duration("idle-timeout", Duration.ofMinutes(10));

新问题:服务器设置了ClientAliveInterval参数,怎么还触发了空闲超时? 仔细排查发现执行机有多台,分别有x86和arm两种,查看每一台配置,x86的都是对的,arm中有一台机器配置是错的,找到问题了

遗留问题

sshd-core如何配置ServerAliveInterval和ServerAliveCountMax

sshd-core好像没法直接配置,但另一个库jsch有setServerAliveInterval方法

总结

x86和arm是不同的人配置的,前面的人润了,又没有留下相关文档,导致后面的人不知道,之前没有问题是因为脚本一直有输出,这次更新同事觉得输出的无效日志有些多,就使用/dev/null 2>&1语句优化了一下下,测试的时候选了一个小的镜像进行测试,测试不出问题

教训

  1. 代码能跑就不要动
  2. 各个服务器没有统一配置管理,这个问题比较严重,由于我们之前都是自维护服务器,服务器数量60+, 鬼知道开发人员做了什么操作,后面主要服务上云后才有所改善,但仍有20+服务器需要自己维护,这些服务器运行的哪些进程,是否配置了自动重启,日志管理等都是遗留问题
  3. 项目管理不规范,项目相关的所有文件都需要纳入代码仓,这种脚本文件之前为了方便,就选择直接放在文件服务器上,没法记录更改
转载自:https://juejin.cn/post/7368107542163996706
评论
请登录