cp e cat no Centos 5.5 / ext3 é 10x mais lento para arquivos em certos diretórios

3

Eu estava classificando alguns arquivos grandes (91GB em 27 arquivos) com o GNU sort quando notei que iostat -dxk 3 mostrava velocidades de leitura muito lentas, entre 5 MB / se 10 MB / s, com 100% de utilização de disco. Eu tentei cat large-file > /dev/null e obtive desempenho similar, apenas um pouco mais alto. O mesmo para cp large-file /tmp/ , com /tmp em um disco separado. vim tem o mesmo, assim como os scripts que escrevo em arquivos de leitura do Ruby, se isso ajudar. A velocidade de gravação é boa e rápida.

EDIT: Parece que essas operações são lentas apenas em arquivos em um determinado diretório. As mesmas operações em outros arquivos em um diretório irmão (mesma partição de disco), acabam sendo rápidas, com velocidade de leitura acima de 90 MBPS. Isso não faz sentido para mim. Poderia ser possivelmente devido à maneira em que esses arquivos foram construídos? Eu os criei lendo muitos outros arquivos e escrevendo cada linha em um "arquivo de intervalo" apropriado, dependendo do primeiro caractere na linha (assim, a-z e um único arquivo para os outros). Então eu estava praticamente anexando linhas a 27 arquivos, um de cada vez, através de 8 processos, enquanto lia alguns milhares de arquivos. Isso poderia causar a ordem sequencial em que os blocos que representam um arquivo estivessem fora de ordem? Daí a leitura sequencial lenta depois?

No entanto, tentei usar fio para medir o desempenho de leitura sequencial e ele atingiu 73 MB / s. Também é notável que meu chefe obteve velocidades de leitura adequadas ao baixar alguns arquivos via FTP da mesma máquina.

Então, acho que isso é algum problema de configuração em algum lugar, mas não tenho ideia de onde. Qual poderia ser o motivo e como posso tentar corrigi-lo?

Editar: esta máquina está executando sob a virtualização do Citrix Xen.

Edit: Saída de iostat -dxk enquanto sort está carregando um arquivo grande em seu buffer (obtenha saída semelhante para cat / cp):

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb              0.00     0.00 1000.00  0.00  6138.61     0.00    12.28    24.66   24.10   0.99  99.41
xvdb1             0.00     0.00 1000.00  0.00  6138.61     0.00    12.28    24.66   24.10   0.99  99.41
xvda              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
xvda1             0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

Editar: Mais degradação do desempenho após algumas horas (com quebras para o disco quando sort estava sendo processado). Quase parece um IO aleatório, mas há apenas uma única operação de classificação acontecendo, sem nenhum outro processo fazendo qualquer IO, portanto, as leituras devem ser sequenciais = /:

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb              0.00     0.00 638.00  0.00  2966.67     0.00     9.30    25.89   40.62   1.57 100.00

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb              0.33     0.00 574.67  0.00  2613.33     0.00     9.10    27.82   47.55   1.74 100.00 

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb              0.00     0.00 444.33  0.00  1801.33     0.00     8.11    28.41   65.27   2.25 100.00
    
por ehsanul 20.11.2010 / 23:42

2 respostas

3

Seus arquivos lentos são altamente fragmentados? Execute /usr/sbin/filefrag -v filename para descobrir. Você terá uma saída como:

Checking big.file
Filesystem type is: ef53
Filesystem cylinder groups is approximately 4272
Blocksize of file big.file is 4096
File size of big.file is 96780584 (23629 blocks)
First block: 88179714
Last block: 88261773
Discontinuity: Block 6 is at 88179742 (was 88179719)
Discontinuity: Block 12233 is at 88192008 (was 88191981)
Discontinuity: Block 17132 is at 88197127 (was 88196911)
Discontinuity: Block 17133 is at 88255271 (was 88197127)
big.file: 5 extents found, perfection would be 1 extent

ou talvez muito pior.

Você menciona que o sistema está sendo executado em virtualização. Este acesso é feito com um arquivo de imagem de disco virtual?

    
por 20.11.2010 / 23:38
0

Soo, eu acredito que este é um caso simples de RAM não é suficiente ...

Para começar, ao ler / escrever um arquivo menor do que a sua RAM (tudo é rápido - como o teste "fio".)

Uma vez que você comece a trabalhar com dados maiores que o seu sistema operacional pode armazenar em cache, o cache do seu sistema operacional começa a trocar (às vezes até ao disco) (na verdade você deve verificar o uso do seu RAM quando tiver velocidade de leitura de 4mb)

Soa como algo que eu experimentei antes, você está ficando lento para ler um arquivo tão grande ... (Eu vi um DB fazer exatamente o mesmo quando ele estava usando grandes índices que não cabiam na RAM)

Dado também a sobrecarga de trabalhar em uma VM (isso soa muito típico para mim)

Eu verifico que seus discos não estão trocando ou sua memória ativa não está cheia (e me avise): D

    
por 20.11.2010 / 06:33