Copiando causa iowait grande

1

Eu tenho servidor dedicado com 3 discos rígidos. Disco do sistema, disco de backup (igual ao disco do sistema) e disco de dados. Quando copio muitos dados com o cp (digamos, entre o disco de backup e o disco de dados), a média de carregamento fica muito alta.

Por exemplo, a média de carga no momento é de cerca de 0,57, quando a cópia de dados pode ir além de 50 ou mais.

Copiar com rsync and with --bwlimit=10000 não tem problema. Valores mais altos causam alta carga.

O sistema de arquivos é ext3.

sda - disco do sistema:

% hdparm -Tt /dev/sda

/dev/sda:
 Timing cached reads:   13444 MB in  2.00 seconds = 6730.82 MB/sec
 Timing buffered disk reads:  232 MB in  3.02 seconds =  76.73 MB/sec

sdb - disco de dados:

% hdparm -Tt /dev/sdb

/dev/sdb:
 Timing cached reads:   13740 MB in  2.00 seconds = 6879.30 MB/sec
 Timing buffered disk reads:  430 MB in  3.00 seconds = 143.10 MB/sec

sdc - disco de backup:

% hdparm -Tt /dev/sdc

/dev/sdc:
 Timing cached reads:   13796 MB in  2.00 seconds = 6907.75 MB/sec
 Timing buffered disk reads:  336 MB in  3.01 seconds = 111.45 MB/sec

iostat -x 1 (quando não está copiando): link

iostat -x 1 (ao copiar: sdc > sdb): link

% cat /sys/block/sda/queue/scheduler
noop anticipatory deadline [cfq]

Outros dois discos são "deadline" agora, mas eram "cfq" também. Apenas tentei ver se haveria alguma diferença. Não há.

Quaisquer operações mais intensivas em disco estão matando o servidor. Se algum processo usa mais memória e há necessidade de troca, a carga é muito alta. Às vezes eu tenho que matar algum serviço para que a carga caia. Houve momentos em que a carga foi para 500 por causa da troca.

O servidor tem 4 GB de RAM e o Xeon X3220 a 2.40 GHz. Eu posso aceitar um desempenho ruim quando não há RAM suficiente, mas apenas copiar não deve matar o servidor. Isso simplesmente não parece certo.

Alguma ideia do que poderia ser o problema? O que mais devo verificar? Poderia ser um controlador ruim da placa-mãe?

Adicionado:

% fdisk -l

Disk /dev/sda: 500.1 GB, 500107862016 bytes
 255 heads, 63 sectors/track, 60801 cylinders
 Units = cylinders of 16065 * 512 = 8225280 bytes

    Device Boot      Start         End      Blocks   Id  System
 /dev/sda1   *           1          13      104391   83  Linux
 /dev/sda2              14        1318    10482412+  83  Linux
 /dev/sda3            1319        2623    10482412+  83  Linux
 /dev/sda4            2624       60801   467314785    5  Extended
 /dev/sda5            2624        3928    10482381   83  Linux
 /dev/sda6            3929        4189     2096451   82  Linux swap / Solaris
 /dev/sda7            4190       60670   453683601   83  Linux
 /dev/sda8           60671       60801     1052226   83  Linux

 Disk /dev/sdb: 2000.3 GB, 2000398934016 bytes 
 255 heads, 63 sectors/track, 243201 cylinders
 Units = cylinders of 16065 * 512 = 8225280 bytes

    Device Boot      Start         End      Blocks   Id  System
 /dev/sdb1               1      243201  1953512001   83  Linux

 Disk /dev/sdc: 500.1 GB, 500107862016 bytes
 255 heads, 63 sectors/track, 60801 cylinders
 Units = cylinders of 16065 * 512 = 8225280 bytes

    Device Boot      Start         End      Blocks   Id  System
 /dev/sdc1   *           1       60801   488384001   83  Linux

% cat / proc / scsi / scsi

 Attached devices:
 Host: scsi0 Channel: 00 Id: 00 Lun: 00
   Vendor: ATA      Model: WDC WD5002ABYS-0 Rev: 02.0
   Type:   Direct-Access                    ANSI SCSI revision: 05
 Host: scsi0 Channel: 00 Id: 01 Lun: 00
   Vendor: ATA      Model: WDC WD2003FYYS-0 Rev: 01.0
   Type:   Direct-Access                    ANSI SCSI revision: 05
 Host: scsi1 Channel: 00 Id: 00 Lun: 00
   Vendor: ATA      Model: WDC WD5002ABYS-0 Rev: 02.0
   Type:   Direct-Access                    ANSI SCSI revision: 05
    
por Vald 08.02.2013 / 11:24

1 resposta

1

Acho que você está no mesmo caso do que eu em Gerar muitas páginas sujas está bloqueando gravações síncronas

kjournald among top processes.

você está usando um sistema de arquivos de registro no diário como o ext3 que aparentemente está fazendo com que gravações síncronas bloqueiem.

Você pode tentar

Reduzindo a quantidade de memória suja que um processo pode criar:

echo 100000000 > /proc/sys/vm/dirty_background_bytes
echo 200000000 > /proc/sys/vm/dirty_bytes 

O processo que faz a cópia não será capaz de escrever muito de uma só vez. Ele irá escrever um pedaço de dados e, em seguida, garantir que esses dados sejam liberados para o disco antes de gravar a próxima parte. Isso garantirá que o encadeamento de registro no diário não tenha muito com o que trabalhar e ainda possa trabalhar com solicitações de outros processos enquanto a cópia estiver ocorrendo.

Outra coisa que você pode tentar é fazer a cópia com o dd e garantir que você está escrevendo de forma síncrona:

dd if=foo of=bar bs=4096 oflag=sync

Isso também garantirá que os blocos sejam escritos pouco a pouco.

Além disso, se corresponder ao seu caso de uso, você poderá remover o registro no diário da sua pasta de destino, se entender o risco. Você pode remontar seu sistema de arquivos (eu suponho ext3?) Com a opção

data=writeback

Estas são as coisas que eu tentei com o meu sistema. Esta questão foi aberta há 2 anos, você encontrou uma solução nesse meio tempo?

    
por 10.12.2015 / 11:00