news 2026/8/13 14:50:48

Linux 内存性能怎么测:先分清缺页、回收与抖动

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux 内存性能怎么测:先分清缺页、回收与抖动

Linux 内存性能怎么测:先分清缺页、回收与抖动

修改内存参数或调整brkmmap路径后,只看 RPS 很容易误判。吞吐提高的同时,缺页、直接回收或 NUMA 远端访问可能把尾延迟拉长。

内存性能要分阶段读:页表与缺页解释访问成本,回收和 THP 解释抖动,Slab 与碎片解释长期占用。测试环境里一次更快的平均值,不能代替这些机制证据。


1. 用户态采样与内核态开销的感知偏差

Gopprof或 Java JFR 能提供应用侧线索,但内存管理相关开销可能出现在缺页、系统调用或调度等待附近。是否进入 Direct Reclaim、发生远端 NUMA 访问或锁竞争,需要结合内核事件确认。

在分析 CPU 周期分布时,若直接使用perf top深入内核态,可观察到部分周期消耗于内核的free_unref_page_listshrink_page_list函数。

造成这种感知偏差的一个原因是按需分配:申请虚拟地址空间后,实际访问才可能触发缺页和物理页分配。主要缺页通常需要从后备存储取回页面,但不等同于一定发生 Swap。


2. 内存管理基准测试的环境隔离控制

为获得可比较的数据,应记录并尽量控制关键变量。以下操作会改变系统全局状态,只应在隔离测试机上执行:

  1. 禁用或限定透明巨页(THP)
    THP 可能改善或恶化不同负载的表现。测试时应记录其模式,必要时分别对比,而不是预设禁用:
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
  2. 清理 Page Cache 缓存干扰
    在每次测试前,将 Dirty Page 落盘并清空缓存,避免缓存残留影响 IO 与缺页异常计数:
    sync; echo 3 > /proc/sys/vm/drop_caches
  3. 绑定 CPU 亲和性与 NUMA 节点
    跨 NUMA 节点的内存访问延迟显著高于本地内存。需使用numactl工具锁定运行节点:
    numactl --cpunodebind=0 --membind=0 ./benchmark_app
  4. 锁定 CPU 调频策略
    防止动态调频引起测试耗时抖动:
    cpupower frequency-set -g performance

3. 内核态指标矩阵与数据诊断口径

评估内核内存机制的表现,需建立涵盖吞吐量、缺页率、Slab 利用率及 TLB 未命中的指标体系:

核心观测指标及判定标准如下:

核心指标数据来源工程判定标准与含义
Page Fault / s/proc/vmstatpgfaultpgmajfault,或进程级统计与业务负载、文件访问和内存工作集一起分析,不能由单项直接推出分配策略
Major Page Fault / s/proc/vmstat(pgmajfault)说明页面取得可能涉及较慢的后备存储;需区分文件页、匿名页和 Swap 情况
Slab 对象使用情况/proc/slabinfoactive_objs / num_objs可作为观察值;是否存在浪费需结合具体缓存、回收行为和基线判断
Direct Reclaim Latencyftrace事件mm_vmscan_direct_reclaim_begin直连回收发生的频次与单次停顿时长,直接影响 P99 尾部延迟

4. 诊断工具链链路分析

当系统出现内存分配瓶颈时,可通过以下工具递进分析:

使用sar工具观测页面回收与缺页异常活动:

# 观察内核页框回收与 Direct Reclaim 活动(间隔 1 秒) sar -B 1 5 # 重点指标说明: # pgpgin/s: 每秒从磁盘读入内存的数据量 # fault/s: 每秒产生的缺页异常总数 # majflt/s: 每秒产生的主要缺页异常数 # pgscand/s: Direct Reclaim 过程中扫描的页面数

使用slabtop评估内核对象缓存占用:

# 按内存占用降序查看 Slab 缓存 slabtop -s c # 重点关注对象: # dentry: 目录项缓存占用 # buffer_head: 块设备缓冲区头占用 # kmalloc-X: 通用小内存分配槽利用率

结合ftrace精准测量内核分配物理页框的实际耗时:

cd /sys/kernel/debug/tracing echo 0 > tracing_on echo function_graph > current_tracer echo mm_page_alloc > set_ftrace_filter echo 1 > tracing_on # 运行业务负载 5 秒后停止 sleep 5 echo 0 > tracing_on cat trace | head -n 20

若目标内核启用了相应的 ftrace 能力且符号可用,输出可用于观察相关调用路径。函数图的开销和可见粒度都需在测试记录中说明。


5. 性能数据分析的统计学规范

在解读内核调优数据时,需防范“平均数掩盖尾部”的统计陷阱。

即使只有少量请求出现长尾,也可能影响上游重试和队列堆积。是否由 Direct Reclaim 引起,需要把请求时间线与内核事件关联后再判断。

性能分析规范需聚焦于分位数分布(P50、P90、P99、P999)与极限压力下的降级表现。通过严格的变量隔离、多维度的内核指标交叉比对,方能准确判定性能优化的实际成效。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/13 14:50:20

ProGuard工作原理深度剖析:从字节码分析到代码混淆的实现

ProGuard工作原理深度剖析:从字节码分析到代码混淆的实现 【免费下载链接】proguard A fork of ProGuard. 项目地址: https://gitcode.com/gh_mirrors/pro/proguard ProGuard是一款强大的Java字节码处理工具,主要功能包括代码压缩(sh…

作者头像 李华
网站建设 2026/8/13 14:42:52

gh_mirrors/util/util 进阶实战:解决 React 开发中的 5 大常见难题

gh_mirrors/util/util 进阶实战:解决 React 开发中的 5 大常见难题 【免费下载链接】util 🛠️ Shared React utilities for rc-component packages. 项目地址: https://gitcode.com/gh_mirrors/util/util gh_mirrors/util/util 是一个专为 React…

作者头像 李华
网站建设 2026/8/13 14:41:41

CentOS Stream 9 配置阿里云镜像源:提升软件包管理效率与稳定性

1. 项目背景与核心需求解析 最近在折腾一台新装的 CentOS Stream 9 服务器,第一件事就是配置软件源。默认的官方源在国内访问速度慢得让人抓狂,一个简单的 dnf update 都能卡成幻灯片。这几乎是所有国内 Linux 用户,无论是运维、开发者还是…

作者头像 李华
网站建设 2026/8/13 14:40:50

3步解锁专业翻译:DeepL Chrome插件让外文网页阅读零障碍

3步解锁专业翻译:DeepL Chrome插件让外文网页阅读零障碍 【免费下载链接】deepl-chrome-extension A DeepL Translator Chrome extension 项目地址: https://gitcode.com/gh_mirrors/de/deepl-chrome-extension 还在为阅读外文网页而头疼吗?DeepL…

作者头像 李华