
Como muitos afirmaram no StackExchange e em outros lugares, um tamanho típico de página kernel/mmu para Linux é 4 KiB. Verifiquei que este é o caso do meu sistema operacional/arquitetura (RHEL 6.6, Intel Xeon E5-2690).
Agora, entre outras coisas, o vmstat -s
comando informa sobre "páginas paginadas" e "páginas paginadas", que são contadores que começam em 0 no momento da inicialização. Confirmei que, em qualquer momento, esses valores são exatamente iguais aos valores encontrados para as entradas pgpgin
e empgpgout
/proc/vmstat
(o comando vmstat os obtém /proc/vmstat
?). Outros comandos e, em particular, sar -B
relatórios pgpgin/s
e pgpgout/s
como Kibibytes paginados de entrada/saída por segundo durante um intervalo específico.
Em testes recentes, vi que pgpgin/s
os pgpgout/s
valores de sar também correspondem exatamente a uma taxa calculada a partir dos valores vmstat para um intervalo especificado. Isso me leva a concluir que o vmstat está relatando valores para páginas de 1 KiB de tamanho. Assim os pgpgin/out
valores de/proc/vmstat
são o número de KiB paginados de entrada/saída desde a inicialização.
Minhas perguntas são:
- Esta é uma conclusão válida e
- Em caso afirmativo, por que o vmstat e outros recursos relatam páginas de 1 KiB em vez de páginas de 4 KiB que são a "moeda comum" do sistema operacional e da arquitetura? Em particular, vmstat está dizendo "
pages paged in/out
", não "KiBs paged in/out
". Isso é confuso.
Responder1
Em relação aos contadores /proc/vmstat
a função que aparece para atualizar esses valores está submit_bio
em Linux/block/blk-core.c
.
2067 blk_qc_t submit_bio(struct bio *bio)
2068 {
...
2079 count = bio_sectors(bio);
2080
2081 if (op_is_write(bio_op(bio))) {
2082 count_vm_events(PGPGOUT, count);
2083 } else {
2084 task_io_account_read(bio->bi_iter.bi_size);
2085 count_vm_events(PGPGIN, count);
2086 }
...
2100 }
2101 EXPORT_SYMBOL(submit_bio);
bio_sectors
é uma macro emLinux/include/linux/bio.h
64 #define bio_sectors(bio) ((bio)->bi_iter.bi_size >> 9)
Isto parece sugerir-me que os números são contados em tamanhos de setor (512) bytes. Dado que esse é o valor que você obteria se mudasse a contagem de bytes para nove.
De qualquer forma, esta parece ser uma configuração semelhante entre os kernels 2.6.27 - 4.0.x.