Como otimizar o desempenho do SSD local

Como otimizar SSDs locais

No gráfico de desempenho por tipo de disco, veja os limites de desempenho atingíveis esperados para dispositivos SSD locais. Para otimizar os apps e as instâncias de VM visando atingir essas velocidades, use as seguintes práticas recomendadas:

Como usar otimizações do ambiente convidado para SSDs locais

Por padrão, a maioria das imagens Linux fornecidas pelo Compute Engine executa automaticamente um script de otimização que configura a instância para garantir o desempenho máximo de SSD local. O script também ativa determinadas configurações de filas sysfs (link em inglês) que melhoram o desempenho geral da máquina e mascaram solicitações de interrupção (IRQs, na sigla em inglês) para CPUs virtuais (vCPUs, na sigla em inglês) específicas. Esse script otimiza apenas o desempenho dos dispositivos SSD locais do Compute Engine.

Imagens Ubuntu, SLES e outras mais antigas talvez não estejam configuradas para incluir essa otimização de desempenho. Se você usa qualquer uma dessas imagens ou uma mais antiga que a v20141218, é possível instalar o ambiente convidado para ativar essas otimizações.

Selecionar a melhor imagem para interfaces NVMe ou SCSI

Os SSDs locais expõem uma interface NVMe ou SCSI, e a melhor opção depende do sistema operacional que você está usando. Escolha uma interface para os dispositivos SSD locais que funcione melhor com a imagem do disco de inicialização. Caso as suas instâncias conectem-se a SSDs locais usando interfaces SCSI, ative o SCSI multifilas no sistema operacional convidado para melhorar o desempenho na interface do SCSI.

Ativar o SCSI multifilas em instâncias com imagens personalizadas e SSDs locais

Algumas imagens públicas são compatíveis com SCSI multifilas. Caso precise de recursos SCSI multifilas em imagens personalizadas importadas para seu projeto, será necessário ativá-las por conta própria. Suas imagens importadas do Linux usam SCSI multifilas somente quando elas incluem a versão 3.19 ou posterior do kernel.

Para ativar o SCSI multifilas em uma imagem personalizada, importe a imagem com o recurso do sistema operacional convidado VIRTIO_SCSI_MULTIQUEUE ativado e inclua uma entrada na configuração do GRUB:

CentOS

Apenas para o CentOS7.

  1. Importe a imagem personalizada usando a API e inclua um item guestOsFeatures com um valor type de VIRTIO_SCSI_MULTIQUEUE.

  2. Crie uma instância usando sua imagem personalizada e anexe um ou mais SSDs locais.

  3. Conecte-se à instância pelo SSH.

  4. Verifique o valor do arquivo /sys/module/scsi_mod/parameters/use_blk_mq.

    $ cat /sys/module/scsi_mod/parameters/use_blk_mq
    

    Se o valor desse arquivo for Y, o SCSI multifilas já estará ativado na imagem importada. Se o valor for N, inclua scsi_mod.use_blk_mq=Y na entrada GRUB_CMDLINE_LINUX do arquivo de configuração GRUB e reinicie o sistema.

    1. Abra o arquivo de configuração GRUB /etc/default/grub em um editor de texto.

      $ sudo vi /etc/default/grub
      
    2. Adicione scsi_mod.use_blk_mq=Y à entrada GRUB_CMDLINE_LINUX.

      GRUB_CMDLINE_LINUX=" vconsole.keymap=us console=ttyS0,38400n8 vconsole.font=latarcyrheb-sun16 scsi_mod.use_blk_mq=Y"
      
    3. Salve o arquivo de configuração.

    4. Execute o comando grub2-mkconfig para gerar novamente o arquivo GRUB e concluir a configuração.

      $ sudo grub2-mkconfig -o /boot/grub2/grub.cfg
      
    5. Reinicie a instância.

      $ sudo reboot
      

Ubuntu

  1. Importe a imagem personalizada usando a API do Compute Engine e inclua um item guestOsFeatures com um valor type de VIRTIO_SCSI_MULTIQUEUE.

  2. Crie uma instância usando a imagem personalizada e anexe um ou mais SSDs locais usando a interface SCSI.

  3. Conecte-se à instância pelo SSH.

  4. Verifique o valor do arquivo /sys/module/scsi_mod/parameters/use_blk_mq.

    $ cat /sys/module/scsi_mod/parameters/use_blk_mq
    

    Se o valor desse arquivo for Y, o SCSI multifilas já estará ativado na imagem importada. Se o valor for N, inclua scsi_mod.use_blk_mq=Y na entrada GRUB_CMDLINE_LINUX do arquivo de configuração GRUB e reinicie o sistema.

    1. Abra o arquivo de configuração GRUB sudo nano /etc/default/grub em um editor de texto.

      $ sudo nano /etc/default/grub
      
    2. Adicione scsi_mod.use_blk_mq=Y à entrada GRUB_CMDLINE_LINUX.

      GRUB_CMDLINE_LINUX="scsi_mod.use_blk_mq=Y"
      
    3. Salve o arquivo de configuração.

    4. Execute o comando update-grub para gerar novamente o arquivo GRUB e concluir a configuração.

      $ sudo update-grub
      
    5. Reinicie a instância.

      $ sudo reboot
      

