本文中含有需要您注意的重要提示信息,忽略該信息可能對您的業務造成影響,請務必仔細閱讀。
通過測試塊存儲性能,可以幫助您更好地理解存儲設備的能力,并對其進行相應的優化和調整,以確保最佳性能。測試裸盤可以獲得較為真實的塊存儲性能,本文將介紹如何在Linux系統中使用開源測試工具FIO測試裸盤的關鍵性能指標,包括IOPS(每秒輸入/輸出操作次數)、吞吐量(數據傳輸速率)和時延(響應時間)。
FIO(Flexible I/O Tester)是一個開源的、強大的I/O性能測試工具,可以用來對存儲設備進行隨機讀寫、順序讀寫等負載測試。
操作步驟
測試裸盤可以獲得較為真實的塊存儲性能。但如果塊存儲設備中含有分區、文件系統以及其他數據,直接使用FIO壓測會導致文件系統異常以及數據丟失,請在測試前提前創建快照做好數據備份。具體操作,請參見創建快照。
強烈建議您不要將操作系統所在的系統盤或含有數據的數據盤作為測試對象,以避免數據丟失。建議在新創建的空數據盤上使用工具測試塊存儲性能。
性能測試結果均在測試環境下獲得,僅供參考。在真實生產環境中,受網絡環境、并發訪問量等因素影響,云盤的性能表現可能存在差異,請您以實際情況為準。
本操作以公共鏡像Alibaba Cloud Linux 3.2104 LTS 64位操作系統為例,請您根據實際環境進行操作。
遠程連接ECS實例。
具體操作,請參見使用Workbench工具以SSH協議登錄Linux實例。
運行以下命令,查詢塊存儲的設備名稱。
sudo fdisk -lu
如上圖所示,表示該實例有3塊塊存儲設備,系統盤/dev/vda、數據盤/dev/vdb、/dev/vdc。
運行以下命令,查詢塊存儲設備是否存在分區和文件系統。
sudo blkid
如上圖所示,塊存儲設備/dev/vda與/dev/vdb上存在分區及文件系統,而結果中未存在/dev/vdc相關的回執信息,表明/dev/vdc沒有分區及文件系統。
在測試塊存儲性能前,請確保已經對測試對象進行數據備份,避免數據丟失。具體操作,請參見創建快照。
說明使用快照會產生計費,更多信息,請參見快照計費。
運行以下命令,安裝libaio庫和測試工具FIO。 示例如下,請根據不同的系統選擇指令。
Alibaba Cloud Linux 2/3版本、CentOS 6及以上版本
重要由于CentOS 6和CentOS 8結束生命周期(EOL),所以如果您使用的是CentOS 6或者CentOS 8系統的ECS實例,請先切換源地址。具體操作,請參見CentOS 6 EOL如何切換源?和CentOS 8 EOL如何切換源?。
sudo yum install libaio libaio-devel fio -y
Debian 9及以上版本、Ubuntu14及以上版本
重要由于Debain9和Debain10結束生命周期(EOL),所以如果您使用的是Debain9和Debain10系統的ECS實例,請先切換源地址。具體操作,請參見Debian 9/10 EOL如何切換源?。
sudo apt-get update sudo apt-get install libaio* fio -y
運行以下命令,切換路徑。
cd /tmp
運行性能測試命令,具體的命令請參見下文。
查看測試結果,不同云盤數值不同,以下圖片中給出的數值僅作為示例
IOPS相關測試結果請參考
IOPS=***
內容,如下圖:吞吐量相關測試結果請參考
BW=***
內容,如下圖:時延相關測試結果請參考lat(usec)內容,如下圖:
云盤性能測試命令
示例命令中的參數取值僅供參考,/dev/your_device
請您根據實際情況,替換為操作步驟2中獲取的待測試塊存儲名稱。例如,如果需要測試的云盤設備名為/dev/vdb,則需將以下示例命令中的/dev/your_device
替換為/dev/vdb
。FIO參數的更多信息,請參見FIO參數說明。
測試云盤的隨機寫IOPS:
sudo fio -direct=1 -iodepth=128 -rw=randwrite -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=Rand_Write_Testing
測試云盤的隨機讀IOPS:
sudo fio -direct=1 -iodepth=128 -rw=randread -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=Rand_Read_Testing
測試云盤的順序寫吞吐量:
sudo fio -direct=1 -iodepth=64 -rw=write -ioengine=libaio -bs=1024k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=Write_PPS_Testing
測試云盤的順序讀吞吐量:
sudo fio -direct=1 -iodepth=64 -rw=read -ioengine=libaio -bs=1024k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=Read_PPS_Testing
測試云盤的隨機寫時延:
sudo fio -direct=1 -iodepth=1 -rw=randwrite -ioengine=libaio -bs=4k -size=1G -numjobs=1 -group_reporting -filename=/dev/your_device -name=Rand_Write_Latency_Testing
測試云盤的隨機讀時延:
sudo fio -direct=1 -iodepth=1 -rw=randread -ioengine=libaio -bs=4k -size=1G -numjobs=1 -group_reporting -filename=/dev/your_device -name=Rand_Read_Latency_Testing
關于各云盤詳細的測試步驟,請參見測試ESSD云盤IOPS性能和測試ESSD PL-X云盤性能。
本地盤性能測試命令
以下測試命令適用于NVMe SSD本地盤和SATA HDD本地盤。
本地盤只能用作數據盤,示例命令中的參數取值僅供參考,/dev/your_device
請您根據實際情況,替換為操作步驟2中獲取的待測試塊存儲名稱。例如,如果需要測試的本地盤設備名為/dev/vdb,則需將以下示例命令中的/dev/your_device
替換為/dev/vdb
。FIO參數的更多信息,請參見FIO參數說明。
測試本地盤的隨機寫IOPS:
sudo fio -direct=1 -iodepth=32 -rw=randwrite -ioengine=libaio -bs=4k -numjobs=4 -time_based=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=test
測試本地盤的隨機讀IOPS:
sudo fio -direct=1 -iodepth=32 -rw=randread -ioengine=libaio -bs=4k -numjobs=4 -time_based=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=test
測試本地盤的順序寫吞吐量:
sudo fio -direct=1 -iodepth=128 -rw=write -ioengine=libaio -bs=128k -numjobs=1 -time_based=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=test
測試本地盤的順序讀吞吐量:
sudo fio -direct=1 -iodepth=128 -rw=read -ioengine=libaio -bs=128k -numjobs=1 -time_based=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=test
測試本地盤的隨機寫時延:
sudo fio -direct=1 -iodepth=1 -rw=randwrite -ioengine=libaio -bs=4k -numjobs=1 -time_based=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=test
測試本地盤的隨機讀時延:
sudo fio -direct=1 -iodepth=1 -rw=randread -ioengine=libaio -bs=4k -numjobs=1 -time_based=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=test
測試本地盤的順序寫時延:
sudo fio -direct=1 -iodepth=1 -rw=write -ioengine=libaio -bs=4k -numjobs=1 -time_based=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=test
測試本地盤的順序讀時延:
sudo fio -direct=1 -iodepth=1 -rw=read -ioengine=libaio -bs=4k -numjobs=1 -time_based=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=test
FIO參數說明
測試命令中有關FIO各參數含義的說明如下表所示。
參數 | 說明 |
direct | 表示是否使用direct I/O。默認值:1。
|
iodepth | 表示測試時的IO隊列深度。例如 |
rw | 表示測試時的讀寫策略。您可以設置為:
|
ioengine | 表示測試時FIO選擇哪種I/O引擎,通常選擇libaio,更符合日常應用模式,更多的選擇請查閱FIO官方文檔。 |
bs | 表示I/O單元的塊大小(block size)。默認值:4 KiB。讀取和寫入的值可以以read、write格式單獨指定,其中任何一個都可以為空以將該值保留為其默認值。 |
size | 表示測試文件大小。 FIO會將指定的文件大小全部讀/寫完成,然后才停止測試,除非受到其他選項(例如運行時)的限制。如果未指定該參數,FIO將使用給定文件或設備的完整大小。也可以將大小作為1到100之間的百分比給出。例如指定size=20%,FIO將使用給定文件或設備完整大小的20%空間。 |
numjobs | 表示測試的并發線程數。默認值:1。 |
runtime | 表示測試時間,即FIO運行時長。 如果未指定該參數,則FIO會持續將上述size指定大小的文件,以每次bs值為塊大小讀/寫完成。 |
group_reporting | 表示測試結果顯示模式。 如果指定該參數,測試結果會匯總每個進程的統計信息,而不是以不同任務來統計信息。 |
filename | 表示待測試的對象路徑,路徑可以是云盤設備名稱或者一個文件地址。本文中的FIO測試全部是以整盤為測試對象,不含文件系統,即裸盤測試。同時為了避免誤測試到其他盤導致數據被破壞,本示例地址為/dev/your_device,請您正確替換。 |
name | 表示測試任務名稱,可以隨意設定。例如本示例的Rand_Write_Testing。 |
有關各參數的更多說明,請參見FIO MAN手冊。