Melakukan Pengukuran Perfoma NEO Block Storage (NBS) dan NEO High Perfomance Disk (NHP)

Oleh: Yusuf Hadiwinata Sutandar


Pendahuluan

Proses pengukuran perfoma dapat digunakan untuk melakukan perkiraan kebutuhan terdahap infrastruktur Anda. Dengan pengujian pengukuran, Anda dapat memantau sumber daya server, mengoptimalkan kinerja, mengelola pemanfaatan, dan memprediksi masalah yang mungkin terjadi.

Dalam tutorial ini, kami akan membahas praktik terbaik untuk mengukur NEO Block Storage (NBS) dan NEO High Perfomance (HPC) Disk Anda dengan mensimulasikan beban kerja yang seperti mensimulasikan aplikasi Database ataupun Web Server anda.


Pengaturan Pengukuran Perfoma pada NEO Block Storage

Untuk pengujian kali ini akan meggunakan spesifikasi seperti di bawah ini:

  1. Neo Virtual Compute (NVC) SS2.1 (1vCpu, 2GB Ram, dan 60 GB disk untuk OS).
  2. Sistem Operasi yang digunakan adalah Linux (Ubuntu 18.04 LTS).
  3. File System yang digunakan untuk pengujian adalah Ext4.
  4. Software pengukuran yang digunakan adalah Fio - Flexible I/O.

Jika Anda melakukan pembandingan perfoma dengan penyedia layanan komputasi awan lain, agar dapat menggunakan spesifikasi yang sama dengan di atas agar hasil dari pengukuranya dapat tepat dan akurat.

Proses pembuatan NEO Virtual Compute adalah sebagai berikut

1. Buka Portal NEOCLOUD atau Horizon NEOCLOUD dan klik menu Instance > Launch Instances.

2. Masukan nama instance pada kolom "Instance Name" sesuai kebutuhan Anda.

3. Selanjutnya pada menu "Source" pilih Ubuntu 18.04 LTS seperti pada gambar di bawah ini.

4. Langkah berikutnya adalah pemilihan Flavor, pada pengetesan kali ini menggunakan Flavor SS2.1.

5. Klik menu Network dan pilih network sesuai kebutuhan Anda

6. Pada menu terakhir yaitu Key Pair, pilih Key Pair yang akan digunakan untuk otentikasi.

7. Langkah terakhir adalah klik tombol "Launch Insntance".

8. Tunggu beberapa saat maka instance Anda akan siap.

9. Untuk memudahkan akses, silahkan membuat Floating IP Public_Network.

10. Langkah berikutnya adalah membuat NEO Block Storage dan NEO High Perfomance (NHP) Disk dan diarahan ke instance yang sebelumnya telah dibuat, adapun spesifikasi NBS dan NHP yang akan dibuat adalah seperti berikut:

Volume Name

Type

Size (GiB)

Attached To

NBS

NBS

1

/dev/vdb on Neo-Block-Storage-Benchmarking

NHP-5K

NHP 5K IOPS

1

/dev/vdc on Neo-Block-Storage-Benchmarking

NHP-10K

NHP 10K IOPS

1

/dev/vdd on Neo-Block-Storage-Benchmarking

NHP-15K

NHP 15K IOPS

1

/dev/vde on Neo-Block-Storage-Benchmarking

11. Berikut adalah tampilan dari proses pembuatan di atas.







12. Langkah berikutnya adalah melakukan persiapan pada NBS dan NHP yang sudah terpasang di instance.

Cek apakah NBS dan NHP sudah terdeteksi, ada keluaran perintah di bawah ini terdapat vda sebagai Sistem operasi disk dan vdb-vde sebagai NBS dan NHP

$ sudo lsblk  | grep vd
vda     252:0    0   60G  0 disk
├─vda1  252:1    0 59.9G  0 part /
├─vda14 252:14   0    4M  0 part
└─vda15 252:15   0  106M  0 part /boot/efi
vdb     252:16   0    1G  0 disk
vdc     252:32   0    1G  0 disk
vdd     252:48   0    1G  0 disk
vde     252:64   0    1G  0 disk

