Por que o comando ls é lento para interromper no diretório NFS com muitos arquivos?

3

Eu notei em diretórios com muitos arquivos no NFS, se eu fizer

ls *

em seguida, pressione Ctrl-C. Pode demorar um pouco (por exemplo, 20 segundos) antes de voltar.

Por quê? O comando ls pode ser corrigido para ser mais responsivo?

    
por steve 07.08.2014 / 17:01

4 respostas

5

Quando você executa ls * , a primeira coisa que acontece é que o shell obtém uma listagem do diretório atual. Se o diretório for enorme e o servidor estiver lento, isso pode demorar um pouco.

Quando o shell obtiver a lista de nomes de arquivos no diretório atual, ele classificará essa lista (que é muito rápida comparada a qualquer interação de rede) e, em seguida, chamará ls . O comando ls pesquisa cada arquivo e recupera seus metadados ( stat call) para verificar se é um diretório; se um arquivo é um diretório, ls lista seu conteúdo em vez do próprio diretório.

Quando você pressionar Ctrl + C , isso não interromperá a operação atual do NFS. Você não pode interromper uma operação do sistema de arquivos em qualquer lugar, pois isso pode deixar o sistema em um estado inconsistente. Mesmo lendo um arquivo pode atualizar seu tempo de acesso. Na maioria das vezes, uma operação elementar de leitura ou gravação em um arquivo é instantânea por padrões humanos, mas o NFS é uma exceção, especialmente com grandes quantidades de dados em uma rede lenta.

Assim, pressionar Ctrl + C só terá efeito:

  • se o shell estiver gerando atualmente a lista de nomes de arquivos, quando essa lista for totalmente recuperada;
  • se ls tiver sido iniciado e estiver atualmente obtendo metadados sobre um arquivo, quando o servidor fornecer os metadados;
  • se ls tiver sido iniciado e estiver listando atualmente um diretório, quando a lista for totalmente recuperada ou, pelo menos, após uma parte dela.

Não é culpa do comando ls (que pode nem ter sido iniciado ainda). Nem é culpa da shell: é culpa do NFS. O NFS é bem lento.

    
por 08.08.2014 / 03:42
4

Hipótese: percorrer um diretório através do NFS é carregar especulativamente mais dados do que você esperaria de uma só vez. Muito IO no lado do servidor, fazendo com que uma única chamada NFS tomasse > 20s. A montagem com a opção intr pode permitir que o Ctrl-C interrompa a chamada em andamento.

O Google encontrou uma lista de chamadas NFS que inclui o READDIRPLUS. Basicamente readdir + então stat para cada arquivo. Também getacl. Em outras palavras, há uma chamada NFS que basicamente faz ls -l (para um determinado número de arquivos). Em vez de enviar solicitações de estatísticas individuais para cada arquivo.

Pesquisando o nfs readdirplus - isso parece bastante plausível. O primeiro resultado é um relatório de bug (paywalled).

RHEL6: NFSv3 READDIRPLUS drastically slows down globbing over a NFS directory leading to performance problems

  • RHEL 6.2 with a standard mount, a glob in a directory containing over 3000 directories takes 218 seconds (nearly four minutes).
  • A mount of the same directory using the nordirplus option to disable the use of readdirplus calls, a glob on the same directory takes only 1.7 seconds

de modo que parece uma linha interessante de investigação.

EDIT: note que o seu exemplo ls * é também um uso de globbing. ls . evitaria o glob. Se isso fizer diferença na sua pergunta específica, pode ser porque a globulação ocorre no shell, em vez de ls, o que pode afetar como o Ctrl-C é processado. Eu duvido que isso importe, mas pareceu-me uma questão interessante.

    
por 07.08.2014 / 17:14
0

Pode haver várias razões para o comando ls ser lento no diretório NFS.

  • O diretório pode não estar montado automaticamente.
  • As máquinas podem não estar na mesma rede.

No entanto, esta é uma ideia mais geral do que específica para NFS . Para listar os arquivos sem classificação, Você pode tentar ls -U , que lista os arquivos sem classificação. De man page de ls ,

-U do not sort; list entries in directory order. In combination with one_per_line format ‘-1’, it will show files immediately and it has no memory limitations.

Existem várias variações para evitar a classificação. Você pode verificar a página de manual do seu sistema e tentar qualquer uma das opções abaixo.

ls -f
ls -U
ls --sort=none
    
por 07.08.2014 / 17:05
0

Se você tiver um alias para ls também pode causar lentidão, tente \ ls mesmo \ ls -altr OU qualquer outra opção do ls.

    
por 29.08.2017 / 11:39