Eu não olhei para o código-fonte, mas parece que a diferença decorre de dois modos de contabilidade diferentes.
Os campos # 4 e # 8 somam o tempo que cada um solicita para concluir. Isso significa que as solicitações emitidas paralelamente ainda contribuem para aumentar a contagem.
O campo nº 10 conta apenas o tempo real em que a fila e os discos estavam ocupados, por isso eles contam solicitações feitas em paralelo como uma única.
Deixe-me fazer um exemplo prático. Em /boot
partition, eu dd
a ~ 4 MB. Dê uma olhada nas estatísticas:
[root@localhost boot]# cat /proc/diskstats | grep sda1
8 1 sda1 46256 0 255703 19332 2063 0 4162 538 0 11207 19862
[root@localhost boot]# dd if=initramfs-0-rescue-7dc32e3935ba4ce1ae50a0a8170e4480.img of=/dev/null
84099+1 records in
84099+1 records out
43058701 bytes (43 MB) copied, 0.347783 s, 124 MB/s
[root@localhost boot]# cat /proc/diskstats | grep sda1
8 1 sda1 46342 0 339807 23011 2063 0 4162 538 0 11551 23540
[root@localhost boot]#
A leitura do arquivo exigiu ~ 0.35s ou ~ 350ms. No entanto, o contador # 4 e # 10 reagem de maneira muito diferente: o primeiro aumento em cerca de 4000, enquanto o segundo apenas em cerca de 350. É fácil ver qual tem o valor "correto": é o campo # 10, como sabemos dd
que toda a operação demorou cerca de 350ms e o campo # 10 aumentou este mesmo valor.
Então, por que o campo nº 4 aumentou tanto e o que ele realmente mede?
Primeiro, vamos entender o que está acontecendo no nível da solicitação. dd
usa, por padrão, 512B solicitações, mas o pagecache linux funciona com uma granularidade de 4KB, portanto, devemos esperar cerca de 1000 x 4KB solicitações. Esses 1000 pedidos são colocados em uma fila e emitidos, um por um (para simplificar, vamos fingir que o NCQ não existe) e enviados para o disco. Como os discos mecânicos são muito bons em leituras seqüenciais, eles geralmente usam uma política de leitura antecipada - isto é, lêem mais dados do que o necessário. Isso significa que, após a conclusão da primeira solicitação 4K, todas as outras solicitações subsequentes serão atendidas em um tempo muito curto.
Vamos fazer algumas contas, com a semplificação selvagem:
- número de solicitações: 1000 (todas as solicitações entram na fila ao mesmo tempo)
- tempo para a primeira solicitação ser concluída: 4ms
- tempo para que todas solicitações subsequentes sejam concluídas: 0ms (sim, eu disse a você que essa é uma semplificação selvagem )
Total de solicitações de tempo como medida por campo # 4: 1000 solicitações na fila * 4 ms cada == 4000 ms. E isso é aproximadamente o valor pelo qual o campo # 4 aumentou ...
Resumindo:
- os campos # 4 e # 8 medem o tempo gasto para atender às solicitações de E / S do ponto de vista de uma única solicitação, multiplicando isso pelo número de solicitações
- campo # 10 informa o tempo real decorrido ("relógio de parede") usado no caminho de E / S
Para desenhar um paralelismo apro- vativo: pense no CPU multi-core. Dois processos podem martelar simultaneamente a CPU, executando por 60s cada. O tempo total de CPU usado é de 120s (60s * 2), mas o tempo decorrido real permanece no total de 60s, já que os dois processos são executados simultaneamente.