排查
先来了解下相关内容
首先先明确systemd-resolved服务是做什么的?这个服务有问题会影响什么呢?
systemd-resolved is a systemd service that provides network name resolution to local applications via a D-Bus interface, the
resolve
NSS service (nss-resolve(8)), and a local DNS stub listener on127.0.0.53
.以上,可以看出systemd-resolved实际上是通过D-Bus接口、nsswitch、本地DNS listener提供的网络名字解析服务,相对于/etc/resolve.conf他是扩展了一些功能
所以没有这个服务整个DNS就完全不能用了嘛?不是的,/etc/resolve.conf中只要正确配置了DNS也可以正常进行DNS解析。systemd-resolved和/etc/resolve.conf的关系是什么呢?
使用systemd-resolved的话,他会接管(也就是相当于覆盖)/etc/resolve.conf,让它指向一个127.0.0.53(也就是systemd-resolevd)的listener,所有的DNS查询就会路由到systemd-resolved去。如果不想使用systemd-resolved怎么办呢?直接使用/etc/resolve.conf就可以。
所以,如果是使用了systemd-resolved的方式去解析DNS,systemd-resolved出问题的后果就是—不能解析DNS了。
问题一
看一下这个服务,fail了
看一下服务的日志,看上去是长时间启动不了,被狗杀了?一直重启但重启不了
Oct 06 08:17:39 instance-XXX-02 systemd[1]: systemd-resolved.service: Watchdog timeout (limit 3min)!
Oct 06 08:17:39 instance-XXX-02 systemd[1]: systemd-resolved.service: Killing process 8022 (systemd-resolve) with signal SIGABRT.
Oct 06 08:17:39 instance-XXX-02 systemd[1]: systemd-resolved.service: Main process exited, code=dumped, status=6/ABRT
Oct 06 08:17:39 instance-XXX-02 systemd[1]: systemd-resolved.service: Failed with result 'watchdog'.
Oct 06 08:17:39 instance-XXX-02 systemd[1]: systemd-resolved.service: Consumed 2min 26.118s CPU time.
Oct 06 08:17:39 instance-XXX-02 systemd[1]: systemd-resolved.service: Scheduled restart job, restart counter is at 1.
Oct 06 08:17:39 instance-XXX-02 systemd[1]: Stopped Network Name Resolution.
Oct 06 08:17:39 instance-XXX-02 systemd[1]: systemd-resolved.service: Consumed 2min 26.118s CPU time.
Oct 06 08:17:39 instance-XXX-02 systemd[1]: Starting Network Name Resolution...
Oct 06 08:17:40 instance-XXX-02 systemd[1]: systemd-resolved.service: Main process exited, code=exited, status=203/EXEC
Oct 06 08:17:40 instance-XXX-02 systemd[1]: systemd-resolved.service: Failed with result 'exit-code'.
Oct 06 08:17:40 instance-XXX-02 systemd[1]: Failed to start Network Name Resolution.
看一下对应时间点的dmesg日志
[Sun Oct 6 08:14:46 2024] VFS: file-max limit 7048576 reached
[Sun Oct 6 08:14:46 2024] VFS: file-max limit 7048576 reached
[Sun Oct 6 08:14:47 2024] VFS: file-max limit 7048576 reached
[Sun Oct 6 08:15:00 2024] VFS: file-max limit 7048576 reached
[Sun Oct 6 08:15:01 2024] VFS: file-max limit 7048576 reached
[Sun Oct 6 08:15:01 2024] VFS: file-max limit 7048576 reached
[Sun Oct 6 08:15:04 2024] VFS: file-max limit 7048576 reached
[Sun Oct 6 08:15:28 2024] VFS: file-max limit 7048576 reached
[Sun Oct 6 08:15:31 2024] VFS: file-max limit 7048576 reached
[Sun Oct 6 08:15:31 2024] VFS: file-max limit 7048576 reached
[Sun Oct 6 08:15:44 2024] VFS: file-max limit 7048576 reached
[Sun Oct 6 08:15:44 2024] VFS: file-max limit 7048576 reached
[Sun Oct 6 08:15:46 2024] VFS: file-max limit 7048576 reached
[Sun Oct 6 08:15:47 2024] VFS: file-max limit 7048576 reached
[Sun Oct 6 08:15:47 2024] VFS: file-max limit 7048576 reached
[Sun Oct 6 08:15:47 2024] VFS: file-max limit 7048576 reached
[Sun Oct 6 08:16:02 2024] VFS: file-max limit 7048576 reached
dmesg的报错什么意思呢?就是达到系统全局的fd上限了,这个上限包括打开的普通文件、socket、pipe这些。
其实这样看上去原因就很清晰了,因为file-max达到上限了导致创建不出文件了,然后systemd-resolved服务一直运行超时了被狗杀掉了
看systemd-resolevd服务的配置的话可以发现,这个systemd会尝试进行重启,但是重启一直没启动成功,超过限定次数后就不重启了
StartLimitBurst 最大重启次数,systemd-resolved服务如果没有设置的话,会继承systemd的配置
RestartSec间隔几秒重启,如果不设置,那么就立即重启
解决方法也很简单,/proc/sys/fs/file-max调大就可以了
这里再列举下这块的一些相关参数
/proc/sys/fs/file-max | 系统全局可以允许打开的最大fd数量,临时修改可以直接修改,固化需要写到/etc/sysctl.conf中 |
---|---|
/proc/sys/fs/nr-open | 单个进程可以打开的最大fd数量,临时修改可以直接修改,固化需要写到/etc/sysctl.conf中 |
ulimit -n | userspace限制的进程可以打开的最大文件数。永久修改需要/etc/security/limits.conf |
问题二
以上已经把fd超限导致的systemd-resolved服务异常解决了
但是还有一个问题,但是还是访问失败,dig baidu.com试一下会失败
使用resolvectl flush-caches清理一下缓存(有的是systemd-resolve –flush-caches,ubuntu22.04中换成resolvectl了)然后重试,还是失败
直接查baidu.com失败,但是通过8.8.8.8查可以,看来DNS还是有问题?
看一下这个127.0.0.53是存在的,也就是向systemd-resolved的转发应该是没问题的
看一下resolvectl status,异常的机器如下
正常的机器如下
说明异常的机器没有配置DNS服务器,这样的话即使DNS请求转发到systemd-resolved服务,他肯定也没办法正常查询了
手动按照正常机器的DNS服务器配置一下
resolvectl dns eth0 XXX XXX
可以正常查询DNS了
但还是要看一下,为什么异常机器的systemd-resolved服务会丢失DNS服务器的配置呢?
看了下异常机器的systemctl status systemd-networkd有一些log
推测还是太多文件导致的?不过这个log看上去应该是userspace限制的了,使用ulimit -n调节一下
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 857879363@qq.com