Linux lsmem 怎样选择内存块输出列
来源:17golang原创
时间:2026-10-30 19:44:00 329浏览 收藏
排查 Linux 内存热插拔或 NUMA 布局时,lsmem 默认输出看起来够用,但一旦要写脚本、对照节点或逐块定位,默认列就不够稳定。我的做法是先按任务显式写 --output,再决定是否用 --all 或 --split 改变范围的粒度。
官方地址:https://github.com/util-linux/util-linux/blob/master/sys-utils/lsmem.1.adoc
- 人读排查先从
RANGE,SIZE,STATE开始,再按任务追加NODE、ZONES或REMOVABLE。 - 脚本不要依赖默认列,使用
--output固定字段;+NODE可在默认列上追加信息。 --all查看单个内存块,--split决定范围在哪些属性变化时分段。
先按排查目标选出最小列集合
lsmem 展示的是 sysfs 内存块的范围和 online 状态。若只是判断哪些范围在线,RANGE、SIZE、STATE 就足够;若问题涉及 NUMA 亲和性,再加 NODE;怀疑内存热移除时,加 REMOVABLE;研究内存热插拔元数据时,才需要 CONFIGURED 或 MEMMAP-ON-MEMORY。
# 只看范围、容量和 online 状态,适合快速人工判断 lsmem --output RANGE,SIZE,STATE # 追加 NUMA 节点和 zone,观察同一范围属于哪个内存拓扑 lsmem --output RANGE,SIZE,STATE,NODE,ZONES # 查看热插拔相关属性;不同架构可能没有完整数据 lsmem --output BLOCK,RANGE,STATE,REMOVABLE,CONFIGURED,MEMMAP-ON-MEMORY
列名必须以当前系统的 lsmem --help 为准。官方手册列出的列并不保证每台机器都支持;不支持的列可能保留表头但没有数据,某些架构还会跳过与自身无关的状态。

用 --output 固定列,避免脚本被默认格式拖累
--output list 使用逗号分隔的列名替换默认集合,最适合日志采集和运维脚本。若只想在默认视图上加一列,可以使用 +list,例如 --output +NODE。这比事后用 awk 按列号切割更稳,因为默认输出的列集合可能随 util-linux 版本或系统能力变化。
| 目标 | 建议列 | 注意点 |
|---|---|---|
| 在线状态巡检 | RANGE,SIZE,STATE | 先判断范围是否在线 |
| NUMA 拓扑 | RANGE,SIZE,NODE,ZONES | 用于对照节点和 zone |
| 热插拔排查 | BLOCK,STATE,REMOVABLE,CONFIGURED | 字段可能受架构支持限制 |
| 脚本传输 | 固定 --output,必要时配 --json | 不要把默认表格当稳定接口 |
# 采集机器的固定字段,避免按默认列号解析 lsmem --output BLOCK,RANGE,SIZE,STATE,NODE --bytes # 只在默认视图上增加 NUMA 节点,适合一次性人工排查 lsmem --output +NODE
用 --all 和 --split 控制范围粒度
lsmem 默认会把输出列相同的相邻内存块合并成范围。要核对某个异常块,使用 --all 列出每个独立块;要让某个属性变化就触发分段,则使用 --split。例如按 NUMA 节点或 online 状态分段:
# 每个内存块单独列出,便于定位一个异常 BLOCK lsmem --all --output BLOCK,RANGE,SIZE,STATE,NODE # 只有 STATE 或 NODE 变化时才切开范围 lsmem --split=STATE,NODE --output RANGE,SIZE,STATE,NODE # 忽略属性差异,尽量构造连续的大范围;谨慎用于解释字段 lsmem --split=none --output RANGE,SIZE,STATE,REMOVABLE
--split=none 的结果适合看整体连续区间,却不适合直接推断每一小块都可移除。官方手册特别提醒:如果聚合策略忽略了可移除性等属性,合并后的整段可能显示成一个不完全代表每个块的值。因此“范围更少”不等于“属性更准确”。

把格式、边界和复查动作写进脚本
需要机器处理时,可以在固定列之外选择 --json、--pairs 或 --raw。--bytes 适合避免人类单位换算,但仍要记录列名和聚合策略。一个实用的复查顺序是:先用最小列集合确认状态,再用 --all 找到具体块,最后用 --split 验证是哪个属性导致范围被拆开。
- 先运行
lsmem --output RANGE,SIZE,STATE,确认在线和离线范围。 - 加入
NODE、ZONES或REMOVABLE,缩小拓扑或热插拔方向。 - 异常只落在一小段时改用
--all,不要继续猜聚合范围。 - 要生成稳定报表时固定列、格式和
--split,并记录当前 util-linux 版本。
常见问题
为什么指定了列名却没有数据?
列可能不被当前内核、架构或内存热插拔实现支持。先确认列名拼写,再接受“有表头、无值”是工具对不支持字段的表现。
什么时候应该使用 --all?
当你需要定位具体 BLOCK、核对每个块的状态,或怀疑相邻块属性并不一致时使用;日常总览保留默认聚合更易读。
--split 和 --output 有什么区别?
--output 决定显示哪些字段,--split 决定字段变化时是否切分范围。前者是列选择,后者是数据聚合策略,不能互相替代。
记住一个简单原则:先固定要看的列,再决定要不要拆开范围。这样既能让人工排查保留上下文,也能让脚本避免依赖随环境变化的默认表格。
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
296 收藏
-
369 收藏
-
409 收藏
-
107 收藏
-
251 收藏
-
269 收藏
-
209 收藏
-
332 收藏
-
481 收藏
-
373 收藏
-
279 收藏
-
183 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习