fio:如何測試 bs 小於 1 文件系統塊大小?
我正在測試我的 SSD 並且有兩個問題。
- SNIA 已發布規範PTS (SNIA)來測試 SSD。在許多情況下,它需要對設備進行 bs=0.5Ki 測試!這背後的理性是什麼?如果我理解正確,這裡的目的是評估小於 1 塊大小的 IO 的性能。如果我的理解有誤,請糾正我。
- 如何使用 fio 測試這個場景?因為,我認為,fio 期望 bs 與文件系統塊大小對齊。例如,在我的情況下,它因以下錯誤而失敗。
[root@system pwd]# /bin/fio --name=iops-wdpc --direct=1 --ioengine=libaio --bs=512 --size=1024Gi --numjobs=1 --thread=1 --iodepth=1 --output=op --allow_mounted_write=1 --filename=/dev/nvme2n1 --rw=write
fio: io_u error on file /dev/nvme2n1: Invalid argument: write offset=6295552, buflen=512
(我的文件系統塊大小是 4Ki)
[root@system pwd]# tune2fs -l /dev/nvme2n1 | grep -i 'block size' Block size: 4096
(fio 不適用於 bs=512、1024、2048,適用於 bs=4096)
[root@system ~]# /bin/fio --name=iops-wdpc --direct=1 --ioengine=libaio --bs=512 --size=1024Gi --numjobs=1 --thread=1 --iodepth=1 --output=op --allow_mounted_write=1 --filename=/dev/nvme2n1 --rw=write fio: io_u error on file /dev/nvme2n1: Invalid argument: write offset=6295552, buflen=512 [root@system ~]# [root@system ~]# /bin/fio --name=iops-wdpc --direct=1 --ioengine=libaio --bs=1024 --size=1024Gi --numjobs=1 --thread=1 --iodepth=1 --output=op --allow_mounted_write=1 --filename=/dev/nvme2n1 --rw=write fio: io_u error on file /dev/nvme2n1: Invalid argument: write offset=6295552, buflen=1024 [root@system ~]# [root@system ~]# /bin/fio --name=iops-wdpc --direct=1 --ioengine=libaio --bs=2048 --size=1024Gi --numjobs=1 --thread=1 --iodepth=1 --output=op --allow_mounted_write=1 --filename=/dev/nvme2n1 --rw=write fio: io_u error on file /dev/nvme2n1: Invalid argument: write offset=6295552, buflen=2048 [root@system ~]# [root@system ~]# /bin/fio --name=iops-wdpc --direct=1 --ioengine=libaio --bs=4096 --size=1024Gi --numjobs=1 --thread=1 --iodepth=1 --output=op --allow_mounted_write=1 --filename=/dev/nvme2n1 --rw=write ^C[root@system ~]# ^C3%][r=0KiB/s,w=147MiB/s][r=0,w=37.7k IOPS][eta 01h:57m:58s]
(fio版本)
[root@smartiops ~]# /bin/fio --version fio-3.1
(當我寫這篇文章時,我開始擔心你的設置。請參閱最後的粗體文本)
Using
direct=1
將打開O_DIRECT
Linux 上的標誌,當堆棧的較低級別未被忽略時,該標誌帶有對齊和大小約束(有關更多詳細資訊,請參見手冊O_DIRECT
頁open(2)
中的資訊)。如果您正在O_DIRECT
對塊設備執行 I/O,則必須使用是磁碟邏輯塊大小的倍數的塊大小。對於 NVMe,通常為 4096 字節,但其他值也可能取決於設備配置。在許多情況下,它需要對設備進行 bs=0.5Ki 測試!什麼是理性
$$ e $$這背後?
首次引入 SSD 時,它們經常模擬(參見512e)當時硬碟的邏輯塊大小,以避免破壞假定 512 字節邏輯塊大小/扇區的舊軟體,但這可能導致當 I/O 對齊不佳時性能欠佳(請參閱有關在 Solaris 中支持 4K 扇區的這些幻燈片)。隨著時間的推移,許多設備預設不模擬如此小的塊大小。您可能想與 SNIA/該指南的作者討論現代最小塊大小(隨著時間的推移,512 字節的性能變得不那麼有趣了)。
我在這裡做錯了什麼?
您沒有做錯任何事情 - 只是您不能違反使用
O_DIRECT
給定塊設備的規則(I/O 必須很好地對齊,並且必須是磁碟邏輯塊大小的倍數)。fio:如何測試 bs 小於 1 文件系統塊大小?
奇怪的是你一直提到“文件系統”,因為你的 fio 工作描述說你要去一個塊設備(
filename=/dev/nvme2n1
)並且不會涉及任何 Linux 文件系統(這對於特定類型的測試來說是非常合理的事情) . 您的tune2fs
命令可能會返回令人困惑的結果(因為它正在返回文件系統資訊!),我認為您的意思是只對頂部有 ext* 文件系統的東西使用/sbin/blockdev --getss <device>
原樣……tune2fs
…我現在擔心你的設置。如果您正在對系統上的塊設備執行 I/O,而該系統上的數據無法永久且不可恢復地被破壞,請停下來並花一些時間了解為什麼您不應該使用 fio 塊設備訪問塊設備它們上的“活動”文件系統。很抱歉發出警告,但您所說的某些內容暗示著嚴重的混亂,如果有數據處於危險之中……哦,天哪,我剛剛看到你在做
--allow_mounted_write=1
。我只能說你正在做的事情看起來很危險,可能會導致奇怪的結果和/或系統崩潰。當你越過安全屏障時,我敦促你在繼續之前做一些背景閱讀以更好地理解。如果我們假設您的命令的意圖是正確的,並且您的意思是“我怎樣才能直接對塊大小小於設備邏輯塊大小的**設備進行基準測試”,那麼答案是:**你不能。設備的邏輯塊大小是設備向作業系統公開的最小可定址單元,您的顯示為 4096 字節。您可能能夠重新配置設備以通告 512 字節塊,但您必須與設備供應商核實您如何做到這一點(這可能意味著性能成本)。