阿里云国际站:关于ECS CPU飙升排查方法

简介: 服务器日常负载不过30%,某个下午却突然蹿到90%以上,页面打开延迟从300毫秒变成8秒——这种场景在运维群聊里算不上新鲜事。真正棘手的是,面对监控图表上一根突兀的尖刺,很多人打开终端敲下top之后,依然不知道下一步该看什么。对使用阿里云ECS的团队来说,CPU飙升排查的难点不在于工具匮乏,而在于缺少一条可重复的排查路径:知道数据在哪,却看不透数据之间的因果链条。

本文由『 云老大 飞弟:@yunlaoda360 / YunLaoDa-云服务器•运维部门•撰写』如需转载请注明!

阿里云ECS CPU飙升排查方法:从毫无头绪到精准定位,中间隔着一套排查直觉

服务器日常负载不过30%,某个下午却突然蹿到90%以上,页面打开延迟从300毫秒变成8秒——这种场景在运维群聊里算不上新鲜事。真正棘手的是,面对监控图表上一根突兀的尖刺,很多人打开终端敲下top之后,依然不知道下一步该看什么。对使用阿里云ECS的团队来说,CPU飙升排查的难点不在于工具匮乏,而在于缺少一条可重复的排查路径:知道数据在哪,却看不透数据之间的因果链条。

为什么阿里云ECS CPU会突然飙升?

CPU不会无缘无故跑到100%,每一次异常消耗背后,都有一组很具体的触发逻辑。常见诱因大致落在三个方向:业务代码陷入死循环或内存泄漏引发的连锁反应、外部攻击产生的海量无效请求,以及系统资源配置错误导致的资源争抢。以DDoS和CC攻击为例,这类流量型攻击通过持续向服务器发送伪造的连接请求,迫使CPU耗费大量周期处理三次握手和连接表维护,游戏类业务和未上WAF的建站场景尤其高发。更隐蔽的情况来自挖矿木马,进程名称常被伪装成[kthreadd]的子线程,单看top输出很难一眼识别,但它会稳定吃掉一整颗核心的全部算力。

怎样判断CPU高是“真问题”还是瞬时抖动?

单纯看总使用率容易误判。先看持续时间:如果利用率在几秒内从80%回落到基线,大多是计划任务或日志轮转造成的瞬时波动,业务侧通常感知不到。再看top里的wa(I/O wait)指标——这个值一高,说明CPU卡在等待磁盘读写上,常见于日志疯狂刷盘或数据库慢查询引发的IO争用。此时用iostat检查磁盘利用率,往往比盯着进程列表管用。真正需要警惕的“真问题”,是us(用户态)或sy(内核态)占用持续超过80%且伴随应用响应延迟陡增,这种曲线通常指向代码死循环、系统调用风暴或者恶意进程。

CPU飙升到底会从哪些维度击穿业务?

表面上是服务器响应变慢,但连锁反应远比“多等两秒”严重。当CPU被低优先级的异常进程占满,Nginx或Apache的工作线程无法及时拿到时间片,会导致请求队列迅速堆积,进而触发负载均衡的健康检查超时,把节点标记为不可用。如果该实例恰好是数据库主库,CPU打满还会拖慢复制线程,造成只读实例延迟扩大,间接引发读写分离架构下的数据不一致假象。更隐蔽的损失在于排查成本:如果没有事先在云监控里配置好单机CPU的阈值告警和进程级监控,运维人员从收到业务投诉那一刻才开始回溯日志,平均故障定位时间会从几分钟拉长到小时级。

快速定位CPU飙升进程:top命令实战

收到阿里云云监控的告警短信,或通过“重启治标不治本”的直觉判断后,第一现场永远在命令行。top 是 Linux 系统标准的实时进程监视器,几秒钟的熟练操作就能从数十个运行进程里把那只“电老虎”揪出来。在这里,信息量最大的是前三行:平均负载、进程状态和 CPU 使用率明细;尤其要留意 %Cpu(s) 行里的 wa —— 看到这个值高过 10% 而不是 us 高,你的排查靶向就应该立刻转向磁盘 I/O 而非继续和进程较劲。

用 top 命令查看 CPU 使用率排序

进入 top 后,最优先的操作序列是:先按数字 1 展开各核心使用率,确认是单核被打满还是整体抬升;接着按 Shift + P 让进程列表严格按 CPU 消耗降序排列。此时务必追加 -c 参数(top -c)显示完整命令行,否则你看到的可能只是一个被伪装的进程名。常见的陷阱是只盯着 %CPU 列而忽略 %MEMTIME+ —— 后者记录进程累计消耗的 CPU 时间,若某个 Java 进程的 TIME+ 疯狂增长,说明它一直在异常循环。多数生产环境里,这个动作可以 5 秒内定位到占用 90% 以上 CPU 的 PID。

