參考
摘抄自 對永久性磁盤的性能進(jìn)行基準(zhǔn)化分析
正文
如需對永久性磁盤的性能進(jìn)行基準(zhǔn)化分析,請使用 FIO,而不是 dd
等其他磁盤基準(zhǔn)化分析工具。默認(rèn)情況下赚瘦,dd
使用非常低的 I/O 隊(duì)列深度浅浮,因此難以確鼻。基準(zhǔn)生成足夠數(shù)量的 I/O 和字節(jié)來準(zhǔn)確測試磁盤性能次哈。
此外,與 dd
配合使用的特殊設(shè)備的運(yùn)行速度通常非常慢颠悬,無法準(zhǔn)確反映永久性磁盤的性能。一般而言定血,請避免在永久性磁盤的性能基準(zhǔn)中使用 /dev/urandom
赔癌、/dev/random
和 /dev/zero
等特殊設(shè)備。
如需衡量正在運(yùn)行的實(shí)例上正在使用的磁盤的 IOPS 和吞吐量糠悼,請使用預(yù)期的配置對文件系統(tǒng)進(jìn)行基準(zhǔn)化分析届榄。使用此選項(xiàng)可測試實(shí)際工作負(fù)載,而不會丟失現(xiàn)有磁盤上的內(nèi)容倔喂。請注意铝条,在對現(xiàn)有磁盤上的文件系統(tǒng)進(jìn)行基準(zhǔn)化分析時,有很多特定于開發(fā)環(huán)境的因素可能會影響基準(zhǔn)化分析結(jié)果席噩,并且您可能不會達(dá)到磁盤性能限制班缰。
如需衡量永久性磁盤的原始性能,請直接對塊設(shè)備進(jìn)行基準(zhǔn)化分析悼枢。使用此選項(xiàng)可將原始磁盤性能與磁盤性能限制進(jìn)行比較埠忘。
以下命令適用于安裝了 apt
軟件包管理器的 Debian 或 Ubuntu 操作系統(tǒng)。
對正在運(yùn)行的實(shí)例上的磁盤的 IOPS 和吞吐量進(jìn)行基準(zhǔn)化分析
如果要衡量正在運(yùn)行的實(shí)例上活躍磁盤的實(shí)際工作負(fù)載的 IOPS 和吞吐量馒索,而不丟失磁盤的內(nèi)容莹妒,請對照現(xiàn)有文件系統(tǒng)上的新目錄進(jìn)行基準(zhǔn)化分析。
連接到您的實(shí)例绰上。
安裝依賴項(xiàng):
sudo apt update
sudo apt install -y fio
- 在終端中旨怠,列出掛接到虛擬機(jī)的磁盤,并找到要測試的磁盤蜈块。如果您的永久性磁盤尚未格式化鉴腻,請格式化并裝載該磁盤迷扇。
sudo lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 10G 0 disk
└─sda1 8:1 0 10G 0 part /
sdb 8:32 0 2.5T 0 disk /mnt/disks/mnt_dir
在此示例中,我們測試的是一個設(shè)備 ID 為 `sdb` 的 2500 GB SSD 永久性磁盤爽哎。
- 在磁盤上創(chuàng)建一個新目錄
fiotest
蜓席。在此示例中,該磁盤裝載在/mnt/disks/mnt_dir
:
TEST_DIR=/mnt/disks/mnt_dir/fiotest
sudo mkdir -p $TEST_DIR
- 使用 1 MB 的 I/O 塊大小和至少 64 的 I/O 深度课锌,通過執(zhí)行具有多個(8 個或更多)并行數(shù)據(jù)流的順序?qū)懭雭頊y試寫入吞吐量:
sudo fio --name=write_throughput --directory=$TEST_DIR --numjobs=8 \
--size=10G --time_based --runtime=60s --ramp_time=2s --ioengine=libaio \
--direct=1 --verify=0 --bs=1M --iodepth=64 --rw=write \
--group_reporting=1
- 使用 4 KB 的 I/O 塊大小和至少 64 的 I/O 深度厨内,通過執(zhí)行隨機(jī)寫入來測試寫入 IOPS:
sudo fio --name=write_iops --directory=$TEST_DIR --size=10G \
--time_based --runtime=60s --ramp_time=2s --ioengine=libaio --direct=1 \
--verify=0 --bs=4K --iodepth=64 --rw=randwrite --group_reporting=1
- 使用 1 MB 的 I/O 塊大小和至少 64 的 I/O 深度,通過執(zhí)行具有多個(8 個或更多)并行數(shù)據(jù)流的順序讀取來測試讀取吞吐量:
sudo fio --name=read_throughput --directory=$TEST_DIR --numjobs=8 \
--size=10G --time_based --runtime=60s --ramp_time=2s --ioengine=libaio \
--direct=1 --verify=0 --bs=1M --iodepth=64 --rw=read \
--group_reporting=1
- 使用 4 KB 的 I/O 塊大小和至少 64 的 I/O 深度产镐,通過執(zhí)行隨機(jī)讀取來測試讀取 IOPS:
sudo fio --name=read_iops --directory=$TEST_DIR --size=10G \
--time_based --runtime=60s --ramp_time=2s --ioengine=libaio --direct=1 \
--verify=0 --bs=4K --iodepth=64 --rw=randread --group_reporting=1
- 清理:
sudo rm $TEST_DIR/write* $TEST_DIR/read*
對原始永久性磁盤的性能進(jìn)行基準(zhǔn)化分析
如果要在開發(fā)環(huán)境之外單獨(dú)衡量永久性磁盤的性能隘庄,請?jiān)谝淮涡杂谰眯源疟P和虛擬機(jī)上測試塊設(shè)備的讀寫性能。
以下命令假定您的虛擬機(jī)掛接了一個 2500 GB 的 SSD 永久性磁盤癣亚。如果您設(shè)備的容量大小不同丑掺,請修改 --filesize
參數(shù)的值。此磁盤大小是實(shí)現(xiàn) 32 個 vCPU 虛擬機(jī)吞吐量限制所必需的述雾。如需了解詳情街州,請參閱塊存儲性能。
警告:本部分中的命令將覆蓋 /dev/sdb 的內(nèi)容玻孟。我們強(qiáng)烈建議使用一次性的虛擬機(jī)和磁盤唆缴。
安裝依賴項(xiàng):
sudo apt-get update
sudo apt-get install -y fio
- 使用非零數(shù)據(jù)填充磁盤黍翎。對于永久性磁盤而言面徽,從空白的磁盤塊讀取內(nèi)容的延遲配置文件與包含數(shù)據(jù)的磁盤塊不同。 我們建議您在運(yùn)行任何讀取延遲基準(zhǔn)化分析之前先填充磁盤匣掸。
# Running this command causes data loss on the second device.
# We strongly recommend using a throwaway VM and disk.
sudo fio --name=fill_disk \
--filename=/dev/sdb --filesize=2500G \
--ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
--bs=128K --iodepth=64 --rw=randwrite
- 使用具有多個(8 個或更多)并行數(shù)據(jù)流(I/O 大小為 1 MB趟紊,I/O 深度大于或等于 64)的順序?qū)懭雭頊y試寫入帶寬。
# Running this command causes data loss on the second device.
# We strongly recommend using a throwaway VM and disk.
sudo fio --name=write_bandwidth_test \
--filename=/dev/sdb --filesize=2500G \
--time_based --ramp_time=2s --runtime=1m \
--ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
--bs=1M --iodepth=64 --rw=write --numjobs=8 --offset_increment=100G
- 測試寫入 IOPS碰酝。如需達(dá)到永久性磁盤的 IOPS 上限霎匈,您必須維護(hù)一個較深的 I/O 隊(duì)列。例如送爸,如果寫入延遲時間為 1 毫秒铛嘱,則對于每個正在執(zhí)行的 I/O,虛擬機(jī)最多可以達(dá)到 1000 IOPS袭厂。 如需達(dá)到 15000 寫入 IOPS墨吓,虛擬機(jī)必須維護(hù)至少 15 個正在執(zhí)行的 I/O。如果您的磁盤和虛擬機(jī)能夠達(dá)到 30000 次寫入 IOPS纹磺,則正在執(zhí)行的 I/O 數(shù)量必須至少有 30 個肛真。如果 I/O 大小超過 4 KB,則虛擬機(jī)在達(dá)到 IOPS 上限之前可能會先達(dá)到帶寬上限爽航。
# Running this command causes data loss on the second device.
# We strongly recommend using a throwaway VM and disk.
sudo fio --name=write_iops_test \
--filename=/dev/sdb --filesize=2500G \
--time_based --ramp_time=2s --runtime=1m \
--ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
--bs=4K --iodepth=256 --rw=randwrite
- 測試寫入延遲時間蚓让。在測試 I/O 延遲時間時,請務(wù)必不要讓虛擬機(jī)達(dá)到帶寬或 IOPS 上限讥珍,否則觀察到的延遲時間將無法反映出實(shí)際的永久性磁盤 I/O 延遲時間历极。例如:如果在 I/O 深度為 30 時達(dá)到了 IOPS 上限,并且
fio
命令已將其加倍衷佃,則總 IOPS 將保持不變趟卸,并且所報(bào)告的 I/O 延遲時間將加倍。
# Running this command causes data loss on the second device.
# We strongly recommend using a throwaway VM and disk.
sudo fio --name=write_latency_test \
--filename=/dev/sdb --filesize=2500G \
--time_based --ramp_time=2s --runtime=1m \
--ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
--bs=4K --iodepth=4 --rw=randwrite
- 使用具有多個(8 個或更多)并行數(shù)據(jù)流(I/O 大小為 1 MB氏义,I/O 深度等于 64 或更大)的順序讀取來測試讀取帶寬锄列。
sudo fio --name=read_bandwidth_test \
--filename=/dev/sdb --filesize=2500G \
--time_based --ramp_time=2s --runtime=1m \
--ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
--bs=1M --iodepth=64 --rw=read --numjobs=8 --offset_increment=100G
- 測試讀取 IOPS。如需達(dá)到永久性磁盤的 IOPS 上限惯悠,您必須維護(hù)一個較深的 I/O 隊(duì)列邻邮。例如,如果 I/O 大小超過 4 KB克婶,則虛擬機(jī)在達(dá)到 IOPS 上限之前可能會先達(dá)到帶寬上限筒严。如需達(dá)到 10 萬次讀取 IOPS 上限,請為該測試指定
--iodepth=256
情萤。
sudo fio --name=read_iops_test \
--filename=/dev/sdb --filesize=2500G \
--time_based --ramp_time=2s --runtime=1m \
--ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
--bs=4K --iodepth=256 --rw=randread
- 測試讀取延遲時間鸭蛙。請務(wù)必用數(shù)據(jù)填充磁盤,以獲得真實(shí)的延遲時間測量結(jié)果筋岛。在此測試期間娶视,請確保不要讓虛擬機(jī)達(dá)到 IOPS 或吞吐量上限,因?yàn)橐坏┯谰眯源疟P達(dá)到其飽和上限睁宰,它將拒絕傳入的 I/O肪获,這將反映為 I/O 延遲時間的人為增加。
sudo fio --name=read_latency_test \
--filename=/dev/sdb --filesize=2500G \
--time_based --ramp_time=2s --runtime=1m \
--ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
--bs=4K --iodepth=4 --rw=randread
- 測試順序讀取帶寬勋陪。
sudo fio --name=read_bandwidth_test \
--filename=/dev/sdb --filesize=2500G \
--time_based --ramp_time=2s --runtime=1m \
--ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
--numjobs=4 --thread --offset_increment=500G \
--bs=1M --iodepth=64 --rw=read
- 測試順序?qū)懭霂挕?/li>
sudo fio --name=write_bandwidth_test \
--filename=/dev/sdb --filesize=2500G \
--time_based --ramp_time=2s --runtime=1m \
--ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
--numjobs=4 --thread --offset_increment=500G \
--bs=1M --iodepth=64 --rw=write