一、为什么是 2014 年这一份
2014 年这个时间点很有意思:
- LVM 早已是 Linux 标配(2.6 内核时代),企业级应用普及
- SSD 正在替换 HDD,但 NVMe 还在路上(NVMe 1.0 是 2011 年,主流消费级 NVMe SSD 在 2014-2015 才铺开)
- fio 2.x 是性能压测的事实标准(fio 3.x 在 2017 才发布)
- 软件 RAID 工具 mdadm 仍是单节点多盘管理的首选(硬件 RAID 控制器在企业级也仍有市场)
这一篇覆盖磁盘选型、IOPS 估算、fio 压测、LVM 全套操作、LVM Cache、mdadm RAID、Ubuntu 重装 VG 重名——一份"在生产环境用过"的工具书。
阅读建议:建议先通读目录定位场景,再回头看对应小节。LVM 部分是重点,几乎所有云厂商的 Linux 镜像底层都是 LVM。
二、磁盘速度与 IOPS 参考
2.1 接口速率参考
| 类型 | 速率峰值 | 备注 |
|---|
| SATA 接口 SSD | 560 MB/s | 主流消费级 SATA SSD |
| M.2 SATA 总线 SSD | 560 MB/s | 形态不同但走 SATA 总线 |
| M.2 NVMe 协议 SSD | 3 GB/s 左右 | 2014 起步,2015-2016 主流化 |
| 5400 RPM 机械硬盘 | 100 MB/s | 笔记本常见 |
| 7200 RPM 机械硬盘 | 90-190 MB/s | 台式机/服务器常见 |
关于 NVMe 时间线:NVMe 1.0 标准 2011 年发布,2014-2015 年消费级 M.2 NVMe SSD 才逐步铺开。2014 年能见到 NVMe 已经很快了,但 3 GB/s 的速率对应的是 PCIe 3.0 x4 通道的 SSD。
查看磁盘转速:
1
| hdparm -I /dev/sdb | grep Rotation
|
2.2 IOPS 估算
IOPS(Input/Output Operations Per Second)的简化公式:
1
| IOPS = 1000 / (寻道时间 + 旋转延迟)
|
公式中忽略数据传输时间。机械硬盘的寻道时间通常 3-10 ms,旋转延迟 4-8 ms(按 7200 RPM 算半圈 4.17 ms),所以机械硬盘 IOPS 通常在 75-200 之间。SSD 因为没有寻道和旋转,IOPS 动辄上万。
常见设备的 IOPS 参考表(2014 数据):
| 设备 | 类型 | IOPS | 接口 | 备注 |
|---|
| 7,200 RPM SATA HDD | 机械 | ~75-100 | SATA 3 Gbit/s | 入门级服务器 |
| 10,000 RPM SATA HDD | 机械 | ~125-150 | SATA 3 Gbit/s | 中端服务器 |
| 10,000 RPM SAS HDD | 机械 | ~140 | SAS | 企业级 |
| 15,000 RPM SAS HDD | 机械 | ~175-210 | SAS | 高端企业级(如金融交易) |
| Intel X25-M G2 (MLC) | SSD | ~8,600 | SATA 3 Gbit/s | 2010 年代初消费级 SSD |
| Intel X25-E (SLC) | SSD | ~5,000 | SATA 3 Gbit/s | 企业级 SLC SSD |
| OCZ Vertex 3 | SSD | ~60,000 | SATA 6 Gbit/s | 2011 年代旗舰消费级 |
| Corsair Force GT | SSD | ~85,000 | SATA 6 Gbit/s | 240GB 型号,4K 随机写 |
关于 IOPS 时间点:表中数据是 2010-2012 时代的硬件水平。2014 年消费级 SSD 的 4K 随机写已经普遍 30K-80K IOPS,到 2018 年 NVMe SSD 已经百万级。
三、fio 性能压测:生产环境最常用的工具
fio(Flexible I/O Tester)是 Linux 性能压测的事实标准,2010 由 Jens Axboe 发布,2014 已是 2.x 时代。
3.1 参数速查
| 参数 | 含义 |
|---|
filename=/dev/sdb1 | 测试目标盘/文件路径 |
direct=1 | 绕过 OS buffer(DirectIO),测试结果更真实 |
rw=randwrite | 随机写;randread 随机读;randrw 随机混合;read/write/rw 顺序 |
bs=4k | 单次 I/O 块大小 |
bsrange=512-2048 | 数据块大小范围(多对一,模拟混合场景) |
size=5G | 每个线程读写的数据量 |
numjobs=1 | 每个任务开的线程数 |
name=job1 | 任务名,重复无所谓;-name=job1 -name=job2 共享前面参数 |
thread | 用 pthread_create 创建线程(vs fork) |
runtime=1000 | 测试时长(秒),不写则跑完 5G 才停 |
ioengine=libaio | 异步 I/O 引擎(Linux 本地异步 I/O) |
iodepth=16 | 队列深度 16 |
rwmixwrite=30 | 混合读写时写占 30% |
group_reporting | 汇总每个进程的信息 |
3.2 常用测试点(6 类场景)
| 场景 | 组合 |
|---|
| 100% 随机读 | rw=randread |
| 100% 顺序读 | rw=read |
| 100% 顺序写 | rw=write |
| 100% 随机写 | rw=randwrite |
| 70% 顺序读 + 30% 顺序写 | rw=rw, rwmixread=70, rwmixwrite=30 |
| 70% 随机读 + 30% 随机写 | rw=randrw, rwmixread=70, rwmixwrite=30 |
3.3 完整命令模板
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| # 安装
apt install -y fio # Debian/Ubuntu
yum install -y fio # CentOS/RHEL
# 60 秒快速读测试
cd /tmp
fio -ioengine=libaio -bs=4k -direct=1 -thread -rw=read \
-filename=/dev/sda \
-name="BS 4KB read test" \
-iodepth=16 -runtime=60
# 本地盘随机写 IOPS
fio -direct=1 -iodepth=32 -rw=randwrite -ioengine=libaio -bs=4k \
-numjobs=4 -time_based=1 -runtime=1000 -group_reporting \
-filename=/dev/sda -name=test
# 本地盘随机读 IOPS
fio -direct=1 -iodepth=32 -rw=randread -ioengine=libaio -bs=4k \
-numjobs=4 -time_based=1 -runtime=1000 -group_reporting \
-filename=/dev/sda -name=test
# 本地盘顺序写吞吐量
fio -direct=1 -iodepth=128 -rw=write -ioengine=libaio -bs=128k \
-numjobs=1 -time_based=1 -runtime=1000 -group_reporting \
-filename=/dev/sda -name=test
# 本地盘顺序读吞吐量
fio -direct=1 -iodepth=128 -rw=read -ioengine=libaio -bs=128k \
-numjobs=1 -time_based=1 -runtime=1000 -group_reporting \
-filename=/dev/sda -name=test
# 随机混合读写(写 30%)
fio -name=iops -rw=randrw -rwmixwrite=30 -bs=4k -runtime=10 \
-iodepth=1 -filename=/dev/sda -ioengine=libaio -direct=1
|
3.4 结果解读
1
| read: IOPS=1091, BW=4366KiB/s (4471kB/s)(260MiB/60882msec)
|
关键指标:
| 字段 | 含义 |
|---|
io | 总共执行了多少 M 的 I/O |
bw | 平均 I/O 带宽 |
iops | IOPS |
runt | 线程运行时间 |
slat | 提交延迟(submission latency) |
clat | 完成延迟(completion latency) |
lat | 响应时间 = slat + clat |
cpu | 利用率 |
IO depths | 队列深度分布 |
IO submit / complete / issued | 提交/完成/发出的 I/O 数量 |
ios / merge / ticks / util | iostat 风格的汇总(最终 Disk stats 段) |
关于队列深度:磁盘属于"慢速设备",OS 会为每块盘分配一个队列用于缓冲 I/O 请求。加大队列深度 = 让硬盘持续工作、减少空闲时间。但队列深度太高会导致 clat 飙升(响应时间不可接受)。iodepth=16 是消费级 SSD 的常见甜点值。
四、LVM 完整实战
LVM(Logical Volume Manager)从 2.6 内核起就是 Linux 标配。它的核心思想是把"物理卷 → 卷组 → 逻辑卷"三层结构解耦,让扩容/缩容/跨盘迁移变成相对无痛的操作。
4.1 三个核心原则
原则一:逻辑卷不能分太多,卷组要留有余量——VG 相当于是个存储池,留 20-30% 空闲便于后续扩容。
原则二:扩容顺序是 PV → VG → LV → FS;缩容顺序相反,而且必须先卸载。
原则三:生产环境做 LVM 操作前必有备份。resize2fs 缩容时一旦写错大小,数据就没了。
4.2 创建场景:1 块 SSD + 1 块 HDD
假设要添加两块硬盘:
nvme0n2 —— 1 块 SSD(20G),准备做 nfssda —— 1 块机械盘(1T),准备做 data
完整步骤:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
| # 1. 查名称
fdisk -l
# 2. 分区
fdisk /dev/nvme0n2
# 命令序列:n, p, 回车, 回车, 回车, w, 回车
partprobe /dev/nvme0n2
mkfs.ext4 /dev/nvme0n2p1
# 3. 创建 PV(其实前面分区 + 格式化对 PV 来说可以省略)
pvcreate /dev/nvme0n2p1
# 4. 创建 VG
vgcreate vgssd /dev/nvme0n2p1
# 5. 创建 LV——满不了 20G
# 5119 PE × 4M PE = 20G;这里先用 10G,留扩容空间
lvcreate -L +10G -n lvssd vgssd
# 6. 格式化 LV
mkfs.ext4 /dev/vgssd/lvssd
# 7. 创建挂载目录
mkdir /nfs
# 8. 挂载 LV
mount /dev/vgssd/lvssd /nfs
# 9. 查看
df -h
# /dev/mapper/vgssd-lvssd 20G 24K 19G 1% /nfs
lsblk
# nvme0n2 259:3 0 20G 0 disk
# └─nvme0n2p1 259:5 0 20G 0 part
# └─vgssd-lvssd 253:0 0 20G 0 lvm /nfs
# 10. 永久挂载
echo '/dev/vgssd/lvssd /nfs ext4 defaults 0 0' | tee -a /etc/fstab
mount -a
# 11. 测一下速度
hdparm -tT --direct /dev/mapper/vgssd-lvssd
# Timing O_DIRECT cached reads: 5662 MB in 2.00 seconds = 2831.16 MB/sec
# Timing O_DIRECT disk reads: 20476 MB in 1.93 seconds = 10621.64 MB/sec
|
4.3 扩容:原盘扩容 + 新增盘加入 VG
4.3.1 原盘扩容(虚拟机里把磁盘从 20G 扩到 40G)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| lsblk
# nvme0n2 259:3 0 40G 0 disk
# └─nvme0n2p1 259:4 0 20G 0 part
# └─vgssd-lvssd 253:0 0 20G 0 lvm /nfs
# 显示 40G,但 LV 只用了 20G
pvs -a -o +devices
# PV VG Fmt Attr PSize PFree Devices
# /dev/nvme0n1 --- 0 0
# /dev/nvme0n1p2 --- 0 0
# /dev/nvme0n2 --- 0 0
# /dev/nvme0n2p1 vgssd lvm2 a-- <40.00g <30.00g /dev/nvme0n2p1(0)
# 关键:先删分区再重建(fdisk 操作)
fdisk /dev/nvme0n2
# 命令序列:d(删), n(建), p(主分区), ... w(保存)
# PV 重置以识别新大小
pvresize /dev/nvme0n2p1
|
4.3.2 新增盘加入 VG
1
2
3
4
5
6
7
8
| lsblk
# nvme0n2 259:3 0 40G 0 disk
# └─nvme0n2p1 259:4 0 40G 0 part
# └─vgssd-lvssd 253:0 0 40G 0 lvm /nfs
# nvme0n3 259:5 0 20G 0 disk ← 新增
pvcreate /dev/nvme0n3
vgextend vgssd /dev/nvme0n3
|
4.3.3 LV 扩容
1
2
3
4
5
6
7
8
9
10
11
| # 扩容 LV(增加 5G)
lvextend -L +5G /dev/vgssd/lvssd
# 刷新 LV(ext4 用 resize2fs,xfs 用 xfs_growfs)
resize2fs /dev/vgssd/lvssd
# 一条命令搞定(-r 自动调用 resize2fs)
lvextend -L +5G -r /dev/vgssd/lvssd
# 所有空闲全分配(不推荐,没扩容空间了)
lvextend -l +100%FREE -r /dev/vgssd/lvssd
|
4.4 缩容:从 15G 缩到 10G
警告:缩容有数据丢失风险,必须先备份!缩容顺序与扩容相反,且必须先卸载。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| # 1. 先卸载
umount /dev/vgssd/lvssd
# 2. 检查文件
e2fsck -f /dev/vgssd/lvssd
# e2fsck 1.46.5 (30-Dec-2021)
# Pass 1: Checking inodes, blocks, and sizes
# Pass 2: Checking directory structure
# Pass 3: Checking directory connectivity
# Pass 4: Checking reference counts
# Pass 5: Checking group summary information
# /dev/vgssd/lvssd: 308/983040 files (0.0% non-contiguous), 90144/3932160 blocks
# 3. 更新文件系统大小
resize2fs /dev/vgssd/lvssd 10G
# resize2fs 1.46.5 (30-Dec-2021)
# Resizing the filesystem on /dev/vgssd/lvssd to 2621440 (4k) blocks.
# 4. 重置 LV 大小
lvresize -L 10G /dev/vgssd/lvssd
# WARNING: Reducing active logical volume to 10.00 GiB.
# THIS MAY DESTROY YOUR DATA (filesystem etc.)
# Do you really want to reduce vgssd/lvssd? [y/n]: y
# 5. 重新挂载
mount /dev/vgssd/lvssd /nfs
# 6. 验证
df -h
# /dev/mapper/vgssd-lvssd 9.8G 7.1M 9.3G 1% /nfs
|
4.5 移除 PV:把数据从一个盘迁到另一个盘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| # 先查看 PV
pvdisplay
# --- Physical volume ---
# PV Name /dev/nvme0n2p1
# VG Name vgssd
# PV Size <40.00 GiB / not usable 2.00 MiB
# PE Size 4.00 MiB
# Total PE 10239
# Free PE 7679
# Allocated PE 2560
# /dev/nvme0n2p1 分配了 2560 个 PE,要把 PE 转移到 /dev/nvme0n3
pvmove /dev/nvme0n2p1 /dev/nvme0n3
# /dev/nvme0n2p1: Moved: 2.38%
# /dev/nvme0n2p1: Moved: 100.00%
# 从 VG 移除 PV
vgreduce vgssd /dev/nvme0n2p1
# Removed "/dev/nvme0n2p1" from volume group "vgssd"
# 删除 PV
pvremove /dev/nvme0n2p1
# Labels on physical volume "/dev/nvme0n2p1" successfully wiped.
|
4.6 删除整套 LVM
1
2
3
4
5
6
| # 顺序:LV → VG → PV
umount /dev/vgssd/lvssd
lvremove /dev/vgssd/lvssd
vgremove /dev/vgssd
pvremove /dev/nvme0n2p1
pvremove /dev/nvme0n3
|
五、LVM Cache:用 SSD 给 HDD 加速
LVM Cache 是 LVM 内置的缓存功能,允许将高速缓存设备(如 SSD)与普通硬盘组合使用,以提高 I/O 性能。常见替代方案有 DM-cache、bcache、flashCache、EnhanceIO。
5.1 三个组件
- data —— 存储数据
- cache —— 缓存数据
- meta —— 缓存元数据(size 需大于
cache 的 1/1000)
5.2 完整创建流程
假设有一块机械盘 sda + 一块 SSD nvme0n1:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| # 1. 把两块盘加入同一个 VG
pvcreate /dev/sda /dev/nvme0n1p1
vgcreate vg /dev/sda /dev/nvme0n1p1
# 2. 机械盘上创建 data LV
lvcreate -n data -L 200G vg /dev/sda
# 3. SSD 上创建 cache + meta LV
lvcreate -n cache -L 30G vg /dev/nvme0n1p1
lvcreate -n meta -L 6G vg /dev/nvme0n1p1
# 4. 创建缓存池,把 data 卷加入
# cachemode 默认 writethrough;writeback 性能好但极端情况会丢数据
lvconvert --type cache-pool --poolmetadata vg/meta vg/cache
lvconvert --type cache --cachepool vg/cache --cachemode writeback vg/data
# 5. 格式化 + 挂载
mkfs.ext4 /dev/vg/data
mkdir /data
mount /dev/vg/data /data
echo '/dev/vg/data /data ext4 defaults 0 0' | tee -a /etc/fstab
mount -a
|
cachemode 选择:writeback(默认推荐的"性能模式")写入缓存就 ack,掉电可能丢数据;writethrough(默认)数据同时写缓存和后端,安全性高但性能略低。生产环境视业务重要程度选。
六、mdadm 软件 RAID
mdadm 是 Linux 软件 RAID 的管理工具,2014 已是 3.x 时代。
6.1 五种常用 RAID 等级
| 等级 | 至少几块盘 | 特性 | 适用场景 |
|---|
| RAID 0 | 2 | 条带,无冗余,速度翻倍 | 临时数据、缓存 |
| RAID 1 | 2 | 镜像,可容忍 1 块盘坏 | 系统盘、关键数据 |
| RAID 5 | 3 | 一个校验盘,可容忍 1 块盘坏 | 容量与冗余平衡 |
| RAID 6 | 4 | 两个校验盘,可容忍 2 块盘坏 | 大容量存储 |
| RAID 10 | 4 | RAID 1 + RAID 0,先镜像再条带 | 数据库首选 |
企业数据库场景:几乎都选 RAID 10——4 块起步、性能翻倍、容错等于 RAID 1。
6.2 创建 RAID 10 完整流程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| # 1. 4 块盘分区(每块都要分一个主分区 + 标为 Linux RAID 类型)
fdisk /dev/sdb # n, p, 1, 回车×2, t, fd, p, w
fdisk /dev/sdc # 同上
fdisk /dev/sdd # 同上
fdisk /dev/sde # 同上
# 2. 检查是否有遗留 RAID 信息
mdadm -E /dev/sd[b-e]
mdadm -E /dev/sd[b-e]1
# 3. 创建 RAID 10
mdadm --create /dev/md0 --level=10 --raid-devices=4 \
/dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
# 4. 查看同步进度
cat /proc/mdstat
# 5. 查看详细信息
mdadm --detail /dev/md0
# 6. 创建文件系统 + 挂载
mkfs.ext4 /dev/md0
mkdir /md
mount /dev/md0 /md
echo '/dev/md0 /md ext4 defaults 0 0' | tee -a /etc/fstab
mount -av
# 7. 保存 RAID 配置(默认没有)
mdadm --detail --scan --verbose >> /etc/mdadm.conf
# 或者
mdadm -Dsv > /etc/mdadm.conf
|
6.3 添加备用盘(spare)
1
2
3
| mdadm --create /dev/md0 --level=10 --raid-devices=4 \
/dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 \
--spare-devices=1 /dev/sdf1
|
6.4 扩容(加一块盘)
1
2
3
4
5
6
7
8
9
10
11
| # 分区
fdisk /dev/sdf
# n, 1, t, fd, p, w
# 检查(没有 super-blocks 才能直接 add)
mdadm -E /dev/sdf1
# 添加 + 扩展
mdadm --manage /dev/md0 --add /dev/sdf1
mdadm --grow --raid-devices=5 /dev/md0
mdadm --detail /dev/md0
|
注意:大容量磁盘扩展同步可能耗时数小时。
6.5 替换坏盘
1
2
3
| # 标记失效 + 移除
mdadm --fail /dev/md0 /dev/sdc1
mdadm --remove /dev/md0 /dev/sdc1
|
6.6 删除 RAID
1
2
3
4
5
| umount /raid0
mdadm -Ss # 停止 RAID 设备
rm -rf /etc/mdadm.conf # 删除配置
mdadm --zero-superblock /dev/sdb # 擦除 RAID 标识
mdadm --zero-superblock /dev/sdc
|
七、Ubuntu 重装系统后的 LVM VG 重名问题
场景:旧系统盘和新系统盘都用了默认 VG 名 ubuntu-vg,重装后 vgscan 会报重名错误。
7.1 查 VG 冲突
1
2
3
4
5
6
7
| vgscan
# WARNING: VG name ubuntu-vg is used by VGs RGmXzb-... and oFmdxd-...
# Fix duplicate VG names with vgrename uuid, a device filter, or system IDs.
# Found volume group "ubuntu-vg" using metadata type lvm2
vgdisplay
# 两个 ubuntu-vg 都有,但 UUID 不同
|
7.2 通过容量/UUID 区分
1
2
3
4
5
6
7
| lsblk
# sda 8:0 0 1000G 0 disk
# ├─sda1 8:1 0 1G 0 part /boot/efi
# ├─sda2 8:2 0 2G 0 part /boot
# └─sda3 8:3 0 996.9G 0 part
# └─ubuntu--vg-ubuntu--lv 253:0 0 100G 0 lvm / ← 新系统
# sdb 8:16 0 1000G 0 disk ← 旧系统盘
|
通过容量或挂载点判断哪个是旧盘。
7.3 重命名 VG
1
2
| vgrename <旧盘的UUID> vg_1
# Volume group "RGmXzb-..." successfully renamed to "vg_1"
|
7.4 重命名 LV
1
| lvrename /dev/vg_1/ubuntu-lv lv_1
|
7.5 扩展新系统盘
1
2
3
| # 挂载在根目录的话,扩了之后就缩不了了
lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
resize2fs /dev/ubuntu-vg/ubuntu-lv
|
7.6 挂载旧 LV
1
2
| mkdir -p /data
mount /dev/vg_1/lv_1 /data
|
八、磁盘性能监控基础
生产环境出问题时的"5 把刀"(dstat / iotop / pidstat / vmstat / top 的组合):
| 工具 | 用途 |
|---|
top | 监控整体服务器:CPU、内存、磁盘、网络综合 |
dstat -d | 查看当前磁盘每秒的读/写量(单位 K) |
dstat -r | 查看当前磁盘随机的读/写 IOPS |
dstat -n | 查看网卡每秒接收/发送量(单位 K) |
pidstat | 统计各进程的磁盘 I/O(也可监控 CPU 和内存) |
iotop | 类似 top,但只看 I/O 相关的进程 |
vmstat | 监控 I/O 活跃的进程、内存、CPU |
1
2
3
4
5
6
7
8
| # 看磁盘读写流量
dstat -d
# 看随机 IOPS
dstat -r
# 看每个进程的磁盘 I/O
pidstat -d 1
|
九、前置知识 / 下一步
- 想了解软件 RAID 控制器 vs 硬件 RAID 控制器 vs ZFS 的对比 → 翻独立文章
- 想了解文件系统选型(ext4 / xfs / btrfs / zfs)→ 翻独立文章
- 想了解生产环境 LVM 监控(
pvs / lvs / dmsetup) → 翻本系列《Linux 监控与系统性能工具》
十、参考资源
2024 视角:十年间磁盘技术的最大变化
2014 这套"fio + LVM + mdadm"组合在 2024 仍然管用——这是 Linux 存储栈的"长青"层。但 10 年间硬件/生态发生了三件大事:
一、NVMe 从"新事物"变成"主流"
2014 年 NVMe SSD 还是"高端服务器配置"(单价 ¥5000+)。
2024 年消费级 M.2 NVMe 1TB SSD 已 ¥400-500,PCIe 4.0 速率 7 GB/s,PCIe 5.0 速率 12+ GB/s 成为新机主流。
fio 测试目标从 /dev/sda(机械)几乎全切到 /dev/nvme0n1:
1
2
3
4
| # 顺序读
fio --name=seq-read --ioengine=libaio --direct=1 \
--filename=/dev/nvme0n1 --bs=128k --size=10G \
--rw=read --iodepth=128 --runtime=30 --time_based
|
ZNS(Zoned Namespaces) SSD(2023+ 量产)是下一代 NVMe 革命——按"区域"写入,类似 SMR HDD 但更激进。
二、文件系统的"现代选择"
- 2014 时代服务器主流是 ext4。2024 的选择更细分:
| 场景 | 2014 选 | 2024 选 |
|---|
| 通用服务器 | ext4 | xfs(默认) |
| 大文件 / 视频 | xfs | xfs / btrfs |
| 快照 / 容器存储 | 无 | btrfs(Fedora 33+ 默认) |
| 高完整性 | ext4 + dm-crypt | ext4 + LUKS2 / ZFS |
| NAS / 备份 | ext4 | ZFS / btrfs |
- xfs 是 RHEL 9 / Rocky 9 / AlmaLinux 9 的默认文件系统——本文
mkfs.xfs 仍是正确选择。 - btrfs 在 Fedora / openSUSE 已经默认(ext4 在 RHEL 8 仍是默认,但 9 已经过渡到 xfs)。
三、RAID 硬件层变化
- 2014 时代企业级首选硬件 RAID 控制器(PERC H730 / LSI 9300 系列)。
- 2024 年云厂商几乎都走软件 RAID(mdadm 或 mdadm + dm-crypt)——硬件 RAID 控制器在云上不可见。
- 现代替代:
- ZFS mirror(mirror 模式 RAID1,snapshot 能力强)
- Ceph(分布式存储,块 / 对象 / 文件一站式)
- 云盘(直接用 EBS / 阿里云 ESSD,不用自己搭)
四、LVM 的"补强"特性
LVM 2.03+ 在 2024 加了几个值得用上的新功能:
lvconvert --type thin:thin-provisioned LV,超分用、用多少占多少。
lvm 与 vdo(Virtual Data Optimizer)集成:去重 + 压缩,RHEL 8/9 默认带。
LVM RAID(替代 mdadm):
1
| lvcreate --type raid1 -L 100G -n data vg /dev/sda1 /dev/sdb1
|
自动激活 + 锁:lvmlockd 支持 SAN 共享存储下的 LVM 集群锁。
五、fio 3.x 的现代参数