![(4096 对齐)高级格式磁盘的随机读/写性能极低](https://linux22.com/image/742033/%EF%BC%884096%20%E5%AF%B9%E9%BD%90%EF%BC%89%E9%AB%98%E7%BA%A7%E6%A0%BC%E5%BC%8F%E7%A3%81%E7%9B%98%E7%9A%84%E9%9A%8F%E6%9C%BA%E8%AF%BB%2F%E5%86%99%E6%80%A7%E8%83%BD%E6%9E%81%E4%BD%8E.png)
在 SATA 3.0、6.0 Gb/s 上
*-disk:0
description: ATA Disk
product: WDC WD20EFRX-68E
vendor: Western Digital
physical id: 0
bus info: scsi@1:0.0.0
hw_sector_size: 512
logical_block_size: 512
physical_block_size: 4096
# parted /dev/sda print
Model: ATA WDC WD20EFRX-68E (scsi)
Disk /dev/sda: 2000GB
Sector size (logical/physical): 512B/4096B
我有以下内容fio 结果在空的/dev/sda3 (ext4):
fio --name=seqread --rw=read --direct=1 --ioengine=libaio --bs=8k --numjobs=8 --size=1G --runtime=600 --group_reporting
seqread IOPS=8960, BW=70.0MiB/s (73.4MB/s)(8192MiB/117028msec)
fio --name=seqwrite --rw=write --direct=1 --ioengine=libaio --bs=32k --numjobs=4 --size=2G --runtime=600 --group_reporting
seqwrite IOPS=1538, BW=48.1MiB/s (50.4MB/s)(8192MiB/170345msec); 0 zone resets
fio --name=randread --rw=randread --direct=1 --ioengine=libaio --bs=8k --numjobs=16 --size=1G --runtime=600 --group_reporting
randread IOPS=163, BW=1305KiB/s (1337kB/s)(765MiB/600078msec)
fio --name=randwrite --rw=randwrite --direct=1 --ioengine=libaio --bs=64k --numjobs=8 --size=512m --runtime=600 --group_reporting
randwrite IOPS=165, BW=10.3MiB/s (10.8MB/s)(4096MiB/395912msec); 0 zone resets
fio --name=randrw --rw=randrw --direct=1 --ioengine=libaio --bs=16k --numjobs=8 --rwmixread=90 --size=1G --runtime=600 --group_reporting
randrw read IOPS=141, BW=2258KiB/s (2313kB/s)(1324MiB/600086msec)
randrw write IOPS=15, BW=253KiB/s (259kB/s)(148MiB/600086msec); 0 zone resets
一开始我以为我的扇区排列不正确,
Number Start End Size File system Name Flags
1 1048576B 511705087B 510656512B fat32 boot, esp
2 511705088B 54198796287B 53687091200B raid
3 54198796288B 215260069887B 161061273600B ext4 Linux filesystem
4 215260069888B 2000398917119B 1785138847232B Linux RAID raid
但所有起始扇区都能被 4096 整除,而 parted 告诉我
(parted) align-check opt 1
1 aligned
(parted) align-check opt 2
2 aligned
(parted) align-check opt 3
3 aligned
(parted) align-check opt 4
4 aligned
这些 fio 结果与在 Debian 10 和Arch Linux Live CD。这些都不是最快的旋转器,所以我可以接受连续的结果(尽管它们应该更高),但随机的 R、W 和 RW 结果是不可接受的。
内核是 5.0.x(live CD 中是 5.2.x),调度程序是默认的(并且受到推崇的)
# cat /sys/block/sda/queue/scheduler
[mq-deadline] none
将调度程序更改为巴菲特没有帮助。
据我所知部门协调很好,但要么是我遗漏了什么东西,要么是我有一些有缺陷的驱动器(全新的并且在保修期内)。<200 IOPS 和 <2.5MB/s 有时会导致系统无法使用。
我很茫然。我该如何修复这个问题?还是我的驱动器有问题(不太可能,因为这是两个完全相同的驱动器,结果也相似)?
答案1
您似乎正在使用 fio 作业在文件系统内执行 I/O。如果是这样,这会给您的结果增加另一个混淆因素。警告 - 直接对磁盘节点执行 I/O 可能会破坏已存在的文件系统和数据所以如果您选择直接前往,请务必小心/dev/sda
!
您将直接使用最多 8 个未完成的 I/O。这可能太低,无法看到磁盘的最佳性能(SATA 磁盘通常可以排队大约 32 个未完成的 I/O)。您还使用多个进程来提交 I/O,与异步提交 I/O 相比,这可能会产生一些开销。
摘要:无法判断磁盘是否有缺陷,因为您的 fio 作业看起来很奇怪。可能提交的 I/O 不足(fio 提到了您未在此处包含的磁盘统计信息 - 检查您的磁盘利用率)。此外,磁盘本身的缓存等因素可能意味着您最终会得到扭曲的结果,因为您工作的区域太小,并且多个作业在磁盘的同一区域上工作,因此也要注意(我想这在“连续”情况下更有可能发生)。