前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >systemd --user进程CPU占用高问题分析

systemd --user进程CPU占用高问题分析

作者头像
yaohong
发布于 2022-05-10 00:35:58
发布于 2022-05-10 00:35:58
3.2K00
代码可运行
举报
文章被收录于专栏:姚红专栏姚红专栏
运行总次数:0
代码可运行

1.问题由来

近期发现堡垒机环境有如下问题,systemd占用大量cpu:

2.问题定位

2.1.什么是systemd

咋们可以先从systemd这个进程入手分析这个问题: 根据文档《systemd (简体中文)》文档,我们可知如下图信息: 作用:

systemd 会给每个用户生成一个 systemd 实例,用户可以在这个实例下管理服务,启动、停止、启用以及禁用他们自己的单元。

工作原理:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
“从 systemd 226 版本开始,/etc/pam.d/system-login 默认配置中的 pam_systemd 模块会在用户首次登录的时候, 自动运行一个 systemd --user 实例。 只要用户还有会话存在,这个进程就不会退出;用户所有会话退出时,进程将会被销毁。”。

根据上面这段话,我们可以猜测:ssh登录时可以创建systemd进程,ssh退出登录时可以销毁systemd --user进程。

怀着这个猜测,我们进行下面的研究分析。

2.2.systemd进程怎么产生的

首先,我们在第一个终端,执行下面的命令创建test3用户:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ groupadd test3
$ useradd -g test3 -m -d /home/test3 -s /bin/bash test3
$ passwd test3

然后,在第二个终端,执行ssh登录test3

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ ssh test3@172.21.0.46

接着,在第一个终端,执行如下命令过滤新产生的test3 用户的systemd进程

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ top -bc |grep systemd

得到如下图回显,可知:1.9秒前产生了一个pid为19178的systemd --user进程,此进程占用了40.9%的CPU。

于是对接systemd进程创建得出如下结论: systemd版本大于226(centos7为219、ubuntu1604为229),ssh 登录会产生登录用户对应的systemd进程。

2.3.systemd进程为何没有被销毁

既然ssh登录会产生systemd进程,那退出ssh登录应该会销毁对应systemd进程。 于是,我们在2.2中的第二个窗口执行 exit退出ssh连接。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ exit

 然后,再执行如下命令,发现没有test3用户的systemd进程了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ top -bc | grep systemd

至此,我们对systemd进程的退出也有了了解:退出ssh连接即可销毁对应systemd进程。 但,为什么我们看到的腾讯云环境上systemd进程一直没有被销毁?

 此时我想到了 非正常退出ssh连接

如2.1章节,在第二个终端,执行ssh登录test3,再如下图直接点“X”直接关闭窗口,

然后,在第一个终端,执行如下命令过滤新产生的test3 用户的systemd进程

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ top -bc |grep systemd

test3用户的systemd进程还存在,惊讶!!! 于是分别做如下操作对systemd进程关闭做测试,并得出相应结论:

  • 1.xshell连内部vmware上虚拟机环境,点“X”号关闭窗口,对应systemd进程正常销毁;
  • 2.web端连公司堡垒机上的云主机环境,点“X”号关闭窗口,对应systemd进程不能被销毁;
  • 3.web端通过部门内部运维平台连接内部虚拟机环境,点“X”号关闭窗口,对应systemd进程不能被销毁;

于是对于systemd进程销毁得出如下结论: web端连接的虚拟机终端,直接点“X”号关闭窗口,登录用户对应的systemd进程都不能被销毁,exit命令退出终端登录可以销毁,Xshell无此问题。

2.4.systemd进程吃CPU的原因

关于进程跟踪我们很容易想到strace命令。 我们对2.1章节中创建的test3的systemd进程进行跟踪。

得到如下回显:

 看这个进程是在不停的扫描磁盘。

关于这个问题,我在《google-cloud-kuberbetes-run-away-systemd-100-cpu-usage》一文中得到答案:

Docker在17.03和18.09版本之间的变化导致了大量的systemd活动,无论在pod中执行了什么。同时,只要runc发生change,它导致所有mount units被重新加载,作为执行存活探针的一部分。 于是针对这个猜想,我看了下k8s同一集群中systemd正常与异常的节点: 1.正常节点:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# cat /proc/mounts |wc
  120     720   46377

2.异常节点:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# cat /proc/mounts |wc
  1017    6102  341121

