Topik ini menjelaskan cara mengonfigurasi kondisi pengujian dan menggunakan FIO untuk melakukan benchmark IOPS sebuah ESSD sebagai disk mentah.
Prasyarat
-
Tool pengujian: FIO.
CatatanFio (Flexible I/O Tester) adalah tool pengujian I/O open-source yang andal, digunakan untuk melakukan benchmark perangkat penyimpanan dengan berbagai beban kerja, seperti baca/tulis acak atau sekuensial.
-
Tipe instans: Disarankan menggunakan instans ECS ecs.g7se.32xlarge. Untuk informasi lebih lanjut, lihat Keluarga instans tujuan umum (seri g).
-
Gambar: Versi terbaru dari gambar publik Linux. Topik ini menggunakan Alibaba Cloud Linux 3.
CatatanHasil pengujian menunjukkan bahwa beberapa distribusi Linux mungkin tidak memberikan kinerja yang diharapkan. Kami menyarankan menggunakan gambar resmi Alibaba Cloud Linux 3 dari Alibaba Cloud untuk hasil terbaik.
-
ESSD:
-
Menguji disk mentah memberikan metrik kinerja yang lebih akurat untuk disk cloud. Kami menyarankan menjalankan FIO langsung pada disk mentah untuk menguji kinerjanya.
-
Disarankan menggunakan ESSD PL3. Untuk informasi lebih lanjut tentang ESSD, lihat ESSDs.
PentingMenguji disk mentah memberikan hasil kinerja penyimpanan blok yang paling akurat. Namun, menjalankan Fio langsung pada perangkat penyimpanan blok yang berisi partisi, sistem file, atau data lainnya akan menyebabkan error sistem file dan kehilangan data. Sebelum memulai, buat snapshot untuk mencadangkan data Anda. Untuk informasi lebih lanjut, lihat Buat snapshot manual.
Kami sangat menyarankan agar Anda tidak menguji sistem disk atau data disk yang berisi data untuk menghindari kehilangan data. Untuk pengujian, kami menyarankan menggunakan data disk baru yang belum diinisialisasi dan kosong.
Hasil pengujian kinerja diperoleh dalam lingkungan pengujian dan hanya untuk referensi. Di lingkungan produksi, kinerja disk cloud dapat bervariasi karena faktor-faktor seperti kondisi jaringan dan akses konkuren. Kinerja aktual akan berbeda-beda.
Setelah pengujian selesai, tangani disk cloud baru sebagai berikut:
Jika Anda ingin menyimpan disk tersebut: Jangan menggunakannya secara langsung. Anda harus menginisialisasi ulang data disk.
Jika Anda tidak lagi memerlukan disk tersebut: Lepaskan data disk lalu lepaskan disk cloud.
-
Prosedur
-
Sambungkan ke instans ECS.
Untuk informasi lebih lanjut, lihat Masuk ke instans Linux menggunakan Workbench.
-
Jalankan perintah berikut untuk menampilkan daftar perangkat penyimpanan blok yang tersedia.
sudo fdisk -luOutput berikut merupakan contoh di mana /dev/vda adalah sistem disk, sedangkan /dev/vdb dan /dev/vdc adalah data disk.
[ecs-a ]$ sudo fdisk -lu Disk /dev/vda: 40 GiB, 42949672960 bytes, 83886080 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: gpt Disk identifier: F51132A7-67B1-4650-806D-FD0DE6E1210C Device Start End Sectors Size Type /dev/vda1 2048 6143 4096 2M BIOS boot /dev/vda2 6144 415743 409600 200M EFI System /dev/vda3 415744 83886046 83470303 39.8G Linux filesystem Disk /dev/vdb: 30 GiB, 32212254720 bytes, 62914560 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: gpt Disk identifier: C36DF120-8650-4188-8043-AEF9C85F31EF Device Start End Sectors Size Type /dev/vdb1 2048 62912511 62910464 30G Linux filesystem Disk /dev/vdc: 40 GiB, 42949672960 bytes, 83886080 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytesOutput di atas menunjukkan bahwa instans memiliki satu sistem disk /dev/vda dan dua data disk /dev/vdb dan /dev/vdc.
-
Jalankan perintah berikut untuk memeriksa apakah perangkat penyimpanan blok memiliki partisi atau sistem file.
sudo blkid[ecs-a]$ sudo blkid /dev/vdb1: UUID="9c32c24f-d2b8-4aa8-8xxx" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="primary" PARTUUID="4bd66635-f5f4-4dc0-9bdd-664fd5b8d2fb" /dev/vda2: SEC_TYPE="msdos" UUID="7E" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="82a50cd6-9899-41eb-91fe-7027bf257086" /dev/vda3: LABEL="root" UUID="beef9d8d-ba84-46d9-8xxx" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="e0d4fa20-912d-4e86-943e-6b0866xxx" /dev/vda1: PARTUUID="d083a7cd-a7ea-4898-89d5-8e1510bed584"Seperti yang ditunjukkan di atas, perangkat penyimpanan blok /dev/vda dan /dev/vdb memiliki partisi dan sistem file. Tidak ada informasi yang dikembalikan untuk /dev/vdc, yang menunjukkan bahwa perangkat tersebut tidak memiliki partisi atau sistem file.
-
Sebelum menguji kinerja penyimpanan blok, pastikan Anda telah mencadangkan data objek pengujian untuk mencegah kehilangan data. Untuk informasi lebih lanjut, lihat Buat snapshot manual.
CatatanAnda akan dikenai biaya atas penggunaan snapshot. Untuk informasi selengkapnya, lihat Harga Snapshot.
-
Jalankan perintah berikut untuk menginstal library libaio dan tool FIO. Pilih perintah berdasarkan sistem operasi.
Alibaba Cloud Linux 2/3 dan CentOS 6 atau versi lebih baru
CatatanCentOS 6 telah mencapai masa akhir dukungan (EOL). Sesuai aturan komunitas Linux, seluruh konten telah dihapus dari alamat repositori CentOS 6 berikut: http://mirror.centos.org/centos-6/. Jika Anda tetap menggunakan repositori CentOS 6 default di Alibaba Cloud, akan muncul error. Untuk menggunakan paket instalasi tertentu dari CentOS 6, ubah alamat repositori CentOS 6. Untuk informasi lebih lanjut, lihat Bagaimana cara mengubah alamat repositori CentOS 6?
sudo yum install libaio libaio-devel fio -yDebian 9 atau versi lebih baru dan Ubuntu 14 atau versi lebih baru
PentingKarena Debian 9 dan 10 telah mencapai masa akhir dukungan (EOL), Anda harus terlebih dahulu mengubah alamat repositori pada instans ECS yang menjalankan versi-versi tersebut. Untuk informasi lebih lanjut, lihat Ubah alamat repositori untuk CentOS/Debian EOL.
sudo apt-get update sudo apt-get install libaio* fio -y -
Masuk ke direktori /tmp.
cd /tmp -
Buat skrip test100w.sh.
sudo vim test100w.sh -
Tempel konten berikut ke dalam file test100w.sh. Untuk informasi lebih lanjut, lihat Skrip Test100w.sh.
#!/bin/bash DEV_NODE=your_device DEV_NAME=/dev/$DEV_NODE function CheckHasFS { local device=$1 # Jalur perangkat. # Periksa apakah perangkat ada. if [ ! -b "$device" ]; then echo "Error: Device $device does not exist" exit 1 fi # Gunakan perintah `blkid` untuk memeriksa tabel partisi dan tipe sistem file. local pt_type=$(sudo blkid -o value -s PTTYPE "$device") local fs_type=$(sudo blkid -o value -s TYPE "$device") if [ -n "$pt_type" ] || [ -n "$fs_type" ]; then return 1 else return 0 fi } CheckHasFS "$DEV_NAME" if [ $? -eq 1 ]; then echo "$DEV_NAME contains a partition table or a file system. Stop the fio script!" exit 1 fi function RunFio { numjobs=$1 # Jumlah thread pengujian dalam instans. Contoh: 10. iodepth=$2 # Jumlah maksimum permintaan I/O yang dapat diajukan secara bersamaan. Contoh: 64. bs=$3 # Ukuran satu blok I/O. Contoh: 4k. rw=$4 # Kebijakan baca/tulis untuk pengujian. Contoh: randwrite. size=$5 filename=$6 # Nama file pengujian. Contoh: /dev/your_device. nr_cpus=`cat /proc/cpuinfo |grep "processor" |wc -l` if [ $nr_cpus -lt $numjobs ];then echo "Numjobs is more than cpu cores, exit!" exit -1 fi let nu=$numjobs+1 cpulist="" for ((i=1;i<10;i++)) do list=`cat /sys/block/$DEV_NODE/mq/*/cpu_list | awk '{if(i<=NF) print $i;}' i="$i" | tr -d ',' | tr '\n' ','` if [ -z $list ];then break fi cpulist=${cpulist}${list} done spincpu=`echo $cpulist | cut -d ',' -f 2-${nu}` echo $spincpu fio --ioengine=libaio --runtime=30s --numjobs=${numjobs} --iodepth=${iodepth} --bs=${bs} --size=${size} --rw=${rw} --filename=${filename} --time_based=1 --direct=1 --name=test --group_reporting --cpus_allowed=$spincpu --cpus_allowed_policy=split } echo 2 > /sys/block/$DEV_NODE/queue/rq_affinity sleep 5 RunFio 10 128 4k randwrite 1024g $DEV_NAME -
Modifikasi skrip test100w.sh sesuai kebutuhan.
-
Ganti semua parameter
your_devicedengan nama perangkat aktual, misalnya nvme1n1. -
Atur nilai untuk 10 (numjobs), 64 (iodepth), 4k (bs), randwrite (rw), dan /dev/your_device dalam perintah
RunFio 10 64 4k randwrite /dev/your_deviceberdasarkan situasi aktual Anda. -
Nilai
numjobstidak boleh melebihi jumlah core CPU. Untuk mengetahui jumlah core CPU, jalankan perintah berikut:cat /proc/cpuinfo |grep "processor" |wc -l
-
-
Jalankan perintah berikut untuk menguji kinerja ESSD.
sudo sh test100w.sh-
Dalam output perintah, baris yang berisi
IOPS=***menunjukkan IOPS ESSD.job1: (g=0): rw=randwrite, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=128 ... fio-3.7 Starting 6 processes Jobs: 6 (f=6): [w(6)][100.0%][r=0KiB/s,w=3932MiB/s][r=0,w=1007k IOPS][eta 00m:00s] job1: (groupid=0, jobs=6): err= 0: pid=42693: Thu Jun 23 15:32:28 2022 write: IOPS=1005k, BW=3925MiB/s (4116MB/s)(38.4GiB/10015msec) slat (nsec): min=728, max=9562.2k, avg=5157.38, stdev=47881.11 clat (usec): min=82, max=25001, avg=758.61, stdev=843.67 lat (usec): min=86, max=25042, avg=763.86, stdev=844.85 clat percentiles (usec): | 1.00th=[ 190], 5.00th=[ 347], 10.00th=[ 445], 20.00th=[ 537], | 30.00th=[ 586], 40.00th=[ 635], 50.00th=[ 652], 60.00th=[ 676], | 70.00th=[ 693], 80.00th=[ 717], 90.00th=[ 824], 95.00th=[ 1254], | 99.00th=[ 4424], 99.50th=[ 6849], 99.90th=[10814], 99.95th=[15008], | 99.99th=[19530] bw ( KiB/s): min=573448, max=732136, per=16.69%, avg=670799.74, stdev=26159.23, samples=120 iops : min=143362, max=183034, avg=167699.93, stdev=6539.81, samples=120 lat (usec) : 100=0.01%, 250=2.26%, 500=11.66%, 750=71.40%, 1000=8.11% lat (msec) : 2=3.38%, 4=2.02%, 10=1.04%, 20=0.11%, 50=0.01% cpu : usr=14.45%, sys=24.23%, ctx=401609, majf=0, minf=236 IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=110.0% submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.1% issued rwts: total=0,10062326,0,0 short=0,0,0,0 dropped=0,0,0,0 latency : target=0, window=0, percentile=100.00%, depth=128 Run status group 0 (all jobs): WRITE: bw=3925MiB/s (4116MB/s), 3925MiB/s-3925MiB/s (4116MB/s-4116MB/s), io=38.4GiB (41.2GB), run=10015-10015msec Disk stats (read/write): nvme1n1: ios=4Z/11063917, merge=0/0, ticks=5/8026436, in_queue=9632482, util=100.00% -
Jika Anda melihat output berikut, disk pengujian memiliki partisi atau sistem file. Skrip FIO berhenti untuk memastikan keamanan data. Gunakan data disk baru yang kosong untuk pengujian.
[[ecs-user@ecs tmp]$ sudo sh test100w.sh /dev/vdb contains a partition table or a file system. Stop the fio script!PeringatanJika objek pengujian memiliki partisi, sistem file, atau data lainnya, menjalankan FIO langsung pada objek tersebut akan menyebabkan exception sistem file dan kehilangan data. Jika data disk Anda memiliki partisi dan sistem file, kami menyarankan membuat data disk baru yang kosong untuk pengujian:
-
Anda dapat membuat disk cloud bayar sesuai penggunaan yang memiliki konfigurasi yang sama dan menyambungkan disk tersebut ke Instans untuk pengujian. Untuk informasi selengkapnya, lihat Membuat disk data.
-
Setelah pengujian selesai, Anda dapat melepas dan merilis disk sesuai kebutuhan. Untuk informasi selengkapnya, lihat Melepas disk data dan Merilis disk cloud.
-
-
Skrip Test100w.sh
-
Perintah berikut mengatur parameter
rq_affinityperangkat blok ke nilai 2.echo 2 > /sys/block/your_device/queue/rq_affinityNilai rq_affinity
Deskripsi nilai
1
Saat perangkat blok menyelesaikan operasi I/O, event penyelesaian dikirim ke grup vCPU yang sama yang mengajukan permintaan. Dalam skenario multi-threaded dan konkuren, hal ini menciptakan bottleneck dan membatasi kinerja.
2
Saat perangkat blok menyelesaikan operasi I/O, event penyelesaian diproses pada vCPU yang mengajukan permintaan. Dalam skenario multi-threaded dan konkuren, kinerja setiap vCPU dapat dimanfaatkan secara penuh.
-
Perintah berikut mengikat
jobsyang berbeda ke core CPU yang berbeda.fio -ioengine=libaio -runtime=30s -numjobs=${numjobs} -iodepth=${iodepth} -bs=${bs} -rw=${rw} -filename=${filename} -time_based=1 -direct=1 -name=test -group_reporting -cpus_allowed=$spincpu -cpus_allowed_policy=splitCatatanDalam mode normal, perangkat hanya memiliki satu antrian permintaan. Dalam skenario I/O multi-threaded dan konkuren, satu-satunya antrian permintaan dapat menjadi bottleneck kinerja. Mode multi-antrian memungkinkan perangkat menggunakan beberapa antrian permintaan untuk memproses I/O, sehingga memanfaatkan sepenuhnya kinerja penyimpanan backend. Untuk menggunakan fitur ini secara efektif, Anda harus mengikat thread I/O ke core CPU yang berbeda yang sesuai dengan antrian permintaan yang berbeda.
Parameter
Catatan
Contoh
numjobsJumlah thread I/O.
10
/dev/your_deviceNama perangkat ESSD.
/dev/nvme1n1
cpus_allowed_policyFIO menyediakan parameter
cpus_allowed_policydancpus_alloweduntuk mengikat vCPU.split
Perintah di atas menjalankan beberapa
jobsdan mengikatnya ke core CPU yang berbeda yang sesuai dengan nilai Queue_Id yang berbeda. Untuk menanyakan nilai cpu_core_id yang diikat oleh nilai Queue_Id, jalankan perintah berikut:-
Jalankan perintah
ls /sys/block/your_device/mq/. Dalam perintah ini, gantiyour_devicedengan nama perangkat aktual, misalnya nvme1n1. Perintah ini menanyakan nilaiQueue_Iduntuk perangkat yang ditentukan. -
Jalankan perintah
cat /sys/block/your_device/mq/*/cpu_list. Dalam perintah ini, gantiyour_devicedengan nama perangkat aktual, misalnya nvme1n1. Perintah ini menunjukkan core CPU mana yang diikat ke setiap antrian permintaan untuk perangkat yang ditentukan.
-