一、问题描述
在 Ubuntu 26.04.1 LTS 服务器上,XTerminal 的服务器监控功能可以正常显示 CPU、内存、网络和磁盘容量信息,但磁盘 I/O 读取速度、写入速度始终显示为 0.0 B。
经过排查发现,Linux 内核能够正常统计磁盘 I/O,XTerminal 远程采集脚本也可以计算读写速度,但对于 LVM(Logical Volume Manager)逻辑卷存在设备识别和名称关联问题。
经过修改采集脚本的设备过滤规则,以及将 I/O 设备名统一为文件系统挂载源名称后,磁盘读写速度成功恢复显示。
二、问题环境
项目
环境
操作系统
Ubuntu 26.04.1 LTS (Resolute Raccoon)
内核版本
7.0.0-34-generic
文件系统
ext4
磁盘结构
SCSI 磁盘 + LVM
根文件系统
/dev/mapper/ubuntu--vg-ubuntu--lv
对应块设备
/dev/dm-0
XTerminal 远程采集脚本版本
26
XTerminal 客户端版本
最新版(具体版本号待补充)
重装最新远程监控脚本后,问题依然存在。
三、发现的两个问题
问题 1:采集脚本没有包含 dm-* 设备
文件路径:
~/.xterminal/sub/fs_stats/fs_stats.sh
当前远程脚本版本 26 的设备过滤逻辑为:
is_tracked_block_device() {
case "$1" in
sd[a-z]*|vd[a-z]*|hd[a-z]*|xvd[a-z]*|nvme*n*|mmcblk*|mtdblock*|ubiblock*|loop*)
return 0
;;
esac
return 1
}
问题:缺少 dm-* 设备的匹配规则。
Ubuntu 使用 LVM 时,实际逻辑卷设备为 dm-0。虽然 /proc/diskstats 包含该设备的 I/O 统计数据,但采集脚本会将其过滤。
手动增加:
|dm-[0-9]*
之后,fs_stats.stats 成功出现:
- device: dm-0
rxPerSec: 0
wxPerSec: 84195
source: proc
证明该设备可以正常采集。
问题 2:LVM 设备名称没有正确关联
添加 dm-0 采集支持后,监控界面仍然显示 0.0 B。
进一步发现:
文件系统容量统计使用:
fsSize:
- fs: /dev/mapper/ubuntu--vg-ubuntu--lv
type: ext4
mount: /
磁盘 I/O 统计使用:
fsStats:
- device: dm-0
rxPerSec: 0
wxPerSec: 230286
source: proc
两个名称实际指向同一个块设备,但 XTerminal 无法正确关联其读写速度。
为验证这一问题,修改采集脚本,将 dm-0 对外输出的设备名改成:
/dev/mapper/ubuntu--vg-ubuntu--lv
修改后采集结果:
fsStats:
- device: /dev/mapper/ubuntu--vg-ubuntu--lv
rxPerSec: 0
wxPerSec: 68949
source: proc
测试结果:XTerminal 磁盘写入速度成功恢复显示。
进一步使用 dd 进行直接读取测试,产生实际磁盘读取 I/O,XTerminal 也能够正确显示读取速度。
说明客户端可以展示读取和写入速度,异常与 LVM 设备名称关联具有明确关系。
四、复现与验证结果
测试操作
结果
原版脚本监控 LVM 根分区
读写速度始终为 0
检查 /proc/diskstats
存在正常 I/O 数据
重装最新采集脚本
未解决
添加 dm-[0-9]* 匹配规则
可以采集 dm-0,但界面仍为 0
将 dm-0 输出为 ubuntu--vg-ubuntu--lv
未恢复
将 dm-0 输出为完整 /dev/mapper/ubuntu--vg-ubuntu--lv
写入速度恢复
使用 dd 产生直接磁盘读取
读取速度恢复
恢复原脚本
临时修复不再保留
补充说明:低负载下读取速度为 0 是正常情况,因为实际采样结果 rxPerSec 也可能为 0,不属于本次 Bug。
五、原因分析
根据实际脚本及验证结果,推测存在两个需要修复的兼容性问题:
1. 远程采集脚本缺少 Device Mapper 设备支持。
当前设备过滤规则没有包含 dm-*,导致 LVM 逻辑卷不能直接进入磁盘 I/O 统计列表。
2. 磁盘容量和 I/O 数据的设备标识缺少规范化关联。
fsSize.fs 使用 /dev/mapper/...,而 fsStats.device 使用 dm-0。
两者虽然属于同一个逻辑卷,但当前展示链路未能正确关联。将 I/O 设备名称改成与 fsSize.fs 完全一致后,监控恢复正常。
六、建议修复方案
建议官方从以下两方面修复:
完善 Linux 远程采集脚本:在 is_tracked_block_device() 中支持 dm-[0-9]*,确保 LVM 和 Device Mapper 设备可以被正常采集。
完善设备名称映射逻辑:对 /dev/mapper/...、/dev/dm-* 等同一块设备的不同命名形式进行规范化关联,建议考虑 Linux 主次设备号(major:minor),避免直接通过设备名称字符串匹配。
另外,在统计磁盘总 I/O 时,建议避免将 sda、sda3、dm-0 同一条存储链路的 I/O 简单相加,以免重复计算。
七、结论
本次问题在 Ubuntu 26.04.1 LTS + LVM 环境下已复现,并通过修改远程采集脚本成功验证临时解决方案。
这不是 Ubuntu 内核无法提供磁盘 I/O 数据,而是 XTerminal 对 LVM 逻辑卷的采集及设备名称关联存在兼容性问题。
希望官方能够在后续版本中修复,避免用户每次更新采集脚本后需要重新手动修改。
如有需要,愿意提供复现bug的环境