技术解析之 Systemd vs CGroupfs driver 对比

Systemd vs CGroupfs driver 对比

Posted by 董江 on Wednesday, November 16, 2022

Systemd vs Cgroupfs driver 对比

Systemd vs Cgroupfs

简单来说:

  • Systemd 目前是 Linux init 默认启动方式,是对cgroup的 一次包装(随操作系统发布,天生屏蔽 cgroup v1cgroup v2 的差异)

  • Cgroupfs 是 cgroup 子系统 的另一种实现方式,控制力度在 Linux user级别

总体而已: SystemdCgroupfs 本身没有优缺点之分. cgroupfs Driver通过cgroupfs设置的Cgroupssystemd通过cgroupfs设置的CgroupsLinux Kernel没有区别。

申请推荐使用 Systemd 的原因解决:

kubeletruntime runc 后续不用同时支持cgroup v1cgroup v2。cgroup v2差异化能力让Systemd处理

现象分析

$ journalctl --boot --unit sshd
Nov 16 12:20:48.022631 xxxxxxxxxx sshd[766]: pam_systemd(sshd:session): Failed to create session: Connection timed out

环境

环境情况

$ systemctl --version
systemd 219
+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN

$ cat /etc/centos-release         
BigCloud Enterprise Linux For LDK release 7.5.1812 (Core) 

$ uname -a 
Linux xxxxxxxxxxxxxxxxx 4.14.78-300.el7.bclinux.x86_64 #1 SMP Sat Jan 5 15:49:43 CST 2019 x86_64 x86_64 x86_64 GNU/Linux

验证

模拟systemctl请求Dbus总线超时问题

通过本机(笔记本) ssh 到 被压测集群

$ cat run.sh
while [ 1 ]; do
    (time ssh $1 "echo OK > /dev/null") 2>&1 | grep ^real >> log
done
$ ./run.sh xxx.xxx.xxx.xxx

当发送了1022个 logins后, 第1023个登入,会出现 25s+ 超时

$ cat log | grep 0m0 | wc -l
1022

$ cat log | grep 0m25 | wc -l
4

$ tail -5 log
real 0m0.222s
real 0m25.232s
real 0m25.235s
real 0m25.236s
real 0m25.239s

/var/log/auth.log/var/log/messages 文件中复现了这个问题

$ cat /var/log/auth.log
...
Nov 16 23:55:28 test sshd[3666]: pam_unix(sshd:session): session opened for user by (uid=0)
Nov 16 23:55:28 test systemd-logind[105]: New session c1022 of user centos.
Nov 16 23:55:28 test systemd-logind[105]: Failed to root session scope: Transport endpoint is not connected
Nov 16 23:55:28 test sshd[3666]: pam_systemd(sshd:session): Failed to create session: Message recipient disconnected from message bus without replying...

$ cat /var/log/messages
2022-11-16T23:55:28.272449+08:00 test systemd-logind[105]: Failed to start session scope session-xxxxx.scope: The maximum number of pending replies per connection has been reached

尝试修复

社区方式修复:

  • 用户会话和系统有一组不同的限制(在 session.confsystem.conf 中配置)

调大 dbus 总线数, 问题解决(埋得更深了

$ /etc/dbus-1/system-local.conf

<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-Bus 总线配置 1.0//EN" 
 "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd"> 
<busconfig> 
<limit name="max_replies_per_connection">50000</limit> 
</busconfig>

社区也有其他fix方法: 将25s调大到90s

问题?

为啥线上部署会有这个问题? 是不是远程执行没有释放? 导致dbus拥塞,不得而知…

「如果这篇文章对你有用,请随意打赏」

Kubeservice博客

如果这篇文章对你有用,请随意打赏

使用微信扫描二维码完成支付