Lakukan pembuatan partisi dan file system untuk disk vdb-vde.

$ sudo fdisk /dev/vdb
Welcome to fdisk (util-linux 2.31.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x68a36ead.
Command (m for help): n
Partition type
p   primary (0 primary, 0 extended, 4 free)
e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): <enter>
First sector (2048-2097151, default 2048): <enter>
Last sector, +sectors or +size{K,M,G,T,P} (2048-2097151, default 2097151):
Created a new partition 1 of type 'Linux' and of size 1023 MiB.
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

Lakukan hal yang sama untuk vdc, vdd, dan vde,. Setelah membuat partisi langkah berikutnya adalah membuat file system.

$ mkfs.ext4 /dev/vdb1
mke2fs 1.44.1 (24-Mar-2018)
Creating filesystem with 261888 4k blocks and 65536 inodes
Filesystem UUID: 005efd6a-4c6d-43b2-98bb-5ea4939d71f7
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

Lakukan pembuatan partisi yang sama pada vdc, vdd, vde, jika semua disk sudah di buat partisi dan file system, dan sebagai langkah tambah, kita dapat membuat labe pada masing2 partisi tersebut, berikut contoh tampilanya

$ sudo e2label /dev/vde NBS
$ sudo e2label /dev/vde1 NBS
$ sudo e2label /dev/vdd1 NHP-5K
$ sudo e2label /dev/vdc1 NHP-10K
$ sudo e2label /dev/vdb1 NHP-15K
$ sudo lsblk 
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
vdb     252:16   0    1G  0 disk
└─vdb1  252:17   0 1023M  0 part
vdc     252:32   0    1G  0 disk
└─vdc1  252:33   0 1023M  0 part
vdd     252:48   0    1G  0 disk
└─vdd1  252:49   0 1023M  0 part
vde     252:64   0    1G  0 disk
└─vde1  252:65   0 1023M  0 part
$ sudo blkid 
/dev/vdb1: LABEL="NHP-15K" UUID="xxxxxxxxxxxxx" TYPE="ext4" PARTUUID="68a36ead-01"
/dev/vdc1: LABEL="NHP-10K" UUID="xxxxxxxxxxxxx" TYPE="ext4" PARTUUID="4cec3fd1-01"
/dev/vdd1: LABEL="NHP-5K" UUID="xxxxxxxxxxxxx" TYPE="ext4" PARTUUID="49fee5d7-01"
/dev/vde1: LABEL="NBS" UUID="xxxxxxxxxxxxx" TYPE="ext4" PARTUUID="32d0b082-01"
$ sudo mkdir -p /mnt/{NBS,NHP-5K,NHP-10K,NHP-15K}
$ sudo mount -L NBS /mnt/NBS/
$ sudo mount -L NHP-5K /mnt/NHP-5K
$ sudo mount -L NHP-10K /mnt/NHP-10K
$ sudo mount -L NHP-15K /mnt/NHP-15K
$ sudo mount
/dev/vde1 on /mnt/NBS type ext4 (rw,relatime,data=ordered)
/dev/vdd1 on /mnt/NHP-5K type ext4 (rw,relatime,data=ordered)
/dev/vdc1 on /mnt/NHP-10K type ext4 (rw,relatime,data=ordered)
/dev/vdb1 on /mnt/NHP-15K type ext4 (rw,relatime,data=ordered)

Pada tahap ini sudah selesai dalam menyiapkan instance dan disk dari NBS serta NHP untuk melakukan pengukuran perfoma.


Alat dan Konfigurasi Pengukuran Performa

Ada beberapa alat (Tools) yang dapat digunakan untuk melakukan pengukuran perfoma disk, beberapa alat tersebut adalah: Iometer, FIO, Bonnie++, btest, dan Filebench. Pertimbangan kami menggunakan FIO adalah karena sangat fleksibel dan didukung oleh sebagian besar distribusi Linux dan sistem operasi lainya.

Untuk melakukan pemasangan FIO pada server Ubuntu, Anda harus terlebih dahulu memperbarui daftar paket Anda dan kemudian baru dapat menginstalnya dengan menggunakan perintah berikut:

$ sudo apt update
$ sudo apt install fio