Desativar a limpeza do cache de gravação

Os sistemas de arquivos, bancos de dados e outros apps usam a limpeza de cache (em inglês) para garantir que os dados sejam confirmados para armazenamento durável em diversos checkpoints. Para a maioria dos dispositivos de armazenamento, esse padrão faz sentido. No entanto, as limpezas do cache de gravação são muito lentas em SSDs locais. É possível melhorar o desempenho de gravação para alguns apps desativando comandos de limpeza automática neles ou opções de limpeza no nível do sistema de arquivos.

Os SSDs locais sempre limpam gravações em cache dentro de dois segundos, independentemente dos comandos de limpeza definidos para os sistemas de arquivos e os apps. Dessa forma, as falhas de hardware temporárias podem fazer você perder, no máximo, apenas dois segundos de gravações armazenados em cache. As falhas permanentes de hardware ainda podem causar perda de todos os dados no dispositivo, mesmo eles sendo limpos ou não. Por isso, faça o backup de dados importantes em discos permanentes ou intervalos do Cloud Storage.

Para desativar a limpeza do cache de gravação em sistemas de arquivos ext4, inclua a configuração nobarrier (link em inglês) nas opções de ativação ou nas entradas de /etc/fstab. Exemplo:

$ sudo mount -o discard,defaults,nobarrier /dev/[LOCAL_SSD_ID] /mnt/disks/[MNT_DIR]

em que [LOCAL_SSD_ID] é o ID de dispositivo do SSD local que você quer ativar e [MNT_DIR] é o diretório em que será ativado.

Como comparar o desempenho do SSD local

Os valores de desempenho do SSD local fornecidos na seção "Desempenho" foram obtidos usando-se configurações específicas na instância do SSD local. Se a instância estiver enfrentando problemas para atingir esses limites de desempenho e você já tiver configurado a instância usando as configurações recomendadas de SSD local, compare os limites de desempenho com os limites publicados replicando as configurações usadas pela equipe do Compute Engine.

  1. Crie uma instância de SSD local que tenha quatro ou oito vCPUs para cada dispositivo, dependendo da carga de trabalho. Por exemplo, para anexar quatro dispositivos SSD locais a uma instância, use um tipo de máquina com 16 ou 32 vCPUs.

    O comando abaixo cria uma máquina virtual com 8 vCPUs e um único SSD local:

    gcloud compute instances create ssd-test-instance \
    --machine-type "n1-standard-8" \
    --local-ssd interface="SCSI"
    
  2. Execute o script a seguir na VM. Ele replica as configurações usadas para atingir os valores de desempenho do SSD fornecidos na seção "Desempenho". O parâmetro --bs define o tamanho do bloco, o que afeta os resultados para diferentes tipos de operações de leitura e gravação.

    # install dependencies
    sudo apt-get update -y
    sudo apt-get install -y build-essential git libtool gettext autoconf \
    libgconf2-dev libncurses5-dev python-dev fio bison autopoint
    
    # blkdiscard
    git clone https://git.kernel.org/pub/scm/utils/util-linux/util-linux.git
    cd util-linux/
    ./autogen.sh
    ./configure --disable-libblkid
    make
    sudo mv blkdiscard /usr/bin/
    sudo blkdiscard /dev/disk/by-id/google-local-ssd-0
    
    # full write pass - measures write bandwidth with 1M blocksize
    sudo fio --name=writefile --size=100G --filesize=100G \
    --filename=/dev/disk/by-id/google-local-ssd-0 --bs=1M --nrfiles=1 \
    --direct=1 --sync=0 --randrepeat=0 --rw=write --refill_buffers --end_fsync=1 \
    --iodepth=200 --ioengine=libaio
    
    # rand read - measures max read IOPS with 4k blocks
    sudo fio --time_based --name=benchmark --size=100G --runtime=30 \
    --filename=/dev/disk/by-id/google-local-ssd-0 --ioengine=libaio --randrepeat=0 \
    --iodepth=128 --direct=1 --invalidate=1 --verify=0 --verify_fatal=0 \
    --numjobs=4 --rw=randread --blocksize=4k --group_reporting
    
    # rand write - measures max write IOPS with 4k blocks
    sudo fio --time_based --name=benchmark --size=100G --runtime=30 \
    --filename=/dev/disk/by-id/google-local-ssd-0 --ioengine=libaio --randrepeat=0 \
    --iodepth=128 --direct=1 --invalidate=1 --verify=0 --verify_fatal=0 \
    --numjobs=4 --rw=randwrite --blocksize=4k --group_reporting
    

A seguir

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Documentação do Compute Engine