lsmem 是 util-linux 软件包的一部分,它通过读取 /sys/devices/system/memory/ 目录下的信息来显示系统的内存块信息。这对于理解系统内存布局、诊断内存相关问题和规划内存分配非常有用。
lsmem 通常包含在 util-linux 包中,大多数Linux发行版已预装:
# 如果未安装,可以使用以下命令
sudo apt update
sudo apt install util-linux
# 通常已预装,如需重新安装
sudo yum install util-linux
which lsmem 或 lsmem --version 2>/dev/null || echo "未安装"
lsmem [选项]
选项:可选参数,用于控制输出格式和内容| 参数 | 说明 |
|---|---|
-h 或 --help |
显示帮助信息 |
-V 或 --version |
显示版本信息 |
-a 或 --all |
显示所有内存块的详细信息 |
-b 或 --bytes |
以字节为单位显示大小 |
-k 或 --kilo |
以千字节为单位显示大小 |
-m 或 --mega |
以兆字节为单位显示大小 |
-g 或 --giga |
以千兆字节为单位显示大小 |
-H 或 --human |
以人类可读的格式显示大小 |
-n 或 --noheadings |
不显示标题行 |
-o 或 --output <字段列表> |
指定要显示的字段 |
-p 或 --pairs |
以key=value格式输出 |
-r 或 --raw |
原始格式输出,无对齐 |
-S 或 --split <列表> |
按指定列拆分输出 |
-s 或 --summary |
仅显示摘要信息 |
-y 或 --sysroot <目录> |
使用指定目录作为系统根目录 |
--output-all |
输出所有可用字段 |
--list |
使用列表格式输出(默认) |
lsmem 可以显示多个字段,以下是常用字段的说明:
| 字段 | 说明 |
|---|---|
RANGE |
内存块的物理地址范围 |
SIZE |
内存块的大小 |
STATE |
内存块状态(online, offline) |
REMOVABLE |
内存块是否可热移除 |
BLOCK |
内存块标识符 |
NODE |
内存块所属的NUMA节点 |
ZONE |
内存块所属的内存区域 |
OFFLINE |
内存块是否离线 |
ONLINE |
内存块是否在线 |
MAX |
最大可在线内存块数量 |
MIN |
最小可在线内存块数量 |
显示内存块摘要信息:
lsmem
输出示例:
RANGE SIZE STATE REMOVABLE BLOCK
0x0000000000000000-0x00000000bfffffff 3G online yes 0-23
0x0000000100000000-0x000000027fffffff 6G online yes 32-87
Memory block size: 128M
Total online memory: 9G
Total offline memory: 0B
显示所有内存块的详细信息:
lsmem -a
以人类可读格式显示:
lsmem -H
以字节为单位显示:
lsmem -b
以兆字节为单位显示:
lsmem -m
只显示特定字段:
lsmem -o RANGE,SIZE,STATE
以key=value格式输出:
lsmem -p
输出示例:
RANGE="0x0000000000000000-0x00000000bfffffff" SIZE="3G" STATE="online" REMOVABLE="yes" BLOCK="0-23"
RANGE="0x0000000100000000-0x000000027fffffff" SIZE="6G" STATE="online" REMOVABLE="yes" BLOCK="32-87"
不显示标题行:
lsmem -n
只显示在线内存块:
lsmem -a | grep "online"
只显示可热移除的内存块:
lsmem -a | grep "yes"
统计在线内存总量:
lsmem -s | grep "Total online"
计算内存块数量:
lsmem -n | wc -l
获取内存块信息并解析:
#!/bin/bash
echo "系统内存块分析报告"
echo "===================="
echo "生成时间: $(date)"
echo ""
# 获取内存块大小
BLOCK_SIZE=$(lsmem | grep "Memory block size:" | awk '{print $4}')
echo "内存块大小: $BLOCK_SIZE"
# 获取在线内存总量
ONLINE_MEM=$(lsmem -s | grep "Total online memory:" | awk '{print $4 $5}')
echo "在线内存总量: $ONLINE_MEM"
# 获取离线内存总量
OFFLINE_MEM=$(lsmem -s | grep "Total offline memory:" | awk '{print $4 $5}')
echo "离线内存总量: $OFFLINE_MEM"
# 统计内存块数量
BLOCK_COUNT=$(lsmem -n | wc -l)
echo "内存块数量: $BLOCK_COUNT"
# 统计可热移除的内存块数量
REMOVABLE_COUNT=$(lsmem -a | grep "yes" | wc -l)
echo "可热移除的内存块: $REMOVABLE_COUNT"
监控内存块状态变化:
#!/bin/bash
echo "开始监控内存块状态变化..."
OLD_STATE=$(lsmem -o STATE | sort | md5sum)
while true; do
NEW_STATE=$(lsmem -o STATE | sort | md5sum)
if [ "$OLD_STATE" != "$NEW_STATE" ]; then
echo "$(date): 内存块状态发生变化"
echo "当前状态:"
lsmem -o RANGE,STATE | grep -v "online"
OLD_STATE=$NEW_STATE
fi
sleep 5
done
分析NUMA节点内存分布:
#!/bin/bash
echo "NUMA节点内存分布分析"
echo "====================="
# 获取所有NUMA节点
NODES=$(lsmem -o NODE | grep -v "NODE" | sort -u)
for node in $NODES; do
echo "节点 $node:"
# 计算该节点的内存总量
NODE_MEM=$(lsmem -o NODE,SIZE -n | awk -v node="$node" '$1 == node {print $2}' | \
awk '{sum += $1} END {print sum}')
# 统计该节点的内存块数量
NODE_COUNT=$(lsmem -o NODE -n | grep -c "^$node$")
echo " 内存块数量: $NODE_COUNT"
echo " 内存总量: ${NODE_MEM}G"
# 检查该节点是否有可热移除的内存
REMOVABLE=$(lsmem -o NODE,REMOVABLE -n | awk -v node="$node" '$1 == node && $2 == "yes" {count++} END {print count}')
echo " 可热移除的内存块: $REMOVABLE"
echo ""
done
grep过滤特定状态的内存块awk提取和计算特定字段sort和uniq分析内存分布numactl分析NUMA架构#!/bin/bash
# 内存健康检查脚本
echo "内存健康检查报告"
echo "================"
echo "检查时间: $(date)"
echo ""
# 检查是否有离线内存块
OFFLINE_COUNT=$(lsmem -o STATE -n | grep -c "offline")
if [ $OFFLINE_COUNT -gt 0 ]; then
echo "⚠️ 警告: 发现 $OFFLINE_COUNT 个离线内存块"
echo "离线内存块详情:"
lsmem -o RANGE,SIZE,STATE | grep "offline"
else
echo "✅ 所有内存块都在线"
fi
echo ""
# 检查内存块大小是否一致
BLOCK_SIZES=$(lsmem -o SIZE -n | sort -u | wc -l)
if [ $BLOCK_SIZES -gt 1 ]; then
echo "⚠️ 警告: 发现多种内存块大小"
echo "内存块大小分布:"
lsmem -o SIZE -n | sort | uniq -c
else
echo "✅ 所有内存块大小一致"
fi
echo ""
# 检查可热移除内存
TOTAL_BLOCKS=$(lsmem -n | wc -l)
REMOVABLE_BLOCKS=$(lsmem -o REMOVABLE -n | grep -c "yes")
if [ $REMOVABLE_BLOCKS -lt $TOTAL_BLOCKS ]; then
echo "⚠️ 注意: 部分内存块不可热移除"
echo "可热移除比例: $REMOVABLE_BLOCKS/$TOTAL_BLOCKS"
else
echo "✅ 所有内存块都可热移除"
fi
echo ""
echo "检查完成"
在服务器管理中,lsmem可以帮助:
free - 显示内存使用情况vmstat - 显示虚拟内存统计top - 显示进程和内存使用numastat - 显示NUMA内存统计dmidecode - 显示DMI内存信息lscpu - 显示CPU信息lsblk - 显示块设备信息lspci - 显示PCI设备信息lsusb - 显示USB设备信息uname - 显示系统信息lsmem 与 free 的主要区别:
| 特性 | lsmem |
free |
|---|---|---|
| 关注点 | 物理内存块布局和状态 | 内存使用情况和统计 |
| 信息类型 | 物理内存区域、范围、状态 | 已用内存、可用内存、缓存、缓冲区 |
| 数据源 | /sys/devices/system/memory/ | /proc/meminfo |
| 使用场景 | 硬件诊断、内存规划、热插拔管理 | 性能监控、系统调优、资源管理 |
| 输出格式 | 内存块列表、范围、状态 | 内存总量、使用量、空闲量 |
建议:
lsmemfree 或 vmstatlsmem 和 dmidecodelsmem 和 numactllsmem显示的是物理内存块信息,不是虚拟内存或进程内存使用情况