This topic describes how to test the IOPS performance of an enhanced SSD (ESSD). The specifications of the disk and the test conditions affect the test results. If you configure the test conditions as in the following example, you can achieve an IOPS of one million when you perform a performance stress test on the ESSD.
Background information
Test conditions:
- Sample operation: random write (randwrite).
- Image: We recommend that you use a later version of a Linux public image provided by Alibaba Cloud, such as CentOS 7.4 64-bit, CentOS 7.3 64-bit, CentOS 7.2 64-bit, or Alibaba Cloud Linux 2.1903 64-bit.
- Tool: We recommend that you use fio.
- Instance type: We recommend that you use ecs.g5se.18xlarge.
- ESSD: We recommend that you use a PL3 ESSD. In this example, the device name of the
ESSD is /dev/vdb. For more information, see Enhanced SSDs.
Warning You can obtain accurate test results by testing raw disk partitions. However, you may destroy the file system structure in a raw disk partition if you test the partition directly. Before you test a raw disk, we recommend that you create a snapshot of the disk to back up your data. For more information about how to create a snapshot, see Create a normal snapshot. To prevent data loss, we recommend that you use a new ECS instance that contains no data for the test.
Procedure
Details of the test100w.sh script
- In the script, the following command sets the
rq_affinity
parameter to 2:echo 2 > /sys/block/vdb/queue/rq_affinity
Value of rq_affinity Description 1 Indicates that the block device delivers the received I/O completion events to the group of vCPUs that submit the corresponding I/O requests. In scenarios where multiple threads run concurrently, I/O completion events may be delivered only to one vCPU and cause a performance bottleneck. 2 Indicates that the block device delivers the received I/O completion events to the vCPU that submits the corresponding I/O requests. In scenarios where multiple threads run concurrently, each vCPU can deliver its maximum performance. - The following command runs
jobs
to bind queues to different CPU cores: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=split
Note In normal mode, a device has a single request queue. This request queue becomes a performance bottleneck when multiple threads run concurrently to process I/O. In multi-queue mode, a device can have multiple request queues to process I/O and deliver the maximum backend storage performance. Assume that you have four I/O threads. To make full use of the multi-queue mode and improve storage performance, you must bind these threads to the CPU cores that correspond to different request queues.Parameter Description Example numjobs
The number of I/O threads. 10 /dev/vdb
The device name of the ESSD. /dev/vdb cpus_allowed_policy
The cpus_allowed_policy
andcpus_allowed
parameters provided by fio to bind vCPUs.split The preceding command runsjobs
to bind queues to CPU cores. To view the ID of the CPU core to which a queue is bound, perform the following steps:- Run the
ls /sys/block/vd*/mq/
command to view the ID of the queue for an ESSD whose device name is in the /dev/vd* format. - Run the
cat /sys/block/vd*/mq//cpu_list
command to view the ID of the CPU core to which the queue returned in the previous step is bound.
- Run the