过滤高 CPU 使用率的进程
在监控系统时,发现CPU使用率并不高,但在其他工具中发现CPU使用率稳定在50%,同时操作有明显的卡顿。
这种情况下,可能是系统中的某个进程异常占用了CPU资源。经过排查,发现服务器仅启动了几个Docker服务,关闭所有服务后CPU使用率依然保持在50%,这时怀疑系统可能遭遇了挖矿程序。我们将使用Sysdig工具进一步排查问题。
什么是 Sysdig?
Sysdig 是一个开源的系统监控和故障排除工具,专门设计用于容器、云原生应用和微服务架构。它通过捕获和分析系统调用来提供深入的系统活动监控,帮助开发人员、运维人员和安全专家进行实时监控、故障诊断和安全分析。
安装 Sysdig
首先,确保服务器上已经安装了 Sysdig。如果尚未安装,可以通过以下命令进行安装:
sudo yum install sysdig
Ubuntu / Debian 系统
sudo apt-get install sysdig
使用 Sysdig 查看系统资源使用情况
安装完成后,使用 sysdig
命令可以查看系统的实时活动,包括 CPU、内存、进程等信息。如果系统CPU负载较高,但通过 top
命令并未发现异常,可能是某些低优先级进程或内核级别的活动导致了高负载。
sysdig
该命令会显示所有的系统调用,提供有关进程、文件访问、网络连接等的详细信息。
过滤高 CPU 使用率的进程
为了聚焦于高 CPU 使用的进程,我们可以使用 sysdig
提供的 topprocs_cpu
功能。该命令会列出当前占用最多 CPU 资源的进程,并按 CPU 使用百分比进行排序。
sysdig -c topprocs_cpu
示例输出:
CPU% Process PID
------------------------------------------
1599.90% ssh 6313
4.00% top 3935
2.00% sshd 3854
1.00% nacos-http-asyn 16689
1.00% com.alibaba.nac 16689
1.00% redis-server 27690
1.00% grpc-default-wo 16689
0.00% nginx 5964
0.00% nginx 5967
0.00% nginx 5966
解释高 CPU 使用率
在上面的输出中,发现 ssh
进程的 CPU 使用率异常高,达到 1599.90%。这意味着该进程使用了接近服务器 50% 的 CPU 资源。由于服务器有 32 个核心,1599.90% 的 CPU 使用量大约等于 50% 的总 CPU 资源(32 核心 * 50% = 1599.90%)。因此,ssh
进程占用了服务器的一半 CPU 资源。
为什么 SSH 服务会占用如此高的 CPU?
高 CPU 使用率通常与进程执行的任务相关。对于 ssh
服务,其高 CPU 使用可能是由以下原因导致的:
长时间运行的命令或脚本:在 SSH 会话中执行计算密集型任务(如编译、大数据处理等)会导致高 CPU 使用。
死循环或不正常的操作:某些进程可能因为错误或死循环持续占用 CPU 资源。
大量的 SSH 连接:多个 SSH 客户端连接到服务器并执行繁重的任务(如大规模文件传输、执行计算密集型操作等),也可能导致 CPU 使用过高。
恶意进程:有时 SSH 可能被黑客用作进入系统并执行恶意代码(例如挖矿程序),导致异常的高 CPU 使用。
进一步诊断高 CPU 使用的进程
为了进一步排查导致高 CPU 使用的具体进程,可以执行以下步骤:
查找与 SSH 相关的所有进程
使用以下命令列出所有与 SSH 相关的进程,查看是否有异常的进程或操作:
ps aux | grep ssh
使用 strace
跟踪进程
如果怀疑某个 SSH 会话内的命令占用了大量 CPU,可以使用 strace
跟踪该进程的系统调用,查看它正在执行哪些操作:
strace -p <PID>
其中 <PID>
是 ssh
进程的进程ID。strace
将显示该进程执行的所有系统调用,帮助你找到耗费大量 CPU 的操作。
查看 SSH 连接情况
如果怀疑 SSH 服务被滥用,可以检查与 SSH 服务的连接情况,查看是否有异常的远程连接:
ss -tuln | grep :22
这将列出所有连接到 SSH 服务(默认端口 22)的客户端。如果发现来自不明 IP 地址或异常连接,可能是恶意用户已通过 SSH 连接到服务器。
查看 SSH 登录历史
检查 SSH 登录历史记录,找出是否有异常登录行为。可以通过以下命令查看 SSH 登录记录:
cat /var/log/auth.log | grep sshd
这将列出所有 SSH 登录的记录,帮助你识别是否有不正常的登录尝试(如暴力破解或未经授权的访问)。
临时停止 SSH 服务
如果你确认 SSH 进程存在异常并且影响到系统性能,可以考虑暂时停止 SSH 服务以防止进一步影响:
sudo systemctl stop sshd
在处理完问题并采取适当的安全措施后,可以重新启动 SSH 服务:
sudo systemctl start sshd
结论
通过使用 sysdig
工具,你可以快速识别出占用大量 CPU 的进程,并通过进一步分析确定问题的根本原因。如果是因为远程执行的脚本或计算密集型操作导致的高 CPU 使用,考虑优化这些任务或增加系统资源。如果是由于恶意进程(如挖矿程序)导致的,应该及时采取安全措施,防止进一步的损害。