Este tema explica cómo configurar las condiciones de prueba y utilizar FIO para evaluar el rendimiento IOPS de un disco ESSD como disco sin formato.
Requisitos previos
-
Herramienta de prueba: FIO.
NotaFio (Flexible I/O Tester) es una potente herramienta de prueba de E/S de código abierto que se utiliza para evaluar dispositivos de almacenamiento con diversas cargas de trabajo, como lecturas y escrituras aleatorias o secuenciales.
Tipo de instancia: se recomienda una instancia ECS ecs.g7se.32xlarge. Para obtener más información, consulte General-purpose instance families (g-series).
-
Imagen: una versión reciente de una imagen pública de Linux. Este tema utiliza Alibaba Cloud Linux 3.
NotaLas pruebas indican que algunas distribuciones de Linux podrían no ofrecer el rendimiento esperado. Se recomienda utilizar la imagen oficial de Alibaba Cloud Linux 3 de Alibaba Cloud para obtener los mejores resultados.
-
Disco ESSD:
Probar un disco sin formato proporciona métricas de rendimiento más precisas para un disco en la nube. Se recomienda ejecutar FIO directamente sobre un disco sin formato para evaluar su rendimiento.
Se recomienda un disco ESSD PL3. Para obtener más información sobre los discos ESSD, consulte ESSDs.
ImportanteProbar un disco sin formato ofrece los resultados más precisos de rendimiento de block storage. Sin embargo, ejecutar Fio directamente en un dispositivo de block storage que contenga particiones, un sistema de archivos u otros datos provocará errores en el sistema de archivos y pérdida de datos. Antes de empezar, cree una instantánea para realizar una copia de seguridad de sus datos. Para obtener más información, consulte Create a snapshot manually.
Se recomienda encarecidamente no probar el disco del sistema ni un disco de datos que contenga información para evitar la pérdida de datos. Para las pruebas, se sugiere utilizar un disco de datos nuevo, sin inicializar y vacío.
Los resultados de las pruebas de rendimiento se obtienen en un entorno de prueba y son solo orientativos. En un entorno de producción, el rendimiento de un disco en la nube puede variar debido a factores como las condiciones de la red y el acceso concurrente. El rendimiento real será variable.
-
Una vez finalizada la prueba, gestione el nuevo disco en la nube de la siguiente manera:
Si desea conservar el disco: no lo utilice directamente. Debe re-initialize the data disk.
Si ya no necesita el disco: Detach the data disk y luego release the cloud disk.
Procedimiento
-
Conéctese a una instancia ECS.
Para obtener más información, consulte Log on to a Linux instance using Workbench.
-
Ejecute el siguiente comando para listar los dispositivos de block storage disponibles.
sudo fdisk -luEl siguiente resultado es un ejemplo donde /dev/vda es un disco del sistema, y /dev/vdb y /dev/vdc son discos de datos.
[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 bytesEl resultado anterior muestra que la instancia tiene un disco del sistema /dev/vda y dos discos de datos /dev/vdb y /dev/vdc.
-
Ejecute el siguiente comando para comprobar si el dispositivo de block storage tiene particiones o un sistema de archivos.
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"Como se muestra arriba, los dispositivos de block storage /dev/vda y /dev/vdb tienen particiones y sistemas de archivos. No se devuelve información para /dev/vdc, lo cual indica que no tiene particiones ni sistemas de archivos.
-
Antes de probar el rendimiento del block storage, asegúrese de haber realizado una copia de seguridad de los datos del objeto de prueba para prevenir su pérdida. Para obtener más información, consulte Create a manual snapshot.
NotaEl uso de instantáneas genera cargos. Para obtener más información, consulte Snapshot pricing.
-
Ejecute el siguiente comando para instalar la biblioteca libaio y la herramienta FIO. Seleccione un comando según el sistema operativo.
Alibaba Cloud Linux 2/3 y CentOS 6 o posterior
NotaCentOS 6 alcanzó el fin de vida útil (EOL). De acuerdo con las reglas de la comunidad de Linux, todo el contenido se eliminó de la siguiente dirección del repositorio de CentOS 6: http://mirror.centos.org/centos-6/. Si continúa utilizando el repositorio predeterminado de CentOS 6 en Alibaba Cloud, se reportará un error. Para usar paquetes de instalación específicos de CentOS 6, cambie la dirección del repositorio de CentOS 6. Para obtener más información, consulte How do I change CentOS 6 repository addresses?
sudo yum install libaio libaio-devel fio -yDebian 9 o posterior y Ubuntu 14 o posterior
ImportanteDado que Debian 9 y 10 han alcanzado su fin de vida útil (EOL), primero debe cambiar la dirección del repositorio en cualquier instancia ECS que ejecute estas versiones. Para obtener más información, consulte Change the repository addresses for CentOS/Debian EOL.
sudo apt-get update sudo apt-get install libaio* fio -y -
Vaya al directorio /tmp.
cd /tmp -
Cree el script test100w.sh.
sudo vim test100w.sh -
Pegue el siguiente contenido en el archivo test100w.sh. Para obtener más información, consulte Test100w.sh script.
#!/bin/bash DEV_NODE=your_device DEV_NAME=/dev/$DEV_NODE function CheckHasFS { local device=$1 # The path of the device. # Check whether the device exists. if [ ! -b "$device" ]; then echo "Error: Device $device does not exist" exit 1 fi # Use the `blkid` command to check the partition table and file system type. 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 # The number of test threads in the instance. Example: 10. iodepth=$2 # The maximum number of I/O requests that can be submitted at the same time. Example: 64. bs=$3 # The size of a single I/O block. Example: 4k. rw=$4 # The read/write policy for the test. Example: randwrite. size=$5 filename=$6 # The name of the test file. Example: /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 -
Modifique el script test100w.sh según sea necesario.
Reemplace todos los parámetros
your_devicecon el nombre real del dispositivo, por ejemplo, nvme1n1.Establezca los valores de 10 (numjobs), 64 (iodepth), 4k (bs), randwrite (rw) y /dev/your_device en el comando
RunFio 10 64 4k randwrite /dev/your_devicesegún su situación real.-
El valor de
numjobsno debe exceder el número de núcleos de CPU. Para averiguar el número de núcleos de CPU, ejecute el siguiente comando:cat /proc/cpuinfo |grep "processor" |wc -l
-
Ejecute el siguiente comando para probar el rendimiento del disco ESSD.
sudo sh test100w.sh-
En la salida del comando, la línea que contiene
IOPS=***muestra el valor IOPS del disco 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% -
Si observa el siguiente resultado, el disco de prueba tiene una partición o un sistema de archivos. El script de FIO se detiene para garantizar la seguridad de los datos. Utilice un disco de datos nuevo y vacío para la prueba.
[[ecs-user@ecs tmp]$ sudo sh test100w.sh /dev/vdb contains a partition table or a file system. Stop the fio script!AvisoSi el objeto de prueba tiene una partición, un sistema de archivos u otros datos, ejecutar FIO directamente sobre él causará excepciones en el sistema de archivos y pérdida de datos. Si su disco de datos tiene una partición y un sistema de archivos, se recomienda crear un disco de datos nuevo y vacío para realizar las pruebas:
Puede crear un disco en la nube pay-as-you-go con las mismas configuraciones y conectarlo a la instancia para realizar pruebas. Para obtener más información, consulte Create a data disk.
Una vez finalizada la prueba, puede desconectar y liberar el disco según sea necesario. Para obtener más información, consulte Detach a data disk y Release a cloud disk.
-
Script test100w.sh
-
El siguiente comando establece el parámetro
rq_affinitydel dispositivo de bloque en 2.echo 2 > /sys/block/your_device/queue/rq_affinityValores de rq_affinity
Descripción del valor
1
Cuando un dispositivo de bloque completa una operación de E/S, el evento de finalización se envía al mismo grupo de vCPU que envió la solicitud. En un escenario concurrente y multihilo, esto crea un cuello de botella y limita el rendimiento.
2
Cuando un dispositivo de bloque completa una operación de E/S, el evento de finalización se procesa en la vCPU que envió la solicitud. En un escenario concurrente y multihilo, se aprovecha al máximo el rendimiento de cada vCPU.
-
El siguiente comando vincula diferentes
jobsa distintos núcleos de CPU.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=splitNotaEn modo normal, un dispositivo tiene solo una cola de solicitudes. En un escenario de E/S concurrente y multihilo, esta única cola puede convertirse en un cuello de botella de rendimiento. El modo de múltiples colas permite que un dispositivo use varias colas de solicitudes para procesar E/S, aprovechando completamente el rendimiento del almacenamiento subyacente. Para utilizar esta función de manera eficaz, debe vincular los hilos de E/S a diferentes núcleos de CPU que correspondan a distintas colas de solicitudes.
Parámetros
Nota
Ejemplo
numjobsEl número de hilos de E/S.
10
/dev/your_deviceEl nombre del dispositivo del disco ESSD.
/dev/nvme1n1
cpus_allowed_policyFIO proporciona los parámetros
cpus_allowed_policyycpus_allowedpara vincular vCPUs.split
El comando anterior ejecuta múltiples
jobsy los vincula a diferentes núcleos de CPU que corresponden a distintos valores de Queue_Id. Para consultar el valor cpu_core_id al que está vinculado un valor de Queue_Id, ejecute los siguientes comandos:Ejecute el comando
ls /sys/block/your_device/mq/. En el comando, reemplaceyour_devicecon el nombre real del dispositivo, por ejemplo, nvme1n1. Este comando consulta los valores deQueue_Idpara el dispositivo especificado.Ejecute el comando
cat /sys/block/your_device/mq/*/cpu_list. En el comando, reemplaceyour_devicecon el nombre real del dispositivo, por ejemplo, nvme1n1. Este comando muestra qué núcleo de CPU está vinculado a cada cola de solicitudes para el dispositivo especificado.