于是瞬间也有了结论: systemd 进程cpu使用率太高是因为mount挂载点太多,mount有更新后,通过dbus通知到systemd重新遍历所有mount, 遍历操作比较耗cpu。 同时,既然说到和docker版本有关系,我便针对性找了两个有差异的环境做docker版本对不:

  • 1.ubuntu1604+mount挂载多+systemd正常环境

  • 2.ubuntu1604+mount挂载多+systemd异常环境 

由上图我们发行,环境1中mount挂载为1537个,比环境2中mount挂载为1028个更高但是没出现systemd吃cpu问题,可知系统相同情况下和docker版本有关。

对于什么情况下出现systemd占用高,我们得出如下结论: systemd版本大于226(ubuntu1604为229)+docker版本为19.03.14,无论runc做了什么操作,dbus会通知systemd重新遍历 mount,遍历mout过多(cat /proc/mounts |wc命令查看)会导致systemd进程吃CPU。

三、解决方案

1.不使用web终端连接systemd版本大于226,docker>=19.03.14的环境,可以使用比如xshell连接。 2.针对runc活动导致systemd进程吃CPU问题,google GKE 团队给出如下优化方案:

四、总结

1.systemd进程如何被创建:systemd版本大于226(centos7为219、ubuntu1604为229),ssh 登录会产生登录用户对应的systemd --user进程。 2.systemd进程为何未被销毁:web端连接的虚拟机终端,直接点“X”号关闭窗口,登录用户对应的systemd进程都不能被销毁,exit命令退出终端登录可以销毁,Xshell无此问题。 3.systemd进程为何吃cpu:systemd版本大于226(ubuntu1604为229)+docker版本为19.03.14,无论runc做了什么操作,dbus会通知systemd重新遍历 mount,如果遍历mount过多(cat /proc/mounts |wc命令查看,700个会吃30%CPU,1000个会吃50%左右CPU)就会导致systemd进程吃CPU。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Docker实践(三):数据持久化及共享
 在Linux上运行的Docker有三种不同的方式将数据从 Docker Host挂载到 Docker 容器,并实现数据的读取和存储:volumes、bind mounts、tmpfs。  
loong576
2019/09/10
9280
Docker实践(三):数据持久化及共享
启用Docker虚拟机GPU,加速深度学习
首先说一下Docker虚拟机。为什么需要虚拟机?不知道你是否有过这样的经历,在github上看到一个有趣的开源项目,把代码下载下来,按照项目上的说明编译运行,结果发现怎么也不能成功。
云水木石
2019/07/01
2.8K0
启用Docker虚拟机GPU,加速深度学习
技术干货 | Docker 容器逃逸案例汇集
当获得一个Webshell,我们的攻击点可能处于服务器的一个虚拟目录里,一台虚拟机或是一台物理机,甚至是在一个Docker容器里。
Bypass
2020/08/09
3K0
Linux-常用命令
这些是我在近一年半的学习和服务器维护中常用的命令汇总,包括管理员常用命令和工作常用命令。
孔西皮
2023/10/18
2770
Linux-常用命令
【重识云原生】第六章容器6.1.7.4节——cgroups使用
        开始使用cgroup前需要先挂载cgroup树,下面先看看如何挂载一颗cgroup树,然后再查看其根目录下生成的文件。
江中散人_Jun
2022/09/28
6610
【重识云原生】第六章容器6.1.7.4节——cgroups使用
Docker安装
安装之前,我们首先确保自己的linux系统内核版本高于3.10,并且系统是64位,才能体验Docker。所以我用的是Centos7.3
py3study
2018/08/02
1.1K0
Linux基础第一课——基础知识了解
linus 林纳斯 赫尔辛基大学 在自己的笔记本上安上自己写的操作系统 基于Linux内核
hankleo
2020/09/17
1.1K0
systemd服务管理详解与子命令一览
描述:系统启动和服务器守护进程管理器,负责在系统启动或运行时激活系统资源,并且管理服务器进程和其它进程,可以说他是Linux的小伙伴系统启动时候最先都是运行的systemd;
全栈工程师修炼指南
2022/09/28
2.2K0
systemd服务管理详解与子命令一览
docker OCI runtime
  Open Container Initiative(OCI)目前有2个标准:runtime-spec以及image-spec。前者规定了如何运行解压过的filesystem bundle。OCI规定了如何下载OCI镜像并解压到OCI filesystem bundle,这样OCI runtime就可以运行OCI bundle了。OCI(当前)相当于规定了容器的images和runtime的协议,只要实现了OCI的容器就可以实现其兼容性和可移植性。implements中列出了部分OCI标准的实现。本文不讨论windows下的实现,具体参见Open Container Initiative Runtime Specification