Saat menjalankan situs web atau beban kerja yang serupa, secara umum pengukuran terbaik dari subsistem disk dikenal sebagai IOPS: Operasi Input/Output per detik. Secara spesifik, tes khusus yang ingin kami lakukan adalah:

  1. Proses pembacaan secara acak (Random reads), penulisan acak (Random write), atau kombinasi keduanya. Database secara khusus akan menarik data dari seluruh disk Anda - yang dikenal sebagai akses secara acak (Random access).
  2. 1-256 blok kilobyte. Sekali lagi, database dan banyak program lain akan membaca data yang sangat kecil - 4 kilobyte adalah perkiraan kerja yang cukup akurat untuk dijadikan acuan pengukuran.
  3. Multiple threads. Jika situs web Anda memiliki banyak pengunjung, situs web Anda akan melayani semuanya pada saat yang bersamaan. Kami menjadikan patokan ini untuk mensimulasikan perilaku tersebut.


Menjalankan Pengukuran Perfoma

Berikut adalah beberapa contoh pengukuran yang dapat Anda jalankan. Di bagian selanjutnya dari tutorial ini, kita akan membahas cara memeriksa output yang Anda terima secara lebih mendalam.

Berikut adalah beberapa "Command Option" pada FIO beserta penjelasanya yang dikutip dari website FIO

Option

Recommendations

iodepth

The queue depth that fio will issue to the file. In order to hit best input/output (I/O) rates, a number greater than iodepth=64 is recommended.

bs

Block size in bytes for I/O to use. File systems use 4K for metadata but tend to store files in much larger block sizes. Databases typically issue 8-16K sized I/O. For peak bandwidth tests, we recommend a block size of bs=64k or greater.

runtime

The time in seconds to run the benchmark. We recommend a runtime greater than 60 seconds, usually in the range of runtime=120s to runtime=300s.

ioengine

The ioengine option defines how the job issues I/O to the file. We recommend ioengine=libaio which refers to Linux native asynchronous I/O.

direct

Takes a Boolean value: 0 uses the filesystem cache returning a value closest to the application behavior which may result in higher than typical benchmark results; and 1skips any file system caching behavior, returning the closest performance to what the block volume can do. We recommend direct=1.

sync

Use synchronous I/O for buffered writes. This option takes a Boolean value: 0 means not to force unit access, allowing for writeback cache behavior to operate like it does on normal disk drives with fio behaving more like a filesystem; 1 forces unit access, meaning I/O will not complete until the disk has guaranteed physical placement. We recommend sync=0.

size

Size of test file, taking an integer. We typically recommend at least 20 gigabytes. Note that DigitalOcean’s performance does not vary with volume size.

Dalam perintah berikut, kami mengarahkan ke file fio.test pada NEO Block Storage yang berbasis di pusat data Jakarta.


Bandwidth Penulisan (Write Bandwidth)

Proses pengukuran ini melakukan penulisan secara acak sebesar 1MB ke volume blok.

$ fio --filename=/mnt/NBS/fio.test --direct=1 --readwrite=randrw --ioengine=libaio --bs=1024 --iodepth=32 
--name=bw-test --runtime=120s --size=900Mb

Berikut adalah hasilnya dari pengukuran NBS:

WRITE: bw=7055KiB/s (7225kB/s), 7055KiB/s-7055KiB/s (7225kB/s-7225kB/s), io=450MiB (472MB), run=65267-65267msec

Dari hasil pengukuran didapatkan nilai 7055KiB/s atau +/- 7MiB Throughput Bandwitdh penulisan.


Uji Random Baca (Random Read Test)

Pengetesan Ini akan mengukur seberapa cepat beberapa file kecil dapat dibaca sekaligus dari NBS.

$ fio --filename=/mnt/NBS/fio.test --direct=1 --readwrite=randread --ioengine=libaio --bs=4K --iodepth=128 
--name=rand-r --runtime=120s --size=900Mb

Berikut adalah hasilnya dari pengukuran NBS:

READ: bw=214MiB/s (225MB/s), 214MiB/s-214MiB/s (225MB/s-225MB/s), io=900MiB (944MB), run=4198-4198msec

