2022年2月28号晚上11点左右,业务反馈有台自建物理机ssh登录不了了,但机器能正常提供服务,从系统log看,机器确实有sshd的重启操作,并且是通过ansible进行的。从日志看业务对ssh配置文件,即/etc/ssh/sshd_config进行变更,并重启sshd服务(systemctl restart sshd),并且前几次都能重启成功,最后一次重启失败了
于是找了一台测试机,通过不停的执行systemctl restart sshd命令,发现前几次还能执行成功,最后一次报错:
通过系统log发现Startrequest repeated too quickly的错误,并且伴有start-limit-hit的字样,从字面意思看上去是重启太快(太频繁)之类的报错。
由于这是systemd的报错,因此从systemd的源码入手看下到底是哪里的报错。通过grep源码发现在service_start->unit_test_start_limit函数处的报错。当unit_test_start_limit函数返回值小于0则执行service_enter_dead,该函数会调用unit_log_failure函数,并且打印系统日志Failed with result start-limit-hit。
10秒内重启5次就算失败。
在回过头看下业务重启sshd的情况
中间经过了大概6秒钟时间,这6秒内重启了多少次呢?我们统计一下:
总结一下,systemd管理的service都有重启的频率限制,即默认的10秒内重启5次的限制。当超过这个频率的话就会报错。