被这个问题困扰了很久,通过查阅大量网络资料找到了解决方法。
网上关于这个问题的博客文章一大堆,但是都是千篇一律、互相拷贝,关于配置UseDNS 或者GSSAPIAuthentication的,解决不了问题,浪费了我大量时间。
不能说那些方法没用,可能不适用我的情况,下面记录一下我的情况,为遇到相同情况的人提供一种新的解决方法。
场景
一台Linux文件服务器(具体是Redhat 7.2),客户端脚本通过 ssh 频繁远程执行 ll 命令检查是否有新文件,并通过 scp 将文件拷贝出来。
现象
通过ssh访问文件服务器特别慢,通过ssh -v显示登录调试信息发现卡在
debug1: Entering interactive session.
大概20多秒。
文件服务器运行时间久了会出现磁盘满,检查发现/var/spool/abrt/ 目录下存在大量ccpp*文件夹,里面都是崩溃日志。
ccpp*文件夹里有一个reason文件,cat内容是 systemd-logind killed by SIGABRT。
排查
登录文件服务器后,首先通过top,检查发现systemd-logind cpu 利用率达到90%-100%
关键
ls -ld /run/systemd/system/session-*.scope*
检查发现/run/systemd/system/目录下大量session-*.scope*文件
systemctl |grep "abandoned" |grep -e "-[[:digit:]]" |sed "s/\.scope.*/.scope/"
检查发现大量session-*.scope.
原因
这应该是系统的一个缺陷,跟systemd有关,systemd-logind主要功能是为每一个登陆session创建一个systemd角度的cgroup管理对象,那些abandoned session应该就是没有及时释放的。
解决
手动清理一下
systemctl |grep "abandoned" |grep -e "-[[:digit:]]" |sed "s/\.scope.*/.scope/" |xargs systemctl stop
可以将这条命令加入crontab或者脚本中定时运行
小结
可能我通过脚本频繁ssh和scp的方法不太好,引起了这个问题,但是总算解决了,
最终解决方法通过 https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=793814 找到 systemd 的 github https://github.com/systemd/systemd/issues/1961
里面有详细问题描述以及解决方法以及讨论,本文的解决方法由part-timeDev 提出
网络上关于systemd争议挺多的,https://www.zhihu.com/question/25873473