专栏首页运维研习社记一次linux远程登录导致的CPU100%

记一次linux远程登录导致的CPU100%

刚开始远程工作,就接到短信告警,系统CPU占用过高,立即登录系统查看,登录的过程异常缓慢,不过总算登录了

ABRT报告发现了一个问题

ABRT是一个自动汇报错误的工具,主要是为用户提供简洁的,全面的错误信息

对于系统用户来说,它主要从系统日志中查询可以的字符串,比如oops、Machine-check、Xorg故障等,除了在系统日志中查询匹配外,它还检查kdump等记录故障的文件,从中提取系统错误信息,它提供了abrt-cli命令进行报告查看

通过提示命令查看

发现是systemd-logind的问题,结合top查看

systemd-logind占用CPU100%,导致系统负载飙升

systemd-logind是什么呢?

systemd-logind 是一个管理用户登录的系统服务。其职责如下:

  • 持续跟踪用户的会话、进程、空闲状态。这将在 user.slice 之下,为每个用户分配一个 slice 单元、为每个用户的当前会话分配一个 scope 单元。同时,针对每个已登录的用户,将会启动一个专属的服务管理器(作为 user@.service 模版的一个实例)。
  • 生成并管理"session ID"。如果启用了审计并且已经为一个会话设置了审计"session ID", 那么该ID也将同时被用作"session ID", 否则将会使用一个独立的会话计数器(也就是独立生成一个"session ID")。
  • 为用户的特权操作(例如关闭或休眠系统) 提供基于 polkit 的认证与授权
  • 为应用程序实现 阻止关闭/休眠系统的逻辑
  • 处理 硬件关机/休眠按钮的动作
  • 多席位(Multi-Seat)管理
  • 会话切换管理
  • 管理 用户对设备的访问
  • 在启动虚拟终端时 自动启动文本登录程序(agetty), 并管理用户的运行时目录

那么为什么登录慢,登录后又提示systemd-logind被killd,通过查找message看到如下

很明显是系统的buffer不够,在读取/run/systemd/users/0时无法读取,无法为登录用户创建session,然后3分钟无响应被wachdog检测到kill掉,重新启动重新尝试

可以在图中看到,仍然有root用户分配了session,我想这是因为这个时候正好资源有释放,刚好可以申请到资源创建session

为了解决疑惑,通过strace看一下systemd-logind在用户登录时的调用

首先查看下systemd-logind的pid

接着通过strace -p进行跟踪调用

发现登录过程中,就是调用/run/systemd/users下面的文件

我们看下/run/systemd/users/0文件中存储的内容

记录了用户id为0也就是root用户的session信息,这里发现活动的session很多,但是我登录用户只登录了一个会话

因为每一个session都会创建一个slice,通过slice查看,先查看系统slice

然后查看user.0.silce

发现除了用户登录,还有大量的crond定时任务的session,可以看到每个session下面的详细命令或脚本

systemd-logind有个bug,就是当有crond时,往往session回收不及时,这也是资源占用导致无法新开session的原因

从上的图中可以看到user.0.slice中是通过cgroup来进行管理的,用户的进程的资源管理可以在/run/systemd/system/目录下,根据用户的slice或者是session去进行配置

比如user.0.slice.d下面的配置

至此问题大致了解,systemd-logind在用户登录时申请资源,由于系统资源不够,导致无法创建session,无法登录。

网上有建议让关掉systemd-logind,我个人建议不关掉,因为它有一个比较重要的功能就是更方便系统通过cgroup来管理用户资源

更好的做法是,定时释放资源,将定时任务尽量写到不同的用户中,而不是都写入到root用户下

通常管理员都是将定时任务写入到root下,这种方式不管是执行产生的临时文件还是日志文件,都是root权限的,比如执行web的命令生产root权限的文件,会导致原本的web用户无法调用而报错,所以尽量通过crontab -e -u web用户的方式,减少root用户下的定时任务

本文分享自微信公众号 - 运维研习社(gh_4135e2716ad3),作者:运维研习社

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 搞懂ulimit资源限制

    运维系统调优的过程中,必然会遇到的一个问题就是资源限制,在linux中,ulimit命令是用于控制shell程序的资源限制,它是linux的shell内建指令(...

    李俊鹏
  • Nginx常见异常整理,帮你快速定位

    提示:文章前面部分是关于nginx下https连接curl请求被reset的处理经历,不想看可以直接跳到最后看nginx快速定位异常,建议收藏!

    李俊鹏
  • 实例详解ulimit每个参数

    core file size是限制core文件的大小,默认情况下是0,就是没有打开的,ulimit -c参数代表core file size,单位是blocks...

    李俊鹏
  • 3种web会话管理的方式

    http是无状态的,一次请求结束,连接断开,下次服务器再收到请求,它就不知道这个请求是哪个用户发过来的。当然它知道是哪个客户端地址发过来的,但是对于我们的应用来...

    wangxl
  • 确定当前事务的隔离级别

    事务是MySQL的Innodb存储引擎比较大的亮点,大家对事务的隔离级别肯定都不陌生,那么如何查看当前事务的隔离级别呢?这个方法可能大家也知道,不就是查看当前...

    AsiaYe
  • 用户登录失败,Microsoft sql server 错误:18456

        电脑上的安全软件,不小心拒绝了一个net1.exe的进程,结果在登录 SQL server 2008 的时候,就总是提示“用户登录失败,错误:18456...

    令仔很忙
  • 马化腾:电力时代孕育了计算机,人工智能兴盛于云计算

    6月21日,“云+未来”峰会在深圳召开。在数字经济高速发展,人工智能一日千里的时代,云计算为社会和经济带来的量变与质变究竟是什么?腾讯董事会主席兼首席执行官马化...

    云加创业小助手
  • 马化腾:电力时代孕育了计算机,人工智能兴盛于云计算

    6月21日,“云+未来”峰会在深圳召开。在数字经济高速发展,人工智能一日千里的时代,云计算为社会和经济带来的量变与质变究竟是什么?腾讯董事会主席兼首席执行官马化...

    云加社区
  • 60行代码徒手实现深度神经网络

    采用的数据集是sklearn中的breast cancer数据集,30维特征,569个样本。训练前进行MinMax标准化缩放至[0,1]区间。按照75/25比例...

    lyhue1991
  • 通过欧拉计划学Rust编程:第100题

    由于研究Libra等数字货币编程技术的需要,学习了一段时间的Rust编程,一不小心刷题上瘾。

    申龙斌

扫码关注云+社区

领取腾讯云代金券