Leituras sequenciais de disco de ajuste para desempenho

3

Estou lendo um arquivo grande sequencialmente do disco e tentando entender a saída do iostat enquanto a leitura está ocorrendo.

  • Tamanho do arquivo: 10 GB
  • Buffer de leitura: 4 KB
  • Leia adiante (/ sys / block / sda / queue / read_ahead_kb): 128 KB

A saída do iostat é a seguinte

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz await r_await w_await  svctm  %util
sda               0.00     0.00  833.00   14.00   103.88     0.05   251.30     6.07    5.69    2.33 205.71  1.18 100.00

A computação do tamanho médio de uma solicitação de E / S = (rMB / s dividido por r / s) fornece ~ 128 KB, que é o valor de leitura antecipada. Isso parece indicar que, embora a chamada do sistema de leitura tenha especificado um buffer de 4KB, a E / S do disco real está acontecendo de acordo com o valor de leitura antecipada.

Quando eu aumentei o valor de leitura para 256KB, a saída do iostat foi a seguinte

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00    28.00  412.00   12.00   102.50     0.05   495.32    10.78   12.15    4.76  265.83   2.36 100.00

Novamente, o tamanho médio da solicitação de E / S foi de 256 KB correspondendo à leitura anterior.

Isso continuou até eu definir 512 KB como valor de leitura antecipada e não resisti quando subi para um valor de leitura antecipada de 1024 KB - o tamanho médio da solicitação de E / S ainda era de 512 KB. O aumento de max_sectors_kb (quantidade máxima de dados por solicitação de E / S) do padrão de 512 KB para 1024 KB também não ajudou aqui.

Por que isso está acontecendo? Idealmente, gostaria de minimizar o máximo possível a leitura de IOPS e ler uma quantidade maior de dados por solicitação de E / S (maior que 512 KB por solicitação). Além disso, estou atingindo 100% de utilização de disco em todos os casos - eu gostaria de me limitar a ler a 50-60% de utilização de disco com uma boa taxa de transferência seqüencial. Em resumo, quais são as configurações otimizadas do aplicativo / kernel para E / S de leitura sequencial.

    
por Stormshadow 19.10.2016 / 04:09

1 resposta

0

Você provavelmente está limitado pela configuração max_sectors_kb de /dev/sda .

cat /sys/block/sda/queue/max_sectors_kb

quase certamente retorna 512.

Você deve poder alterá-lo para 1024 com algo como:

echo 1024 > /sys/block/sda/queue/max_sectors_kb

Supondo que você não encontre outro limite, isso deve aumentar o tamanho do IO para 1024 KB.

    
por 20.10.2016 / 14:20