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.