Se a sua instância do Elastic Compute Service (ECS) com Alibaba Cloud Linux 2 executar um sistema de arquivos Ext4 montado com as opções dioread_nolock e nodelalloc, o throughput de gravação de buffer I/O poderá ficar muito abaixo da performance nominal do block storage. Este tópico explica as configurações afetadas, a causa raiz e como corrigir o problema.
Verifique se a sua instância é afetada
A instância só será afetada se todas as três condições abaixo forem verdadeiras:
Versão da imagem: de
aliyun-2.1903-x64-20G-alibase-20190327.vhd(inclusiva) atéaliyun_2_1903_x64_20G_alibase_20220525.vhd(exclusiva).Versão do kernel: de
kernel-4.19.24-9.al7(inclusiva) atékernel-4.19.91-26.al7.x86_64(exclusiva). Executeuname -rpara verificar.Opções de montagem: o sistema de arquivos Ext4 está montado com
dioread_nolockenodelallocsimultaneamente.
As opçõesdioread_nolockenodelallocnão são padrões de montagem. Se você não as definiu explicitamente, provavelmente sua instância não é afetada.
Para confirmar as opções de montagem, execute os comandos a seguir:
-
Identifique a partição de disco que contém o diretório de gravação de destino. Substitua
<$DIR>pelo caminho do seu diretório de destino.df <$DIR> | grep -v Filesystem | awk '{ print $1 }' -
Verifique o tipo de sistema de arquivos e as opções de montagem dessa partição. Substitua
<$Partition>pelo nome da partição obtido na etapa anterior.mount | grep -w <$Partition> | grep ext4 | grep -w dioread_nolock | grep -w nodelallocSe o comando retornar alguma saída, sua instância é afetada.
Sintomas
Quando o problema ocorre, o throughput de gravação de buffer I/O cai significativamente — geralmente para cerca de 30 MB/s — ficando muito abaixo do desempenho do block storage esperado para a instância ECS.
A saída do comando iostat -xm 1 abaixo exemplifica o estado degradado (observe a coluna wMB/s):
avg-cpu: %user %nice %system %iowait %steal %idle
0.00 0.00 12.77 0.00 0.00 87.23
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
vdb 0.00 7194.00 0.00 57.00 0.00 28.05 1008.00 0.02 17.81 0.00 17.81 0.39 2.20
É possível reproduzir o problema com:
Cópia de arquivos grandes:
cp <$LargeFiles> /mnt/badfile(use arquivos maiores que 2 GiB para desencadear o problema)ddsem flags de sincronização:dd if=/dev/zero of=/mnt/badfile bs=10M count=1000
Causa raiz
Quando um sistema de arquivos Ext4 é montado com dioread_nolock e nodelalloc simultaneamente, o kernel gera uma grande quantidade de páginas sujas (dirty pages) de 4 KB chamadas unwritten extents. Um defeito na lógica de processamento do sistema de arquivos Ext4 impede a mesclagem dessas páginas em páginas gigantes (huge pages) antes do writeback. A função ext4_writepages passa então a processar cada página individualmente, consumindo tempo excessivo na busca e no mapeamento das páginas sujas de 4 KB, o que resulta em um throughput de gravação extremamente baixo.
Para observar esse comportamento, use a ferramenta perf para monitorar o processo de writeback do page cache do kernel.
Soluções
Há duas soluções disponíveis. A Solução 1 tem efeito imediato e não requer reinicialização.
Solução 1: Remontar o sistema de arquivos Ext4 sem as opções problemáticas
Esta solução entra em vigor imediatamente, sem necessidade de reiniciar a instância.
-
Remonte o sistema de arquivos Ext4 usando a opção
delalloc(padrão), removendodioread_nolockenodelalloc. Substitua os espaços reservados pelos valores reais.Espaço reservado
Descrição
Como encontrar
<$Device>Nome do dispositivo do sistema de arquivos Ext4
Consulte a coluna NAME na saída do comando
lsblk<$MountPoint>Ponto de montagem do sistema de arquivos Ext4
Use um diretório vazio existente ou crie um com
sudo mkdir -p <new-directory>sudo mount -o remount,delalloc <$Device> <$MountPoint> Torne a alteração persistente entre reinicializações removendo
nodelallocda entrada correspondente a este sistema de arquivos no arquivo/etc/fstab. Sem essa etapa, as opções de montagem voltarão paranodelallocapós uma reinicialização. A opção padrãodelallocnão precisa ser especificada explicitamente no/etc/fstab, pois sistemas de arquivos Ext4 já a utilizam por padrão.Verifique se o desempenho de gravação foi restaurado. Execute
iostat -xm 1e confirme se o valor dewMB/scorresponde ao desempenho do block storage esperado para sua instância ECS.
Solução 2: Atualizar o kernel
Esta solução corrige o defeito subjacente permanentemente, mas exige uma reinicialização.
Atualizações de kernel podem causar problemas de compatibilidade e estabilidade. Revise as notas de versão do Alibaba Cloud Linux 2 antes de prosseguir. Faça backup dos dados críticos da instância e agende a reinicialização para horários de menor movimento, pois ela interrompe temporariamente a instância e pode afetar serviços em execução.
-
Atualize para a versão mais recente do kernel.
sudo yum update kernel -
Reinicie a instância para que o novo kernel entre em vigor.
sudo reboot Após a reinicialização da instância, verifique se o desempenho de gravação foi restaurado. Execute
iostat -xm 1e confirme se o valor dewMB/scorresponde ao desempenho do block storage esperado para sua instância ECS.