1. 程式人生 > >AWS EBS Magnetic(standard)磁碟效能測試

AWS EBS Magnetic(standard)磁碟效能測試

背景

最近公司的一臺例項型別為m5.2xlarge(8個vCPU,32G的Memory)的機器磁碟效能不行,於是需要做個磁碟效能測試。這裡使用fio測試工具。


1.AWS磁碟型別簡介

AWS EC2 instance 目前EBS有5種類型,分別是gp2,io1,st1,sc1,standard. 筆者只介紹standard,其他四種可自行上網瞭解。

standard是AWS上一代的volumn HDD型別,卷大小1G-1T,最大IOPS 40-200,最大吞吐量40-90M/s;


Previous Generation Volumes
Volume Type
EBS Magnetic
Description Previous generation HDD
Use Cases Workloads where data is infrequently accessed
API Name standard
Volume Size 1 GiB-1 TiB
Max. IOPS/Volume 40–200
Max. Throughput/Volume 40–90 MiB/s
Max. IOPS/Instance 80,000
Max. Throughput/Instance 1,750 MiB/s
Dominant Performance Attribute IOPS


2.fio工具簡介,安裝

(1)fio是專門用來測試磁碟效能的一種好用工具,有順序讀,順序寫,順序讀寫,隨機讀,隨機寫,隨機讀寫等模式,本篇只測試順序讀和隨機讀,不測試寫。

安裝fio非常簡單,直接使用yum install -y fio即可。


注意

使用fio測試寫的時候,會損害磁碟上已經存在的資料,嚴重的話會導致系統奔潰,起不來。

(不要問我為什麼知道,因為這是血和淚的教訓,筆者曾把一臺已有資料的EC2例項磁碟測試死掉,包括根磁碟和資料盤兩塊盤,最後怎麼都起不來,辛虧有AMI可以恢復。)


(2)常用引數介紹

filename=/dev/sdb1       指定測試的檔案裝置

directory 儲存檔案的目錄

direct=1                 測試過程繞過機器自帶的buffer,使測試結果更真實。

bs=16k                   單次io的塊檔案大小為16k

size=2g                  指定測試檔案大小為2g,不指定這個引數,預設是當前磁碟的全部大小

numjobs=30               指定測試執行緒為30.

runtime=1000 測試時間為1000秒

time_based=1              : Keep running until runtime/timeout is met

ioengine=psync           io引擎使用pync方式

rw=randwrite             測試隨機寫的I/O

name  指定這次job的名稱

iodepth : Number of IO buffers to keep in flight

randrepeat            : Use repeatable random IO pattern

--output=test.sql  將結果輸出到指定檔案中

allow_mounted_write=1 允許寫入測試

rwmixread               : Percentage of mixed workload that is reads

rwmixwrite              : Percentage of mixed workload that is writes


rw值:

read 順序讀

write 順序寫

randread 隨機讀

randwrite 隨機寫

rw或readwrite 順序混合讀寫

randrw 隨機混合讀寫


3.測試指令碼

為了便於測試和收集結果,筆者寫了個簡單的測試指令碼如下:

#!/bin/bash

. ~/.bash_profile
set -u
set -x
set -e
BASEDIR=/usr/local/fio
cd $BASEDIR
exec 3>&1 4>&2 1>> fio.log 2>&1

FILENAME=/dev/nvme2n1p1
DIRECT=1
#RW=read
RWS="read randread"
RANDREPEAT=0
IOENGINE=libaio
BSS="8 16 32 64 128 256 1024"
IODEPTH=8
TIME_BASED=1
RUNTIME=180
NAME=read
for rw in `echo "${RWS}"`
do
  for bs in `echo "${BSS}"`
  do
  /bin/fio --filename=${FILENAME} --direct=${DIRECT} --rw=${rw} --randrepeat=${RANDREPEAT} --ioengine=${IOENGINE} --bs=${bs}k --iodepth=${IODEPTH} --time_based=${TIME_BASED} --runtime=${RUNTIME} --name=${NAME} --output=${rw}_${bs}.txt
  sleep 3
  done
done


4.測試結果整理分析


bs(K) Read_IOPS Read_BW(MIB/s) Randread_IOPS Randread_BW(MIB/s)
8 1593 12.4 1687 13.2
16 966 15.1 955 14.9
32 956 29.9 915 28.6
64 911 56 981 61.4
128 746 93.3 786 98.3
256 686 172 711 178
1024 242 243 246 246


(1)順序讀和隨機讀的IOPS對比圖

blob.png


(2)順序讀和隨機讀的吞吐量對比圖

blob.png

5.結論

(本結論僅針對本次實驗結果,因為測試樣本不足可能導致測試結果不準)

(1)吞吐量=IOPS*bs/1024

(2)順序讀和順序寫IOPS和吞吐量差距不大。

(3)磁碟的吞吐量存在瓶頸250MIB/s,如果需要更高效能的BW,可以考慮使用AWS推薦的gp2。


參考連結

Amazon EBS Volume Types

Benchmark EBS Volumes