讲师中心 微信公众号
AI工具推荐 视频效率加速

Linux CPU 性能瓶颈排查与优化

冬萱同学_5869

冬萱同学_5869

发布时间:2026-02-15 14:56:03

|

585人浏览过

|

来源于php中文网

原创

应先关闭 top 自动排序并盯住 %CPU 数值变化,结合 vmstat 的 r/b 列判断真实瓶颈;用 perf record -g -k 1 采集含内核栈的火焰图,配合 --no-children 分析调用深度;避免盲目调整调度参数,优先使用 chrt 设置实时策略。

linux cpu 性能瓶颈排查与优化

top 和 htop 看不出真实瓶颈?先关掉自动排序再盯 %CPU

默认 top 按 %CPU 实时排序,容易让你只看到“最忙的进程”,却漏掉短时爆发、线程抖动或 I/O 等待伪装成 CPU 占用的问题。比如一个进程 %CPU 显示 95%,但实际是频繁阻塞在磁盘读写,top 的 CPU 列只是“就绪态等待时间”的统计偏差。

  • 运行 top 后按 Shift+P 确保按 CPU 排序,再按 1 切换到所有 CPU 核心视图,观察是否集中在单核(说明是串行瓶颈,不是整体算力不足)
  • 按 t 关闭任务视图顶部的“CPU usage”条形图——它会干扰对数字本身变化趋势的判断
  • 更可靠的做法:用 htop(需安装),按 F4 过滤 R(Running)状态进程,排除大量 S(Sleeping)进程干扰
  • 注意 %CPU 是采样周期内占用时间占比,如果进程刚启动或刚唤醒,数值可能跳变剧烈,连续观察 5 秒以上再下判断

perf record -g 能抓到函数级热点,但默认不包含内核栈

直接跑 perf record -g -p <pid></pid> 只能拿到用户态调用栈,而很多 CPU 瓶颈其实在内核路径里,比如锁竞争、页回收、ext4 元数据操作。不带内核符号的话,你看到的可能是 [unknown] 或一堆 __x64_sys_* ,完全没法定位。

  • 确保已安装对应内核版本的 debuginfo 包,例如 CentOS/RHEL 上运行:yum debuginfo-install kernel-$(uname -r)
  • 采集时加 -k 1 强制包含内核栈:perf record -g -k 1 -p <pid> sleep 10</pid>
  • 报告时用 perf report --no-children 避免被“折叠优化”隐藏真实调用深度;若看到大量 do_syscall_64 → ksys_read → ext4_file_read_iter,说明是小文件读性能问题,不是应用逻辑慢
  • 注意 perf 默认采样频率是 4000Hz,高负载下可能丢样本,可临时提至 -F 8000,但别超过 10000,否则自身开销反成干扰

vmstat 1 的 r 和 b 列比 %CPU 更早暴露调度瓶颈

vmstat 1 输出里 r(运行队列长度)持续 > CPU 核数,或 b(不可中断睡眠进程数)突增,往往意味着 CPU 不是真忙,而是被 I/O 或锁卡住。这时候杀高 CPU 进程没用,反而可能让队列更乱。

Obsidian (Linux)
Obsidian (Linux)

操作 Obsidian 库(纯 Markdown 笔记),并通过 notesmd-cli 实现自动化。

下载
  • r 值长期大于 $(nproc),说明就绪态任务积压,典型如大量短生命周期线程反复创建销毁(比如 Python 的 concurrent.futures.ThreadPoolExecutor 配置过小 + 任务粒度太细)
  • b > 0 且波动大,大概率有进程卡在 D 状态(uninterruptible sleep),常见于 NFS 挂载超时、坏盘响应延迟、或某些驱动 bug;用 ps aux | awk '$8 ~ /D/ {print}' 快速揪出
  • 配合 cat /proc/<pid>/stack</pid> 查看 D 状态进程的内核栈,比猜更准;若看到 wait_on_page_bit_common,优先查内存或存储子系统
  • 注意 vmstat 的 us/sy 是平均值,无法反映毛刺;如果 r 高但 us 低,基本可断定是内核态争抢(如自旋锁、RCU callback 积压)

不要盲目调 /proc/sys/kernel/sched_min_granularity_ns

网上常有人说“调小这个值能让小任务更快获得 CPU”,但实际在多数业务场景下,它只会增加调度器开销,降低缓存局部性,甚至引发更多上下文切换抖动。Linux CFS 调度器已经足够智能,除非你跑的是确定性实时仿真或高频交易网关,否则改它大概率是负优化。

  • 默认值通常是 750000(750μs),在 48 核机器上改到 300000 后,context-switches/sec 可能翻倍,而吞吐量不变甚至下降
  • 真正该调的是 /proc/sys/kernel/sched_latency_ns —— 它控制调度周期长度,和核心数正相关;CFS 会自动按比例缩放,手动改容易破坏公平性
  • 如果你的应用确实对延迟敏感(比如音视频编码线程),优先用 chrt -f 50 设为 SCHED_FIFO,比调 granularity 更直接有效
  • 改任何 /proc/sys/kernel/sched_* 参数前,先用 perf stat -e 'sched:sched_switch' -a sleep 10 记录基线,避免把“观测扰动”当成“性能提升”

最麻烦的 CPU 瓶颈,往往藏在用户态和内核态交界处——比如一个 epoll_wait 返回后立刻 write 失败重试,循环飞快,但 perf 看不到用户代码热点,因为大部分时间耗在内核 socket 缓冲区锁或 TCP 重传定时器上。这时候得切到 trace-cmd 或 bpftrace 抓事件链,而不是盯着 %CPU 数字较劲。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

3120

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

269

2026.02.03

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

6307

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2648

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

6307

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2648

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

4478

2023.08.10

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

4290

2023.06.21

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn