物理机操作系统使用df -h查看的磁盘实际使用情况和服务器BMC带外查看的信息不一致问题分析
-
-
- [**一 问题描述**](#一 问题描述)
- [**二 问题排查**](#二 问题排查)
- [**三 解决方法**](#三 解决方法)
-
-
- [3.1 手动执行fstrim命令](#3.1 手动执行fstrim命令)
- [3.2 查看fstrim服务及定时器](#3.2 查看fstrim服务及定时器)
- [3.3 修改systemd timer定时器的时间间隔](#3.3 修改systemd timer定时器的时间间隔)
-
- [**四 问题建议**](#四 问题建议)
-
一 问题描述
物理机中操作系统使用df -h查看的磁盘实际使用情况和服务器BMC带外查看的信息不一致
操作系统:df -h查看20T磁盘实际使用了5T存储
BMC带外:查看20T磁盘实际使用了10T存储
二 问题排查
lsblk -D查看,sdx设备支持discard情况。
可以从DISC-GRAN(丢弃粒度)和DISC-MAX(最大丢弃请求大小)的值来确定,通过lsblk -D命令查看sdx设备支持discard 操作,这通常与SSDs 或支持 TRIM命令的存储设备相关。DISC-ZERO列的值为0,这意味着丢弃数据块后设备不保证读取操作会返回全零数据。
bash
DISC-GRAN列显示为512B,意味着最小的丢弃单位是512B。
DISC-MAX 列显示为2G,意味着一次丢弃请求最多可以处理2G的数据。
操作系统默认支持使用WRITE SAME命令来发送UNMAP指令。在两个函数
sd_setup_write_same16_cmnd和sd_setup_write_same10_cmnd中都有所体现。
这两个函数都是设置WRITE SAME命令的,一个是16字节版本(WRITESAME 16),另一个是10字节版本(WRITE SAME 10)。它们的差别主要在于命令长度和地址及长度字段的大小。在这段代码中,如果unmap参数为true ,则设置cmd->cmnd[1]的
第三位(即0x8),这表示UNMAP标志被设置。这是SCSI命令协议中用来指示存储设备应该回收指定扇区的标志。WRITE SAME命令通常用于优化存储设备的写入性能,但当配合UNMAP标志使用时,它告诉存储设备可以释放这些扇区供重新使用。
三 解决方法
3.1 手动执行fstrim命令
bash
命令格式:fstrim 挂载点
执行fstrim /data命令,操作系统端使用df -h查看,和BMC端查看,结果相同。可见系统在执行fstrim之后下发了unmap指令。只是说需要手动执行fstrim,才会下发。
3.2 查看fstrim服务及定时器
fstrim.service和fstrim.timer
fstrim.service:这是一个服务单元,它可以手动启动,用来立即执行fstrim命令。
fstrim.timer: 这是一个定时器单元,它定期触发fstrim.service 。
默认情况下,这个定时器通常是每周触发一次。这意味着每周系统会自动运行一次fstrim 命令来回收未使用的块。fstrim.service 是由fstrim.timer定期激活的,因此,您不需要并且通常也不应该直接启fstrim.service。相反,您应该启用和启动 fstrim.timer定时器,它将按照预设的时间表定期触发fstrim.service。
3.3 修改systemd timer定时器的时间间隔
要修改fstrim.timer的时间间隔,需要编辑定时器的配置文件。fstrim.timer定义了何时运行fstrim.service 。以下是修改时间间隔的步骤:
bash
(1)查找定时器配置文件:
默认的fstrim.timer文件通常位于
/usr/lib/systemd/system/或/lib/systemd/system/目录中。如果您要自定义,建议将其复制到/etc/systemd/system/目录中,以覆盖默认配置。
(2)编辑定时器文件:
使用文本编辑器(如nano或vim) 编辑定时器文件。
cp /usr/lib/systemd/system/fstrim.timer /bak #备份fstrim.timer文件到/bak目录下
vim /etc/systemd/system/fstrim.timer
(3)修改OnCalendar行:
在文件中找到[Timer] 部分,并编辑OnCalendar行来设置您希望的时间间隔。例如,如果要每天运行,可以设置为:
[Timer]
OnCalendar=daily
或者,如果要更具体,可以使用更详细的时间规范,例如每周一上午8点:
[Timer]
OnCalendar=Mon *-*-* 08:00:00
(4)重新加载 systemd守护进程:
完成编辑后,重新加载systemd守护进程以确保它识别到更改:
systemctl daemon-reload
(5)重新启动定时器:
重新启动fstrim.timer以应用更改:
systemctl restart fstrim.timer
(6)检查定时器状态:
确认定时器的新时间表:
systemctl list-timers --all
修改fstrim.timer文件时,应避免改变任何其他的配置。另外,尽量不要直接修改/usr/lib/systemd/system/中的默认文件,因为它们可能会在系统升级时被覆盖。总是将自定义文件放在/etc/systemd/system/中。
四 问题建议
建议开启fstrim.timer,定期执行fstrim。默认周期是一周执行一次。
bash
systemctl enable fstrim.timer
systemctl start fstrim.timer