Operações de Metadados, como ls -l, du ou find, estão Lentas

Quando um diretório excede 100.000 arquivos, as operações de metadados, como ls -l, du ou find são lentas.

Geralmente, espera-se que ls -l em um diretório do serviço File Storage com 100.000 arquivos seja concluído em <= 10 segundos. O tamanho do diretório não afeta significativamente o throughput de gravação do serviço File Storage. Se você ver lentidão na leitura/gravação, certifique-se de que não esteja usando as opções de montagem NFS rsize e wsize com um valor menor que 1048576. Como uma das melhores práticas, não especifique as opções de montagem rsize e wsize, deixe-as com o valor padrão 1048576.

Causa: As operações de verificação de diretório como ls, du, find e rsync em um diretório contendo 100.000 arquivos levam mais tempo no serviço File Storage.

Soluções:

  1. Redistribua arquivos para subdiretórios em vez de armazenar um grande volume de arquivos em um único diretório. Recomendamos o uso de subdiretórios para manter os tamanhos dos diretórios abaixo de 100.000 arquivos.

    Dica

    Manter os tamanhos dos diretórios pequenos usando subdiretórios é uma das melhores práticas para o serviço File Storage.
  2. Use ls -ld ou stat em vez de ls -l. Essas operações são muito mais rápidas em diretórios grandes do que em ls -l.

    Por exemplo:

    [opc@instance01 dd]$ time ls -l|wc -l
    401425
    real 0m39.786s
    user 0m4.389s
    sys 0m5.403s
    [opc@instance01 dd]$ time ls -ld
    drwxrwxr-x. 4 opc opc 401424 Apr 17 14:18 .
    real 0m0.009s
    user 0m0.001s
    sys 0m0.003s
    [opc@instance01 dd]$ time stat .|grep Size
      Size: 401424     Blocks: 785        IO Block: 32768  directory
    real 0m0.010s
    user 0m0.002s
    sys 0m0.003s
    [opc@instance01 dd]$
  3. Às vezes, um problema no cliente NFS pode fazer com que as operações de verificação de diretório entrem em um loop e levem a um aumento no tempo de verificação. Esse problema afetou as seguintes versões do Oracle Linux:

    • Oracle Linux 6
    • Oracle Linux 7 com versões UEK (Unbreakable Enterprise Kernel) anteriores a 4.14.35-1902.301.1

    Se você usar o Oracle Linux 6, faça upgrade para o Oracle Linux 7 ou mais recente. A versão mais recente é recomendada.

    Os usuários do Oracle Linux 7 podem executar o comando uname -a para verificar a versão do UEK. Se a versão UEK for anterior à 4.14.35-1902.301.1, faça upgrade para uma versão posterior do kernel. O patch que trata desse comportamento foi disponibilizado em 17 de abril de 2020 e pode ser instalado com o Oracle Ksplice.

    O Oracle Ksplice permite que você aplique atualizações de segurança importante e outras atualizações críticas do kernel sem uma reinicialização. O Oracle Ksplice deve estar instalado na instância. Depois de instalar o Ksplice, você pode instalar os patches disponíveis do Ksplice. Consulte Oracle Ksplice para obter mais informações.

    Depois de instalar o patch, você pode verificar a versão efetiva do kernel. O Ksplice uptrack não altera a saída do comando uname. O comando uname continua refletindo a versão do kernel em que a instância foi inicializada.

    Em vez disso, use o uptrack-uname para ver o kernel efetivo que uma instância está executando. O comando uptrack-uname tem o mesmo formato que o uname e suporta os flags uname comuns, incluindo -r e -a.

    Por exemplo: 

    $ uptrack-uname -r
    4.14.35-1902.302.2.el7uek.x86_64
  4. As operações de varredura de diretório invocam a chamada NFS READDIRPLUS, que é cara quando o diretório contém muitos arquivos. As instâncias podem desativar chamadas READDIRPLUS usando a opção nordirplus durante a montagem. Para desativar as operações NFS READDIRPLUS na instância:

    1. Abra uma janela de terminal na instância.
    2. Desmonte o sistema de arquivos com o comando umount . Por exemplo:

      sudo umount 10.x.x.x:/fs-export-path /mnt/yourmountpoint
    3. Remova o sistema de arquivos e inclua a opção -o nordirplus para desativar READDIRPLUS. Por exemplo:

      sudo mount -o nordirplus 10.x.x.x:/fs-export-path /mnt/yourmountpoint