Dari hasil pengujian didapat nilai 214MiB/s


Uji Random Tulis (Random Write Test)

Ini akan mengukur seberapa cepat beberapa file kecil dapat ditulis secara bersamaan

$ fio --filename=/mnt/NBS/fio.test --direct=1 --readwrite=randwrite --ioengine=libaio --bs=4K --iodepth=128 
--name=rand-rw --runtime=120s --size=900Mb

Berikut adalah hasilnya dari pengukuran NBS:

WRITE: bw=83.6MiB/s (87.6MB/s), 83.6MiB/s-83.6MiB/s (87.6MB/s-87.6MB/s), io=900MiB (944MB), run=10768-10768msec


Uji Latensi Baca (Read Latency Test)

Test ini akan menentukan waktu yang diperlukan untuk menemukan dan mengakses blok data yang benar pada disk NBS.

$ fio --filename=/mnt/NBS/fio.test --direct=1 --readwrite=randread --ioengine=libaio --bs=4K --iodepth=1 
--name=lat-read --runtime=120s --size=900m

Berikut adalah hasilnya dari pengukuran NBS:

slat (nsec/nano second): min=1690, max=5789.8k, avg=14694.31, stdev=13077.12
clat (nsec/nano second): min=883, max=13178k, avg=396084.76, stdev=150662.63
lat (usec/micro second): min=3, max=13200, avg=411.91, stdev=152.69

Dari hasil di atas menunjukan latensi NBS masih di bawah 0.1 second, di mana biasanya batasan atas untuk latensi yang baik adalah 5 second.


Uji Latensi Tulis (Write Latency Test)

Test ini akan menentukan waktu yang diperlukan untuk menulis blok data yang benar pada disk.

$ fio --filename=/mnt/NBS/fio.test --direct=1 --readwrite=randwrite --ioengine=libaio --bs=4K --iodepth=1 
--name=lat-write --runtime=120s --size=900m

Berikut adalah hasilnya dari pengukuran NBS:

slat (usec): min=6, max=5331, avg=18.13, stdev=18.91
clat (usec): min=2, max=99903, avg=1173.42, stdev=647.74
lat (usec): min=673, max=99915, avg=1192.65, stdev=648.12

Dari hasil di atas menunjukan latensi NBS masih di bawah 0.1 second, di mana biasanya batasan atas untuk latensi yang baik adalah 5 second.

Latensi dipengaruhi oleh beberapa faktor, termasuk kinerja sistem penyimpanan, ukuran I/O, queue depth, dan batas throttle apapun yang dipicu.

Kinerja dari volume pada NBS akan semakin besar jika ukuran blok dan queue depth juga diperbesar. Artinya, penyimpanan mempunyai perfoma terbaik ketika diberikan banyak pekerjaan untuk melakukan banyak pada saat yang bersamaan.

Di bawah ini adalah grafik yang menunjukkan contoh kinerja pada paralelisme pada NEO NBS.


Pengukuran perfoma dari NEO NBS menggunakan berbagai macam ukurang block size, dari 4k, 8k, 16k, 32k, 64, 128, 256k, hingga 512k menggunakan perintah berikut, didapatkan hasil bahwa ukuran blok menentukan hasil dari IOPS dan Troughput.

$ for i in 1 2 4 8 16 32 64 128 254 ; do fio --filename=/mnt/NBS/fio.test --direct=1 --readwrite=randread 
--ioengine=libaio --bs=4096K --iodepth=$i --name=bw-test --runtime=120s --size=910Mb | grep 'read: IOPS' ; done




Pengukuran perfoma berikutnya yaitu IOPS dan Troughput dari NEO NBS dan Neo NHP menggunakan Block Size =1024 dan 4096 (4k) serta Queue Depth 32 dan 128 pengetesan kali ini menggunakan Random Write dan Read Mix.




Pengukuran perfoma IOPS pada NEO NBS dan NEO NHP menggunakan block size yang bervariasi dari 4k, 16k, dan 32k serta menggunakan Queue Deph yang sama yaitu 128, pengetesan kali ini menggunakan Random Write dan Read Mix.