Este tópico explica como configure as condições de teste e usar o FIO para medir o IOPS de um ESSD como disco bruto.
Pré-requisitos
-
Ferramenta de teste: FIO.
NotaO Fio (Flexible I/O Tester) é uma ferramenta de teste de I/O poderosa e de código aberto para avaliar dispositivos de armazenamento com diversas cargas de trabalho, como leituras e gravações aleatórias ou sequenciais.
Tipo de instância: recomenda-se uma instância ECS ecs.g7se.32xlarge. Para mais informações, consulte General-purpose instance families (g-series).
-
Imagem: uma versão recente de uma imagem pública Linux. Este tópico utiliza o Alibaba Cloud Linux 3.
NotaTestes indicam que algumas distribuições Linux podem não oferecer o desempenho esperado. Para obter os melhores resultados, utilize a imagem oficial do Alibaba Cloud Linux 3 da Alibaba Cloud.
-
ESSD:
Testar um disco bruto fornece métricas de desempenho mais precisas para um disco cloud. Recomenda-se execute o FIO diretamente em um disco bruto para avaliar seu desempenho.
Recomenda-se um ESSD PL3. Para mais informações sobre ESSDs, consulte ESSDs.
ImportanteO teste em disco bruto oferece os resultados mais precisos de desempenho de block storage. No entanto, execute o Fio diretamente em um dispositivo de block storage com partições, sistema de arquivos ou outros dados causa erros no sistema de arquivos e perda de dados. Antes de começar, crie um snapshot para fazer backup dos seus dados. Para mais informações, consulte Create a snapshot manually.
É altamente recomendável não testar o disco do sistema ou um disco de dados com informações, para evitar perda de dados. Para testes, utilize um disco de dados novo, não inicializado e vazio.
Os resultados dos testes de desempenho foram obtidos em ambiente de teste e servem apenas como referência. Em ambiente de produção, o desempenho de um disco cloud pode variar devido a fatores como condições de rede e acessos simultâneos. O desempenho real está sujeito a variações.
-
Após a conclusão do teste, proceda da seguinte forma com o novo disco cloud:
Se desejar manter o disco: não o utilize diretamente. Você deve re-initialize the data disk.
Se não precisar mais do disco: Detach the data disk e depois release the cloud disk.
Procedimento
-
Conecte-se a uma instância ECS.
Para mais informações, consulte Log on to a Linux instance using Workbench.
-
Execute o comando a seguir para listar os dispositivos de block storage disponíveis.
sudo fdisk -luA saída abaixo é um exemplo em que /dev/vda é um disco do sistema, enquanto /dev/vdb e /dev/vdc são discos de dados.
[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 bytesA saída anterior mostra que a instância possui um disco do sistema /dev/vda e dois discos de dados /dev/vdb e /dev/vdc.
-
Execute o comando a seguir para verificar se o dispositivo de block storage possui partições ou sistema de arquivos.
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"Conforme mostrado acima, os dispositivos de block storage /dev/vda e /dev/vdb possuem partições e sistemas de arquivos. Nenhuma informação foi retornada para /dev/vdc, o que indica a ausência de partições ou sistemas de arquivos.
-
Antes de testar o desempenho do block storage, certifique-se de ter feito backup dos dados do objeto de teste para evitar perda de informações. Para mais informações, consulte Create a manual snapshot.
NotaO uso de snapshots gera cobrança. Para mais informações, consulte Snapshot pricing.
-
Execute o comando a seguir para instale a biblioteca libaio e a ferramenta FIO. Selecione um comando de acordo com o sistema operacional.
Alibaba Cloud Linux 2/3 and CentOS 6 or later
NotaO CentOS 6 atingiu o fim da vida útil (EOL). De acordo com as regras da comunidade Linux, todo o conteúdo foi removido do seguinte endereço de repositório do CentOS 6: http://mirror.centos.org/centos-6/. Se você continuar usando o repositório padrão do CentOS 6 na Alibaba Cloud, um erro será reportado. Para usar pacotes de instalação específicos do CentOS 6, altere o endereço do repositório do CentOS 6. Para mais informações, consulte How do I change CentOS 6 repository addresses?
sudo yum install libaio libaio-devel fio -yDebian 9 or later and Ubuntu 14 or later
ImportanteComo o Debian 9 e 10 atingiram o fim da vida útil (EOL), você deve primeiro alterar o endereço do repositório em qualquer instância ECS que execute essas versões. Para mais informações, consulte Change the repository addresses for CentOS/Debian EOL.
sudo apt-get update sudo apt-get install libaio* fio -y -
Acesse o diretório /tmp.
cd /tmp -
Crie o script test100w.sh.
sudo vim test100w.sh -
Cole o conteúdo a seguir no arquivo test100w.sh. Para mais informações, 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 o script test100w.sh conforme necessário.
Substitua todos os parâmetros
your_devicepelo nome real do dispositivo, como nvme1n1.Defina os valores para 10 (numjobs), 64 (iodepth), 4k (bs), randwrite (rw) e /dev/your_device no comando
RunFio 10 64 4k randwrite /dev/your_devicecom base na sua situação real.-
O valor de
numjobsnão deve exceder o número de núcleos de CPU. Para descobrir a quantidade de núcleos de CPU, execute o seguinte comando:cat /proc/cpuinfo |grep "processor" |wc -l
-
Execute o comando a seguir para testar o desempenho do ESSD.
sudo sh test100w.sh-
Na saída do comando, a linha contendo
IOPS=***exibe o IOPS do 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% -
Caso visualize a saída a seguir, o disco de teste possui uma partição ou sistema de arquivos. O script FIO interrompe a execução para garantir a segurança dos dados. Utilize um disco de dados novo e vazio para o teste.
[[ecs-user@ecs tmp]$ sudo sh test100w.sh /dev/vdb contains a partition table or a file system. Stop the fio script!AvisoSe o objeto de teste possuir uma partição, sistema de arquivos ou outros dados, execute o FIO diretamente nele causa exceções no sistema de arquivos e perda de dados. Caso seu disco de dados tenha partição e sistema de arquivos, recomenda-se crie um novo disco de dados vazio para os testes:
É possível crie um disco cloud de pagamento conforme o uso com as mesmas configurações e anexá-lo à instância para testes. Para mais informações, consulte Create a data disk.
Após a conclusão do teste, desanexe e libere o disco conforme necessário. Para mais informações, consulte Detach a data disk e Release a cloud disk.
-
Script test100w.sh
-
O comando a seguir define o parâmetro
rq_affinitydo dispositivo de bloco como 2.echo 2 > /sys/block/your_device/queue/rq_affinityValores de rq_affinity
Descrição do valor
1
Quando um dispositivo de bloco conclui uma operação de I/O, o evento de conclusão é enviado ao mesmo grupo de vCPU que enviou a solicitação. Em cenários multithread e simultâneos, isso cria um gargalo e limita o desempenho.
2
Ao concluir uma operação de I/O, o dispositivo de bloco processa o evento de conclusão na vCPU que originou a solicitação. Em cenários multithread e simultâneos, o desempenho de cada vCPU pode ser totalmente aproveitado.
-
O comando a seguir vincula diferentes
jobsa diferentes 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=splitNotaNo modo normal, um dispositivo possui apenas uma fila de solicitações. Em cenários de I/O simultâneo e multithread, essa única fila pode se tornar um gargalo de desempenho. O modo multi-fila permite que o dispositivo utilize várias filas para processar I/O, aproveitando totalmente o desempenho do armazenamento back-end. Para usar esse recurso de forma eficaz, vincule as threads de I/O a diferentes núcleos de CPU correspondentes a diferentes filas de solicitação.
Parâmetros
Observação
Exemplo
numjobsQuantidade de threads de I/O.
10
/dev/your_deviceNome do dispositivo do ESSD.
/dev/nvme1n1
cpus_allowed_policyO FIO fornece os parâmetros
cpus_allowed_policyecpus_allowedpara vincular vCPUs.split
O comando anterior executa múltiplos
jobse os vincula a diferentes núcleos de CPU correspondentes a diferentes valores de Queue_Id. Para consultar o valor cpu_core_id ao qual um valor Queue_Id está vinculado, execute os seguintes comandos:Execute o comando
ls /sys/block/your_device/mq/. Substituayour_devicepelo nome real do dispositivo, como nvme1n1. Este comando consulta os valores deQueue_Idpara o dispositivo especificado.Execute o comando
cat /sys/block/your_device/mq/*/cpu_list. Substituayour_devicepelo nome real do dispositivo, como nvme1n1. Este comando mostra qual núcleo de CPU está vinculado a cada fila de solicitação do dispositivo especificado.