Como determinar quantos arquivos estão dentro de um diretório sem contar?

3

Tenho tido um problema bastante sério em um servidor da web de alto tráfego. As páginas do PHP estão diminuindo consideravelmente, e parece ser apenas um problema nas páginas onde as sessões são acessadas, ou uma determinada tabela dentro de um banco de dados está sendo referenciada. o arquivo de log '/ var / log / messages', vejo centenas de milhares do seguinte erro: 'kernel: aviso de EXT4-fs (device dm-0): ext4_dx_add_entry: Índice do diretório cheio!'

Eu suspeito que há um gargalo em '/ var / lib / php / sessions' porque não consigo abrir a pasta no Filezilla e não posso contar o número de arquivos / subdiretórios com o grep. Embora seja possivelmente um caso de corrupção do disco rígido, eu gostaria de verificar primeiro um meu primeiro, verificando o número de arquivos dentro desse diretório.

Como você iria encontrar o número de arquivos dentro de uma pasta sem realmente contar os arquivos na pasta?

    
por Pangamma 15.08.2013 / 19:15

3 respostas

3

O tamanho do diretório (como visto em ls -ld /var/lib/php/sessions ) pode dar uma indicação. Se é pequeno, não há muitos arquivos. Se for grande, pode haver muitas entradas, ou pode ter havido muitas no passado.

Listar o conteúdo, contanto que você não stat arquivos individuais, não demore muito mais do que ler um arquivo do mesmo tamanho.

O que pode acontecer é que você tem um alias para ls que usa ls -F ou ls --color . Essas opções fazem com que uma chamada de sistema lstat seja executada em todos os arquivos, por exemplo, se forem um arquivo ou diretório.

Você também desejará certificar-se de listar os arquivos de ponto e deixar a lista de arquivos sem classificação. Para isso, execute:

command ls -f /var/lib/php/sessions | wc -l

Desde que não haja muitos nomes de arquivos com caracteres de nova linha, isso deve lhe dar uma boa estimativa.

$ ls -lhd 1
drwxr-xr-x 2 chazelas chazelas 69M Aug 15 20:02 1/
$ time ls -f 1 | wc -l
3218992
ls -f 1  0.68s user 1.20s system 99% cpu 1.881 total
wc -l  0.00s user 0.18s system 9% cpu 1.880 total
$ time ls -F 1 | wc -l
<still running...>

Você também pode deduzir o número de arquivos, subtraindo o número de arquivos exclusivos em outro lugar no sistema de arquivos do número de inodes usados na saída de df -i .

Por exemplo, se o sistema de arquivos estiver montado em /var , com GNU find :

find /var -xdev -path /var/lib/php/sessions -prune -o \
  -printf '%i\n' | sort -u | wc -l

Para encontrar o número de arquivos que não estão em / var / lib / php / sessions. Se você subtrair esse valor ao campo IUsed na saída de df -i /var , obterá uma aproximação (porque alguns inodes especiais não estão vinculados a nenhum diretório em um sistema de arquivos ext típico) do número de arquivos vinculados a /var/lib/php/sessions que não estão ligados em outro lugar (note que / var / lib / php / sessions poderia muito bem conter um bilhão de entradas para o mesmo arquivo (na verdade, o número máximo de links em um arquivo será muito menor do que na maioria dos sistemas de arquivos), de modo que o método não é à prova de erros.

Observe que, se a leitura do conteúdo do diretório deve ser relativamente rápida, a remoção de arquivos pode ser dolorosamente lenta.

rm -r , ao remover arquivos, primeiro lista o conteúdo do diretório e, em seguida, chama unlink() para cada arquivo. E para cada arquivo, o sistema precisa procurar o arquivo nesse diretório enorme, o que, se não for fragmentado, pode ser muito caro.

    
por 15.08.2013 / 21:08
1

Eu acho que você poderia usar ls -1 /var/lib/php/sessions | wc -l sobre SSH

Observe que é ls -(one) e ws -(letter l)

    
por 15.08.2013 / 19:29
1

No ext2 / 3/4 você pode fazer alguma aproximação com base no tamanho do próprio diretório. Isso não é muito preciso, mas permite uma suposição instruída sem "contar".

Um diretório começa em 4096 bytes por padrão. À medida que recebe mais entradas, aumenta de tamanho (mas nunca encolherá novamente). Após alguns testes, parece que cada entrada leva 12 bytes e cresce em 4096 quando atinge o limite. Isso significa que, se o tamanho atual do diretório for 16384, você terá entre 1.024 e 1.365 entradas de uma só vez.

Há também um truque para visualizar arquivos nesses diretórios imediatamente. Quando você executa ls , o diretório inteiro é lido e, em seguida, classificado. Você pode desativar a classificação usando ls -1U .

    
por 15.08.2013 / 20:08