深色模式
存储容量与 IOPS
存储容量有两个维度:空间(GB)和性能(IOPS/吞吐)。空间满了会写失败,IOPS 打满会让延迟飙升——两者都要算。
适用环境
- Linux 主机,使用 SSD 或云盘
- 已安装
iostat(sysstat 包)与fio - 有历史数据增长记录
bash
sudo apt-get install -y sysstat fio # Debian/Ubuntu
sudo yum install -y sysstat fio # RHEL/CentOS1
2
2
操作步骤
1. 统计当前空间与增长速率
bash
# 各挂载点使用率
df -h -x tmpfs -x devtmpfs
# 找出占用大户
du -xh --max-depth=2 /data 2>/dev/null | sort -rh | head -151
2
3
4
5
2
3
4
5
promql
# 近 30 天使用率变化,算日均增长
(
node_filesystem_size_bytes{mountpoint="/data"} - node_filesystem_avail_bytes{mountpoint="/data"}
) - (
(node_filesystem_size_bytes{mountpoint="/data"} - node_filesystem_avail_bytes{mountpoint="/data"}) offset 30d
)1
2
3
4
5
6
2
3
4
5
6
2. 计算空间耗尽时间
text
日均增长 = (当前已用 - 30天前已用) / 30
剩余可用 = 总容量 - 当前已用
可撑天数 = 剩余可用 / 日均增长
示例:总 2 TB,已用 1.2 TB,日均增长 8 GB
可撑 = 800 / 8 = 100 天1
2
3
4
5
6
2
3
4
5
6
设定红线:剩余 20% 时必须扩容或清理。
3. 测裸盘 IOPS 与吞吐(fio)
bash
# 随机读 IOPS(4K,队列深度 32,直接 IO)
fio --name=randread --ioengine=libaio --direct=1 \
--rw=randread --bs=4k --numjobs=1 --iodepth=32 \
--size=1G --runtime=60 --time_based --group_reporting \
--filename=/data/fio.test1
2
3
4
5
2
3
4
5
bash
# 顺序写吞吐(1M 块)
fio --name=seqwrite --ioengine=libaio --direct=1 \
--rw=write --bs=1M --numjobs=1 --iodepth=16 \
--size=2G --runtime=60 --time_based --group_reporting \
--filename=/data/fio.test1
2
3
4
5
2
3
4
5
看输出里的 IOPS= 与 BW=(带宽)。
fio 会覆盖测试文件
--filename 指定的文件会被覆写。务必使用专用空文件或空盘,绝不能指向已有数据的分区文件。测试完执行 rm -f /data/fio.test。
4. 观察生产真实 IO 负载
bash
# %util 接近 100% 说明设备饱和;await 是 IO 延迟
iostat -x -d 1 5 /dev/vdb1
2
2
promql
# 磁盘使用率与读写吞吐
rate(node_disk_io_time_seconds_total{device="vdb"}[5m]) # 饱和度 0~1
rate(node_disk_read_bytes_total{device="vdb"}[5m]) / 1024 / 1024 # MB/s
rate(node_disk_writes_completed_total{device="vdb"}[5m]) # 写 IOPS1
2
3
4
2
3
4
5. 估算业务所需 IOPS
text
所需 IOPS = 峰值写 QPS × 单请求写次数 × 写放大系数
示例(数据库):
峰值写 QPS 2000
单请求平均 3 次写
写放大(索引+WAL+刷脏)≈ 5
所需 IOPS = 2000 × 3 × 5 = 300001
2
3
4
5
6
7
2
3
4
5
6
7
随机小 IO 场景下,机械盘约 150~200 IOPS,SATA SSD 约数万,NVMe 可达数十万——选型前先用 fio 实测确认。
6. 留出余量并选规格
text
目标 IO 水位 ≤ 70%
需提供 IOPS = 30000 / 0.7 ≈ 430001
2
2
验证
bash
# 1) 空间:模拟写入,确认监控告警能按时触发
# 2) 性能:对比 fio 实测 IOPS 与业务峰值 IOPS
iostat -x -d 1 3 /dev/vdb | tail -2
df -h /data1
2
3
4
2
3
4
常见坑
只算空间不算 IOPS
日志类场景常常空间充足但 IOPS 打满,表现为写入延迟抖动。数据库、消息队列必须两个维度都算。
被 inode 耗尽
小文件极多时 df 显示还有空间但写不进去,是 inode 用完。用 df -i 单独检查。
云盘性能与容量绑定
多数云盘的 IOPS 上限随容量增长(如 GP 类型按 GB 配额)。扩容空间本身也是提升 IOPS 的手段,选型时要一起看。
删除文件后空间不释放
文件被进程占用时 rm 不会释放空间。用 lsof +L1 或 lsof | grep deleted 找到占用进程并重启/清空句柄。