问题出现得很突然,日志倒是留得挺全。CentOS 7.9 上用 LVM thin pool 给 Docker 做数据盘,lvs 里 Data% 涨到 100 之后所有写入报 Input/output error,dmesg 末尾是 Thin pool data 空间不足,之前看到八十几的占用没当回事。
刚开始盯着「没开 thin_pool_autoextend_threshold,池子满了也不会自动扩容」,折腾了半个多小时,排掉了。
真正麻烦的地方在于,几个原因的现象几乎一样。thin pool 的数据空间用尽,thin 卷的写入会被直接拒绝而不是安静地报错。还有一种是快照卷长期留着,旧数据块因为还有引用没法回收,池子被慢慢吃掉。
还有一种情况,fstrim 没有定时跑,删掉的文件块在池子里仍然算作占用。
第一件事是看池子和各 thin 卷的占用
lvs -a -o lv_name,pool_lv,data_percent,metadata_percent,lv_size
接着按占用排序找出最费空间的卷
lvs -o lv_name,data_percent,lv_size --sort -data_percent | head
然后扩容池子先把写入救回来
lvextend -l +100%FREE /dev/vgdata/thinpool
剩下的就是打开自动扩容并补一次 trim
sed -i 's/^#*thin_pool_autoextend_threshold.*/thin_pool_autoextend_threshold = 80/' /etc/lvm/lvm.conf && fstrim -av
别只看报错消失,验证要多做一步。lvs 里 Data% 回到六成以下,写测试文件不再报错,dmesg 里不再出现 thin pool 相关的告警。
提醒一点。池子满了要先扩再删,顺序反了连删除动作都做不下去;快照是池子的隐形消耗方,查空间时一定要把快照一起列出来看。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