识别占用 CPU 高的进程 PID

拿到 PID 只是开始。真正的风险在于“幽灵进程”:top 里显示占用 100% CPU 的名为 [kthreadd] 的条目,乍看像是内核线程,但如果 /proc/该PID/exe 指向 /tmp/.hidden/ 下的可执行文件,那几乎可以断定为挖矿木马。更隐蔽的情况是 Python/PHP 脚本进程在 top -c 下列出一长串经过 Base64 编码的命令行参数,这是攻击者规避审计的惯用手法。此时不应立刻 kill,而是先用 ls -l /proc/PID/exe 确认真实路径,再用 cat /proc/PID/status | grep PPid 追踪父进程,同时回顾阿里云安全中心最近一次漏洞扫描报告,很可能早有未处理的告警。

使用 htop 增强显示

如果嫌 top 按键记忆繁琐,htop 是目前云服务器排查的标配增强工具。它用彩色矩阵直观展示各 CPU 核、内存和交换分区的消耗,支持鼠标点击排序(按 F6 选择 PERCENT_CPU)和垂直滚动,可以把几十个进程同时纳入视野。最实用的功能是树形视图(F5),能一眼看出是哪个父进程 fork 出大量子进程把 CPU 拖垮 —— 例如 PHP-FPM 的 pm.max_children 配置过高,导致瞬间 Fork 出几百个 php-fpm 子进程争抢 CPU。在阿里云 ECS 上执行 yum install htop -y 即可安装,其内置的 strace 快捷功能(选中进程按 s)还能让你直接进入系统调用追踪,减少工具切换成本。

深入排查进程异常:ps与strace工具

top 已经把 CPU 飙升的罪魁祸首锁定到某个 PID 时,真正考验排查能力的时刻才刚刚开始——你需要知道这个进程在干什么、卡在哪里、打开了哪些资源。下面这三件工具,正是从“看现象”到“挖根因”的关键跳板。

ps aux:别只盯着 %CPU,还要读懂进程状态与继承关系

ps aux 输出的 %CPU 是进程自启动以来的平均使用率,不能反映瞬时尖刺;但它的 STATRSSVSZ 三列才是真正的暗号。在一次阿里云 ECS 的 PHP-FPM 集体狂飙案例中,数十个子进程的 STAT 均显示为 “R”,而 RSS 几乎撑满物理内存——这实际上是 pm.max_children 配置不当引发的频密上下文切换,而非代码死循环。更隐蔽的风险在于 PPID 链:如果某个高 CPU 进程的父进程是 initsystemd 且 CMD 为可疑脚本路径(如 /tmp/.x),那基本可以判定为已被植入后门,ps 的输出就变成了第一手取证材料。

strace -c:别一上来就跟踪全部调用,先用统计锁定瓶颈

很多运维看到 strace -p PID 就把所有系统调用刷屏,反而被海量输出淹没。更高效的做法是 strace -c -p PID:静默统计 5-10 秒,可以得出每个系统调用的耗时、错误次数和占比。在一个典型的阿里云 ECS 挖矿木马排查中,对疑似进程做 strace -c 发现 clock_nanosleep 占总时间的 98%,但这并非空闲,而是恶意程序刻意加入延迟以躲避检测;真正的资源消耗在 connectsendto,调用频率高达每秒 3000 次,实时跟踪时直接暴露了外联矿池 IP。这个技巧的价值在于:先看宏观分布,再用 -e trace=network 做定向狙击,比蛮力监听高效得多。

lsof:进程的资源视角,往往比系统日志更诚实

