通過測試Block Storage效能,可以協助您更好地理解存放裝置的能力,並對其進行相應的最佳化和調整,以確保最佳效能。測試裸盤可以獲得較為真實的Block Storage效能,本文將介紹如何在Linux系統中使用開源測試載入器FIO測試裸盤的關鍵效能指標,包括IOPS(每秒輸入/輸出操作次數)、輸送量(資料轉送速率)和時延(回應時間)。
FIO(Flexible I/O Tester)是一個開源的、強大的I/O效能測試工具,可以用來對存放裝置進行隨機讀寫、順序讀寫等負載測試。
操作步驟
測試裸盤可以獲得較為真實的Block Storage效能。但如果Block Storage裝置中含有分區、檔案系統以及其他資料,直接使用FIO壓測會導致檔案系統異常以及資料丟失,請在測試前提前建立快照做好資料備份。具體操作,請參見手動建立單盤快照。
強烈建議您不要將作業系統所在的系統硬碟或含有資料的資料盤作為測試對象,以避免資料丟失。建議在新建立的空資料盤上使用工具測試Block Storage效能。
效能測試結果均在測試環境下獲得,僅供參考。在真實生產環境中,受網路環境、並發訪問量等因素影響,雲端硬碟的效能表現可能存在差異,請您以實際情況為準。
本操作以公用鏡像Alibaba Cloud Linux 3.2104 LTS 64位作業系統為例,請您根據實際環境進行操作。
遠端連線ECS執行個體。
具體操作,請參見使用Workbench工具以SSH協議登入Linux執行個體。
運行以下命令,查詢Block Storage的裝置名稱。
sudo fdisk -lu
如上圖所示,表示該執行個體有3塊Block Storage裝置,系統硬碟/dev/vda、資料盤/dev/vdb、/dev/vdc。
運行以下命令,查詢Block Storage裝置是否存在分區和檔案系統。
sudo blkid
如上圖所示,Block Storage裝置/dev/vda與/dev/vdb上存在分區及檔案系統,而結果中未存在/dev/vdc相關的回執資訊,表明/dev/vdc沒有分區及檔案系統。
在測試Block Storage效能前,請確保已經對測試對象進行資料備份,避免資料丟失。具體操作,請參見手動建立單盤快照。
說明使用快照會產生計費,更多資訊,請參見快照計費。
運行以下命令,安裝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中擷取的待測試Block Storage名稱。例如,如果需要測試的雲端硬碟裝置名稱為/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效能。
本地碟效能測試命令
以下測試命令適用於NVMe SSD本地碟和SATA HDD本地碟。
本地碟只能用作資料盤,樣本命令中的參數取值僅供參考,/dev/your_device
請您根據實際情況,替換為操作步驟2中擷取的待測試Block Storage名稱。例如,如果需要測試的本地碟裝置名稱為/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手冊。