2. CXL 内存设备枚举与区域查看

任务说明

使用 Linux 内核自带的 cxl 工具(cxl-cli)枚举系统中的 CXL 内存设备,并查看每个设备的内存区域(region)、容量与 NUMA 节点归属。本案例聚焦“枚举 + 查看”这一只读操作,不涉及创建/销毁 region。

环境与依赖

  • 内核:启用 CXL 子系统(CONFIG_CXL_BUS、CONFIG_CXL_MEM、CONFIG_CXL_REGION),建议 6.x 及以上。
  • 工具:cxl-cli(提供 cxl 命令),以及 jq 用于解析 JSON 输出。
  • 权限:读取 sysfs 通常需要 root,建议 sudo 执行。
# Debian/Ubuntu
sudo apt install -y cxl-cli jq
# RHEL/Fedora
sudo dnf install -y cxl-cli jq

# 确认内核已加载 cxl 相关模块
lsmod | grep -E 'cxl|nd_'

核心命令与数据流

cxl list 从 /sys/bus/cxl/devices 读取设备拓扑,按 memdev → region → decoder 层级输出。默认输出人类可读文本,加 -M 输出机器可读 JSON,便于脚本提取容量与 NUMA 节点。

sysfs /sys/bus/cxl/devices cxl list 枚举拓扑 JSON 输出 -M / jq memdev(内存设备) ├─ size / ram_size ├─ numa_node └─ region(区域) ├─ size / resource └─ numa_node

完整实现:枚举并汇总设备信息

下面脚本调用 cxl list -M 获取 JSON,用 jq 提取每个 memdev 的容量、NUMA 节点及其 region 信息,输出一张汇总表。若系统无 CXL 设备,脚本会明确提示而非报错。

#!/usr/bin/env bash
# cxl_enum.sh —— 枚举 CXL 内存设备并查看区域/容量/NUMA 归属
set -euo pipefail

if ! command -v cxl &>/dev/null; then
  echo "错误:未找到 cxl 命令,请安装 cxl-cli" >&2
  exit 1
fi

# -M 输出机器可读 JSON;-m 显示 memdev;-R 显示 region
json=$(cxl list -M -m -R 2>/dev/null || true)

if [[ -z "$json" || "$json" == "[]" ]]; then
  echo "未检测到 CXL 内存设备(memdev 列表为空)。"
  exit 0
fi

echo "== CXL 内存设备枚举 =="
echo "$json" | jq -r '
  .[] | select(.memdev != null) |
  "memdev: \(.memdev)\n" +
  "  容量(字节): \(.size // "N/A")\n" +
  "  RAM容量(字节): \(.ram_size // "N/A")\n" +
  "  NUMA节点: \(.numa_node // "N/A")\n" +
  (if (.region // null) != null then
     "  区域: " + ([.region[] | "\(.region) size=\(.size // "N/A") numa=\(.numa_node // "N/A")"] | join("; "))
   else "  区域: 无" end) + "\n"
'

echo "== 原始 JSON(供进一步解析)=="
echo "$json" | jq .

运行与验证

chmod +x cxl_enum.sh
sudo ./cxl_enum.sh

判定通过条件:

  • 脚本正常退出(退出码 0),无 command not found 或 jq 解析错误。
  • 若系统存在 CXL 设备,输出中每个 memdev 均列出容量、NUMA 节点,并显示其 region 的 size 与 numa_node。
  • 若系统无 CXL 设备,输出“未检测到 CXL 内存设备”,同样视为脚本行为正确。

可交叉核对:ls /sys/bus/cxl/devices/ 应能看到 memdev* 与 region* 条目,与脚本枚举结果一致。

常见问题

  • cxl list 报 “no cxl devices”:内核未启用 CXL 或平台无 CXL 硬件,属正常情况。
  • 字段为 null:该 memdev 尚未创建 region,或未绑定 NUMA 节点,脚本以 “N/A”/“无” 呈现。
  • 权限不足:读取 sysfs 需 root,务必用 sudo 运行。