CPU 飙升时,lsof -p PID 提供的不只是文件列表,而是一张完整的资源占用拓扑图。常规检查会关注打开的 socket 连接状态(TCP SYNSENT 大量堆积常指向 CC 攻击),但更常被忽略的是 pipe 和 eventpoll 对象。阿里云某次 MySQL 实例 CPU 冲顶的根因,正是 lsof 暴露了数百个未释放的临时表文件(`/tmp/#sql*.ibd)和大量 broken pipe——这说明查询并发超过了max_tmp_tables限制,磁盘 I/O 反过来拖垮 CPU 的wa值。此时再结合iostat` 一交叉验证,问题边界就彻底清晰了。

分析系统日志定位根因:journalctl与dmesg

使用journalctl查看系统日志

当 top 指认了高 CPU 进程,但无法判断其行为时,journalctl 提供的 systemd 日志是第一手线索。阿里云 ECS 上默认跑的 CentOS/Rocky/Ubuntu 都已切换到 journald,一条 journalctl -u nginx -p err --since "5 minutes ago" 就比直接翻 /var/log/messages 更快命中外因。实战中频繁看到 java 进程无限循环触发 OutOfMemoryError,journalctl 里会先出现 cgroup OOM 杀调记录,再接着是进程重启的回环,直接把根因锚定在堆内存配置错误,而非 CPU 本身。

dmesg检查内核日志

CPU 飙升未必全是用户态程序失控,内核层面的锁竞争或硬件故障更隐蔽。dmesg 保留的环形缓冲不受 journald 清理策略影响,能抓到类似 soft lockup - CPU#2 stuck for 22s 的关键记录。去年一次大规模 ECS CPU 飙涨排查中,我们发现多台实例的 dmesg 反复出现 NMI watchdog: BUG: soft lockup,最终追到特定自定义内核模块引入了自旋锁死锁——这种情况下,重启或切换进程完全无效,唯有回滚模块版本才能解除。

重点日志关键字搜索

在海量日志里人工翻扫等于碰运气,定向搜索 “oom”、“segfault”、“blocked” 可以快速止损。在阿里云 ECS 环境里,如果把 systemd journal 转发到日志服务并与云监控打通,就能在 CPU 告警触发的同时自动检索近 15 分钟内出现的 kernel: Out of memoryprocess killed,立即区分是内存耗尽引发的颠簸还是纯粹的计算密集任务。这种整合绕开了自建 EFK 的维护成本,关键是把 “发现—定位—恢复” 三步压缩在一屏之内,避免靠重启蒙混过关。

实战案例:从日志定位CPU飙升元凶

工具链再完善,最终还是要回到具体场景里验证。我们拆解三个高频案例,覆盖应用层故障、安全入侵、内核缺陷三种典型路径,每个案例的排查逻辑都有本质差异。

案例1:Web服务进程异常(PHP-FPM)

这类问题最常见也最容易被误判。某电商站点在促销期间CPU从30%窜升至95%,top显示十几个php-fpm进程合计占用超过85%的计算资源。运维第一反应是加服务器,但strace -c -p对高负载子进程做系统调用统计后发现,futex调用占比畸高——这是线程同步原语,指向进程间抢锁而非正常业务计算。切入应用日志目录,在php-fpm slow log中筛选执行超过阈值(默认3秒)的请求,发现大量SQL堆积在order_detail查询上,索引失效导致全表扫描。这个案例的教训是:CPU飙升的表象下,瓶颈可能在数据库层,扩容PHP节点治不了本。

案例2:挖矿进程隐藏排查

挖矿脚本的对抗手段在2024年已相当成熟。一台跑Nginx反向代理的ECS实例,top显示CPU满载但进程名持续变化,从[kworker]伪装到/usr/sbin/sshd这类系统服务名。用ls -l /proc/[PID]/exe追踪二进制真实路径时,发现执行文件藏在/tmp/.cache/.x11目录,且父进程PID指向已被篡改的crontab(/var/spool/cron/root里每3分钟拉取一次远程脚本)。关键判断依据来自auditd日志:审计规则拦截到异常execve调用,确认是Redis未设密码导致的“挖矿蠕虫”自动植入。处理方式不是简单kill进程和删文件——先隔离实例,对照阿里云安全中心的漏洞扫描结果封堵Redis端口,再清理定时任务和ssh公钥,最后从快照回滚到未感染版本。

案例3:系统内核bug导致CPU软锁

内核问题排查难度最大,因为普通监控完全看不出异常进程。某Kubernetes node节点出现规律性CPU抖动:每6小时单核soft lockup,/var/log/messages刷出“BUG: soft lockup - CPU#2 stuck for 23s”报错。perf top实时采样显示,CPU周期大量消耗在native_queued_spin_lock_slowpath内核函数上,这是内核自旋锁的实现。结合云服务器实例规格和kernel版本号,用mcelog检查硬件错误日志排除物理CPU缺陷后,最终定位到是kernel 5.4.0-109-generic版本中vfio-pci模块的已知bug,触发条件与ENI网卡多队列中断处理相关。解决方案是锁定运行中的kernel版本并热迁移至新一代ECS实例,这个案例说明内核低版本在特定硬件加速场景下存在隐蔽瓶颈,定期关注云厂商公布的已知问题列表比纯粹折腾应用层参数更有价值。

预防与优化:如何避免CPU频繁飙升

排查终究是亡羊补牢。在我们处理过的案例中,超过60%的CPU告警其实都可以通过事前优化避免——问题在于,多数团队把时间花在了“救火”上,而非“防火”。

监控告警:把“不知道出问题”变成“比用户先知道”

仅盯着CPU整体使用率是不够的。一个典型的误判场景是:8核实例平均负载50%,看似安全,实际可能是单核被打满而其余核心闲置,这种“假均衡”同样会导致业务卡顿。建议在云监控中同时设置“单核CPU使用率”和“整体负载”两组指标,阈值分别设在85%和70%,并拉长聚合周期到5分钟以避免毛刺误报。更关键的是为关键进程——如java、php-fpm、mysqld——配置进程级存活与资源监控。进程静默退出但端口仍被监听的情况,CPU曲线是看不出来的。

进程资源限制:cgroups不是“限制”,是“隔离”

很多人对cgroups有误解,觉得限制资源就是牺牲性能。实际上,在共享同一台物理机的多业务场景下,不设限才是真正的风险。以PHP-FPM为例,一个死循环的慢查询就能打满所有worker进程,挤占Nginx甚至SSH的系统资源,导致你连登录排查的机会都没有。建议的做法是:为Web服务进程组设置CPU shares相对权重,而非硬上限(hard cap),这样在空闲时它仍能借调闲置算力,但在争抢场景下不会波及系统级服务。systemd集成的cgroups v2已经让这个配置简单到只需在unit文件中加三行参数。

定期审计:挖矿程序不会自己消失

安全加固不应该是一次性交付上线就算完的活。我们观察到,被植入挖矿脚本的ECS实例,从入侵到首次CPU飙升被发现,平均间隔是14天——恰好是很多团队设置告警后的观察窗口。攻击者现在的手法相当克制:将挖矿程序的CPU占用控制在30%-40%区间,只在凌晨时段运行,甚至主动检测top命令并短暂休眠。仅靠告警阈值很难捕获这类行为。建议每月至少做一次进程树审计,比对/proc下的进程列表与包管理器安装清单,对任何启动路径指向/tmp/dev/shm的可执行文件保持警惕。同时开启云平台内置的漏洞扫描,重点检查Web应用框架和中间件的已知漏洞——挖矿脚本的入侵入口,80%以上都源于这些组件的未修复漏洞。

相关文章
|
2天前
|
人工智能 弹性计算 运维
|
23天前
|
Linux 程序员 数据格式
【2026最新】Notepad++下载、安装和使用一篇搞定(附中文版安装包)
Notepad++ 是一款免费开源、轻量高效的 Windows 文本编辑器,支持 C/Python/HTML 等 80+ 语言语法高亮、代码折叠、正则替换、编码转换及插件扩展,专为程序员与文本处理用户打造,完美替代系统记事本。(239字)
|
8天前
|
人工智能 缓存 安全
Claude Code 封号真实原因曝光,这次彻底不装了,直接针对国内开发者的账号下手?
Claude Code 封号潮背后:逆向扒出客户端隐写区域标记,Anthropic 政策收紧叠加 DeepSeek 7 月涨价,国产替代更紧迫。
|
14天前
|
人工智能 JSON 自然语言处理
让教学更智慧:用阿里云百炼工作流,自动生成中小学教材内容#小有可为#有温度的AI
通过可视化工作流编排,将大模型推理能力转化为标准化的教学内容生成引擎。教师只需输入教材标题和适用学段,即可自动获得结构完整、符合课程标准的章节内容,大幅降低备课门槛,助力教育资源均衡化。
501 127
|
17天前
|
存储 人工智能 监控
QoderWork完全指南:从入门到精通,把“AI实习生”变成你的全能工作搭档
阿里云2026年推出的桌面端AI工作助手QoderWork,不止聊天,更可动手干活:本地运行、安全可控,支持文件整理、数据分析、PPT生成、网页开发等;内置专家套件、多Agent协作与自定义Skills,让AI真正成为你身边的“AI实习生”。
|
7天前
|
人工智能 编解码 物联网
2026 最新Stable Diffusion 本地部署教程 下载安装使用详细图解(含官网安装包)
Stable Diffusion(SD)是2022年发布的开源文生图模型,由Stability AI等联合开发。支持文生图、图生图、局部重绘等,依托VAE降低算力需求,可在消费级显卡运行。本文提供秋葉aaaki制作的Windows整合包(含图形界面与插件),开箱即用,零配置启动。
|
9天前
|
人工智能 安全 程序员
终于,Claude Code 封号的原因被曝光了!竟然针对中国用户,植入隐形代码?!
通俗易懂地揭秘 Claude Code 封号的手段,分享一些自己对 AI 编程困境的思考,Codex、Cursor、DeepSeek、智谱 GLM、甚至是豆包,都有所行动了
484 1
|
10天前
|
人工智能 安全 Cloud Native
Higress 新发布:AI Gateway 能力增强,Gateway API 及其推理扩展持续打磨
增强 AI 网关能力,持续打磨 Gateway API 及其推理扩展。
403 125
|
17天前
|
人工智能 弹性计算 API
什么是 AlibabaCloud Agent Toolkit
Alibaba Cloud Agent Toolkit 是面向AI Agent的阿里云智能工具套件,集成OpenAPI、Terraform、CLI与文档能力,提供MCP插件、场景化Skills及执行审计机制,助AI准确查API、生成代码、规划架构、校验部署,实现安全、可靠、可追溯的云上智能运维。
434 2