服务器时常有程序占满CPU,但占满CPU时又连不上服务器,请问如何高效排查?

TLDR:服务器时常有程序占满CPU,但占满CPU时又连不上服务器;连上后,那个高负载的程序已经结束执行,看不到了。请问如何高效排查?

03.24 23:07更新 此前按照佬友建议,定时dump出top的结果。今晚出现一次卡顿,上去看日志时,发现竟然卡到日志没有dump出来 :sob: 准备进一步根据佬友建议,走网络IO试试,看看能不能抓到。

03.25 09:38更新 目前基本可以确定是内存被占满导致的卡顿。已给老板说加内存(

实验室有一台公用服务器,近期时常出现SSH连接不上的情况。 :sob:

screenshot_20250324095300

在SSH连不上时,进BMC后台发现,CPU负载异常的高,同时KVM控制台也卡到没办法用。SSH能连进去的瞬间,通过htop查看系统平均负荷,数值也是大几百。

现在的问题是:CPU负载高时,连不进服务器;连不进服务器,就没办法做排查;等能连进去了,那个高负载的程序已经执行完了 :sob:

想请教下各位佬友有没有好的解决方案?感谢!

  • 这种连不上的情况,如何进行排查?
  • 比如设置一个定时任务,把消耗高的进程名及对应的用户名给Dump出来?
  • 或者,能够在系统层面限制每个用户的资源使用?(属于是没有办法的办法了)

呼应标题:口令红包:74308740 感谢各位佬友帮忙!

3 个赞

定时任务遇见高占用该拉不起后台还是拉不起的 :tieba_087:
真遇见过tty登录卡死的 :joy:

1 个赞

定时执行top -b -n 1 >> output 然后分析下cpu占用就行
另外可以把sshd的nice值调高来保证负载高的时候ssh也能连上,直接改systemd配置然后重启sshd就行

1 个赞

直接上 prometheus 监控

1 个赞

其实谜底就在谜面上,定时任务把top出来的东西写到文件里,然后再具体分析。或者干脆写到socket里也行,在一台正常机器上nc监听端口接收,防止这占用高的时候同时还卡磁盘IO导致日志写不进去。网络IO虽然也有类似问题,但是如果网络也吃满了估计lz从BMC里也看到了

2 个赞

1.写个小脚本,记录当前占用CPU最高的进程及其相关信息。

#!/bin/bash
LOG_FILE="/var/log/cpu_usage.log"
echo "Timestamp: $(date)" >> "$LOG_FILE"
echo "Top 5 CPU consuming processes:" >> "$LOG_FILE"
ps -eo pid,user,cmd,%cpu --sort=-%cpu | head -n 6 >> "$LOG_FILE"
echo "------------------------" >> "$LOG_FILE"

2.编辑下 /etc/security/limits.conf
设置限制,例如限制每个用户的CPU使用时间。
但是这种方法仅对新登录的会话生效,已运行的进程不受影响,所以你最好是重启之后设置。

1 个赞

装个atop记录下进程 下次再出问题重启查看异常进程

1 个赞

比较麻烦了,得查历史记录了

1 个赞

node exporter(主机硬件资源)/ process exporter(进程级别硬件资源) + prometheus + Grafana ,把prometheus和Grafana部署到别的主机防止你想监控的主机crash掉了不可用

1 个赞

建议:
1、进入这台服务器的BMC,通过远程管理终端,登录系统,而不是采用ssh。随后安装perf,通过perf完成对你这台机的CPU 利用率分析各线程的调用情况。随后进行优化,看是哪里占用的资源最多。
2、你可以通过numa完成对每个进行的CPU限制,指定程序能使用CPU多少个核心
3、 限制用户的CPU和内存的使用,我还没想好,但是你可以使用其他办法,比如限制nofile、fs、fd来完成限制

1 个赞