登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  linux

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 为准。官方手册列出的列并不保证每台机器都支持;不支持的列可能保留表头但没有数据,某些架构还会跳过与自身无关的状态。

Linux lsmem 按排查任务选择 RANGE SIZE STATE NODE ZONES 和热插拔字段的说明图
图1:lsmem 输出列与排查目标的对应说明图,不是终端截图或运行证据。

用 --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 的结果适合看整体连续区间,却不适合直接推断每一小块都可移除。官方手册特别提醒:如果聚合策略忽略了可移除性等属性,合并后的整段可能显示成一个不完全代表每个块的值。因此“范围更少”不等于“属性更准确”。

Linux lsmem 使用 all 与 split 控制内存块聚合粒度的关系说明图
图2:lsmem 的逐块查看、按属性分段与连续范围聚合关系说明图,不是实际运行截图。

把格式、边界和复查动作写进脚本

需要机器处理时,可以在固定列之外选择 --json、--pairs 或 --raw。--bytes 适合避免人类单位换算,但仍要记录列名和聚合策略。一个实用的复查顺序是:先用最小列集合确认状态,再用 --all 找到具体块,最后用 --split 验证是哪个属性导致范围被拆开。

  1. 先运行 lsmem --output RANGE,SIZE,STATE,确认在线和离线范围。
  2. 加入 NODE、ZONES 或 REMOVABLE,缩小拓扑或热插拔方向。
  3. 异常只落在一小段时改用 --all,不要继续猜聚合范围。
  4. 要生成稳定报表时固定列、格式和 --split,并记录当前 util-linux 版本。

常见问题

为什么指定了列名却没有数据?

列可能不被当前内核、架构或内存热插拔实现支持。先确认列名拼写,再接受“有表头、无值”是工具对不支持字段的表现。

什么时候应该使用 --all?

当你需要定位具体 BLOCK、核对每个块的状态,或怀疑相邻块属性并不一致时使用;日常总览保留默认聚合更易读。

--split 和 --output 有什么区别?

--output 决定显示哪些字段,--split 决定字段变化时是否切分范围。前者是列选择,后者是数据聚合策略,不能互相替代。

记住一个简单原则:先固定要看的列,再决定要不要拆开范围。这样既能让人工排查保留上下文,也能让脚本避免依赖随环境变化的默认表格。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>