Linux服务器CPU飙高应急手册从快速定位到根治预防面对CPU告警别慌先抓现场再定策略。本文提供一套从5分钟快速诊断到内核级排查的标准流程并附上自动化脚本。1. 快速诊断黄金5分钟当收到CPU告警时前5分钟的目标是确定 culprit罪魁祸首和判断负载类型。1.1 找出CPU消耗大户# 第一条命令看进程top-bn1|head-20# 静态快照# 或直接进入交互模式按 P 键大写按CPU使用率排序top# 更直观的工具需安装htop1.2 评估系统负载压力# 查看平均负载 (1分钟,5分钟,15分钟)uptime# 输出示例load average: 22.45, 15.32, 10.10# 解读22.45 CPU核心数如16核说明确实过载且有上升趋势1.3 剖析CPU时间片# 每秒刷新一次共5次分析CPU时间分布vmstat15# 重点关注列# us: 用户态占用应用程序如Java业务# sy: 系统态占用内核如系统调用、中断# wa: 等待I/O磁盘或网络# id: 空闲CPU2. 深入排查方向根据vmstat的结果分岔路口排查2.1 用户态高 (us) — 业务代码问题# 1. 确认进程细节psauxf|grep[P]ID# 2. 追踪进程的系统调用慎重执行会拖慢进程strace-cp PID# 统计耗时最多的系统调用strace-T -p PID# 实时跟踪具体调用# 3. Java应用专项top-Hp PID# 查看进程内哪个线程PID耗CPUprintf%x\n线程PID# 将线程PID转16进制jstack PID|grep-A2016进制线程ID# 抓取线程堆栈jstat -gcutil PID10005# 看GC情况FGC次数及耗时2.2 内核态高 (sy) — 内核或锁竞争# 1. 查看系统日志硬件报错、OOM等dmesg|tail-20# 2. 检查上下文切换vmstat15# 关注 cscontext switch列若数值巨大说明线程/进程频繁切换# 3. 查看中断cat/proc/interrupts# 查看中断分布检查是否有不均衡2.3 I/O等待高 (wa) — 磁盘瓶颈# 1. 查看磁盘读写状态iostat -x15# 关注 await响应时间、%util磁盘饱和度# 2. 定位具体占用I/O的进程iotop -o# 仅显示正在做I/O的进程3. 应急处理止血措施在找到根因前先恢复服务可用性。场景操作说明非核心任务renice -n 19 -p PID将进程优先级调到最低让它“靠边站”失控进程kill -STOP PID暂停进程执行进程仍在内存可恢复比kill -9友好必须终止kill -9 PID最后手段会导致句柄未释放、数据丢失临时降级systemctl stop 非核心服务腾出CPU资源给核心业务4. 预防措施左移监控告警配置Prometheus Grafana或Zabbix设置CPU使用率80%持续5分钟告警。内核调优# 减少Swap倾向避免内存频繁换入换出默认60sysctl -w vm.swappiness10定期巡检将上述命令写入Cron每周生成健康报告。容量评估结合业务高峰如双11、促销评估是否需要扩容。5. 核心原则先定位再处理不要看到CPU高就重启丢失了现场。保留现场截屏top、保存jstack日志便于事后复盘。区分真凶区分是业务高峰的正常上涨还是代码死循环的异常飙高。️ 附一键CPU排查脚本将以下脚本保存为cpu_check.sh授权后直接运行适用于CentOS/Ubuntu。#!/bin/bash# 文件名: cpu_check.sh# 描述: Linux CPU 飙高快速排查脚本echoecho CPU 飙高快速排查脚本$(date%Y-%m-%d %H:%M:%S)echo# 1. 系统负载echo1️⃣ 系统负载 (uptime):uptimeecho# 2. 查看CPU核心数cores$(grep-cprocessor/proc/cpuinfo)echoCPU核心数:$cores# 3. Top 5 CPU消耗进程echo2️⃣ Top 5 CPU 消耗进程:ps-eo pcpu,pid,user,comm --sort-pcpu|head-6echo# 4. CPU时间分布 (最近5秒)echo3️⃣ CPU 时间分布 (us/sy/id/wa):vmstat13|tail-4echo# 5. 上下文切换监控echo4️⃣ 上下文切换统计 (cs列):vmstat12|awkNR3 {print 当前cs: $12}echo# 6. 磁盘IO状况echo5️⃣ 磁盘IO (如果有wa高重点关注):iostat -x12|grep-v loop|grep-EDevice|vda|sda|sdb|tail-6echo# 7. 如果是Java进程提供手动排查提示java_pid$(ps-ef|grepjava|grep-vgrep|awk{print $2})if[!-z$java_pid];thenecho 检测到Java进程(PID:$java_pid)建议执行:echo 查看线程: top -Hp$java_pidecho 抓取堆栈: jstack$java_pid java_$(date%s).logelseecho✅ 未检测到Java进程fiechoecho排查建议: 若us高查业务; sy高查内核; wa高查磁盘使用方法chmodx cpu_check.sh ./cpu_check.sh内存瓶颈问题分析和调优实战在性能测试中如果只关注压测执行不进行结果分析和问题调优就像医生只开化验单不治病一样是对工作的敷衍。真正专业的性能测试工程师必须掌握分析和调优的能力。而内存问题内存不足/泄露/溢出是性能瓶颈中最常见的一类今天我们就来系统学习内存相关知识帮助大家在遇到内存性能瓶颈时能够游刃有余。一、内存概念深度解析1.1 存储系统架构计算机的存储系统分为主存储系统内存和辅助存储系统外存外存硬盘、软盘、光盘、网络云盘等辅助存储器内存主存用于暂时存放中间态的临时数据是外设与CPU进行沟通的桥梁[CPU] -- [内存] -- [外存硬盘等] ↑ ↑ 极速通道 慢速通道1.2 灵魂拷问为什么需要内存作为桥梁问题为什么不直接让CPU和外存直接连接交互答案因为外存性能远低于CPU。以典型设备为例CPU处理速度纳秒级10^-9秒内存访问速度微秒级10^-6秒硬盘访问速度毫秒级10^-3秒如果CPU直接访问外存外设会严重拖垮CPU性能导致CPU大部分时间都在等待数据。因此内存就是CPU和外设之间的高速缓存CPU需要的数据先从外存加载到内存再从内存高速读取大幅提升整体性能。1.3 内存vs外存核心区别维度内存外存速度快但比CPU慢慢容量几个GB几个TB访问权限CPU可直接访问数据必须先到内存CPU才能处理易失性关机断电数据丢失数据持久化保存二、内存分析工具全家桶在性能测试执行过程中我们需要使用各种分析监控工具观察内存使用情况以定位性能瓶颈。2.1 /proc/meminfoLinux内存总览这是Linux系统最底层的内存信息查看方式cat/proc/meminfo关键指标解读指标含义说明MemTotal总可用内存 物理内存 - 预留位和内核使用所以小于物理内存MemFree完全未使用的内存空闲内存MemAvailable真正的系统可用内存重点指标。系统中有些内存虽已被使用但可回收cache/buffer、slabBuffers缓冲对原始磁盘块的临时存储用于缓存磁盘数据。内核可将分散的写集中起来优化磁盘写入Cached缓存从磁盘读取文件的页缓存。下次访问这些文件数据时可直接从内存获取2.2 free命令最常用的内存分析命令free-h# 以人类可读格式显示free-c5-s3# 打印5次间隔3秒输出示例total used free shared buff/cache available Mem: 7.6G 2.1G 1.2G 123M 4.3G 5.0G Swap: 2.0G 0B 2.0G计算公式MemTotal used free buff/cacheavailable free 部分buff/cache可回收部分2.3 top/htop命令进程级内存分析top命令系统自带tophtop命令需要安装yum -yinstallhtophtophtop优势彩色高亮显示关键信息内存默认以M为单位更直观显示完整的执行命令底部快捷工具栏操作方便进程内存指标指标全称含义VIRTVirtual Memory进程占用的虚拟内存大小RESResident Memory进程常驻内存大小实际物理内存占用SHRShared Memory共享内存大小%MEMMemory Usage进程占用的物理内存百分比重点关注RES这才是进程真正占用的物理内存。2.4 vmstat系统级内存监控vmstat35# 每3秒输出一次共5次输出示例procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 1 0 0 1245672 123456 789012 0 0 12 34 123 456 3 1 95 1 0内存相关指标解读指标含义阈值判断swpd使用的虚拟内存大小0表示物理内存可能不足free可用物理内存少不一定内存不足需结合si/sobuff缓冲区大小正常波动cache缓存大小正常波动si每秒从Swap读入内存的大小长期0表示内存紧张so每秒从内存写出到Swap的大小正常现象写入交换分区是正常的bi/bo磁盘读写指标反映系统与外部设备的数据交换活动。2.5 jmapJava内存专属分析工具JDK自带专门用于分析Java应用内存jmap -heappid# 查看Java堆详细信息回收机制、分代情况jmap -histopid# 查看堆中对象统计信息类、实例数量jmap -dump:formatb,fileheap.hprofpid# 生成堆转储快照适用场景Java应用内存泄漏排查、GC问题分析。三、内存问题实战排查方法论3.1 内存问题类型诊断问题类型症状排查思路内存不足free少但cache/buffer可回收检查MemAvailable清理缓存内存泄漏RES持续增长GC无法回收jmap dump分析代码审查内存溢出OOM Killer杀进程应用崩溃调整JVM参数优化代码3.2 排查步骤流程图开始排查 ↓ free -h → MemAvailable充足→ 是→ 检查其他瓶颈 ↓否 vmstat → si/so频繁→ 是→ 物理内存不足需扩容 ↓否 top/htop → 哪个进程RES高→ 定位到具体进程 ↓ 如果是Java进程 → jmap分析堆内存 ↓ 根据分析结果 → 代码优化/参数调整 ↓ 再次压试验证3.3 典型案例分析案例1物理内存不足但可回收现象free很小但available充足# free -htotal usedfreeshared buff/cache available Mem:7.6G6.5G0.1G 123M1.0G1.2G分析buff/cache占1.0G其中大部分可回收实际可用内存1.2G并非真正瓶颈。案例2内存泄漏预警现象Java进程RES持续增长GC后不下降# 每隔10秒观察一次watch-n10ps aux | grep java | grep -v grep分析需用jmap dump堆内存分析哪些对象未被释放。四、内存调优实战指南4.1 系统级调优清理缓存临时方案echo3/proc/sys/vm/drop_caches# 清理pagecache、dentries和inodes调整swap使用策略# 查看当前swappiness值0-100越大越倾向于使用swapcat/proc/sys/vm/swappiness# 临时调整避免过度使用swapsysctl vm.swappiness10# 永久生效echovm.swappiness10/etc/sysctl.conf4.2 Java应用调优JVM堆内存设置# 示例设置堆大小4G新生代1.5G使用G1垃圾收集器java -Xms4g -Xmx4g -Xmn1.5g -XX:UseG1GC -jar app.jar关键JVM内存参数参数作用建议-Xms初始堆大小设为与-Xmx相同避免动态调整-Xmx最大堆大小不超过物理内存的70%-Xmn新生代大小一般为堆的1/3~1/4-XX:MaxMetaspaceSize元空间最大大小根据类加载情况设置4.3 代码级优化建议及时释放资源IO流、数据库连接等用完即关避免内存缓存过量使用Guava Cache等设置上限对象复用使用对象池减少频繁创建销毁集合容量预设ArrayList等预设初始容量避免扩容五、总结内存调优核心要点多工具组合分析free看全局top/vmstat看动态jmap深入Java内部关注MemAvailable真正的可用内存比free更准确si/so指标预警持续非零值表示物理内存紧张区分内存问题类型不足/泄漏/溢出对症下药调优分层进行系统级→JVM级→代码级最后提醒内存调优不是一蹴而就的需要在压测中持续观察、分析、调整、验证形成闭环。真正的性能测试工程师不仅要会开化验单更要会治病开药。