Leituras sequenciais de disco de ajuste para desempenho

5

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:11

2 respostas

1

Você diz que deseja minimizar a leitura de IOPS e maximizar o tamanho de cada solicitação de IO. Eu suspeito que você não se beneficiaria disso. Normalmente, eu me importo em maximizar a taxa de transferência enquanto minimizo a latência e encontrar um bom equilíbrio desses dois para o aplicativo específico.

Observe que, quando você passou de um cabeçote de leitura de 128kB para um de leitura de 256kB, a taxa de transferência de leitura caiu de 103,88MB / s para 102,50MB / s. Eu não esperaria que essa tendência fosse revertida em um tamanho maior de leitura. A leitura mais alta também traz um risco de IO mais desperdiçado se os dados não forem puramente sequenciais, o que reduziria o desempenho de IO útil.

Se você estiver interessado, o limite de 512kB provavelmente vem de outra camada na pilha de armazenamento, como o driver SCSI, o firmware do controlador ou o barramento.

Para acelerar o IO, é possível ver o seguinte:

    
por 19.10.2016 / 07:45
0

Se você está lendo de um sistema de arquivos sobre um volume LVM, este parece ser o comportamento exectado. Eu também escrevi na lista de discussão do LVM , mas ninguém me respondeu.

Eu suspeito que o código LVM gerencia internamente blocos / pedidos de 512 KB no máximo, então aumentar o parâmetro max_sectors_kb sobre este limite não tem efeito.

    
por 23.10.2016 / 22:37