charlieroro
2020/03/24
1.8K0
docker OCI runtime
Docker容器实现原理
容器技术的核心功能,就是通过约束和修改进程的动态表现,从而为其创造出一个“边界”。在Docker中使用了Namespace 技术来修改进程视图从而达到进程隔离的目的。
luozhiyun
2020/07/16
1.3K1
Docker——底层实现原理及关键技术
我们知道, Docker 是使用 Linux 的 Namespace 技术实现各种资源隔离的。那么究竟什么是 Namespace,各种 Namespace 都有什么作用,为什么 Docker 需要 Namespace呢?下面我带你一一揭秘。
思索
2024/08/16
7950
Docker——底层实现原理及关键技术
漏洞分析|RunC TOCTOU逃逸CVE-2021-30465分析
背景 国外安全研究员champtar[1]在日常使用中发现Kubernetes tmpfs挂载存在逃逸现象,研究后发现runC存在条件竞争漏洞,可以导致挂载逃逸[2]。 关于条件竞争TOCTOU和一些linux文件基础知识可见这篇文章《初探文件路径条件竞争 - TOCTOU&CVE-2019-18276》[3]。 CVE-2021-30465在Redteam的研究者视角中比较鸡肋,因为需要K8S批量创建POD的权限。但在产品安全的视角恰恰相反,针对Caas(Container as a service)类
云鼎实验室
2021/08/19
1.1K0
搭建 Ubuntu 24.04 基础开发环境指南
两年前我写过一篇《在笔记本上搭建高性价比的 Linux 学习环境:基础篇》,随着时间推移,里面的一些内容需要更新了。
soulteary
2025/01/17
2.7K0
搭建 Ubuntu 24.04 基础开发环境指南
使用AMD CPU,3000美元打造自己的深度学习服务器
选自GitHub 作者:Wayde Gilliam 机器之心编译 本文作者详细描述了自己组装深度学习服务器的过程,从 CPU、GPU、主板、电源、机箱等的选取到部件的安装,再到服务器的设置,可谓面面俱
机器之心
2018/07/26
2.1K0
使用AMD CPU,3000美元打造自己的深度学习服务器
Linux 进程管理
进程是 UNIX/Linux 用来表示正在运行的程序的一种抽象概念,所有系统上面运行的的数据都会以进程的形态存在。
用户1679793
2020/05/06
7.1K0
云原生安全 | docker容器逃逸
随着云计算技术的不断发展,越来越多的企业开始上“云”。云原生计算基金会(CNCF)提出了云原生(Cloud Native)的概念,云原生包含了一组应用的模式,用于帮助企业快速,持续,可靠,规模化地交付业务应用。云原生由微服务架构,DevOps 和以容器为代表的敏捷基础架构组成。
tinyfisher
2020/08/13
2.4K0
云原生安全 | docker容器逃逸
Linux运维工程师面试题(7)
cgroups,其名称源自控制组群(control groups)的简写,是 Linux 内核的一个功能,用来限制、控制与分离一个进程组能够使用的资源上限,包括CPU、内存、磁盘、网络带宽等等。此外,还能够对进程进行优先级设置,资源的计量以及资源的控制(比如:将进程挂起和恢复等操作)。
阿贤Linux
2023/09/05
5620
Linux运维工程师面试题(7)
系统进程管理查看
描述:用于报告进程使用的文件和网络套接字,还可以用指定的文件或者文件系统显示进程进程号,默认情况下每一个文件名后会跟着一个字母来表示类型,那些本地进程使用file参数指定的本地或远程文件。
全栈工程师修炼指南
2022/09/28
9640
系统进程管理查看
1.Docker学习之基础知识
描述:Docker [ˈdɑ:kə(r)] 是一个基于Go语言开发实现的遵循Apache 2.0协议开源项目,目标是实现轻量级的操作系统虚拟化解决方案; ,诞生于2013年初最初发起者是dotCloud公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,后续由于docker的发展后来也改名为Docker Inc,它是仅次于OpenStack最受欢迎的云计算开源项目;Docker 从 17.03版本之后分为 CE(Community Edition) 和 EE(Enterprise Edition)
全栈工程师修炼指南
2022/09/28
1.6K0
1.Docker学习之基础知识
系统的 CPU 使用率很高,但为啥却找不到高 CPU 的应用?
今天我们来探究系统CPU使用率高的情况,所以这次实验的准备工作,与上节课的准备工作基本相同,差别在于案例所用的 Docker 镜像不同。
wayn
2024/04/28
2510
系统的 CPU 使用率很高,但为啥却找不到高 CPU 的应用?
推荐阅读
相关推荐
Docker实践(三):数据持久化及共享
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验