
Как многие заявляли на StackExchange и в других местах, типичный размер страницы ядра/mmu для Linux составляет 4 КБ. Я проверил, что это так на моей ОС/архитектуре (RHEL 6.6, Intel Xeon E5-2690).
Теперь, среди прочего, vmstat -s
команда сообщает о "pages in" и "pages out", которые являются счетчиками, которые начинаются с 0 во время загрузки. Я подтвердил, что в любой момент эти значения точно равны значениям, найденным для записей pgpgin
и pgpgout
в/proc/vmstat
(команда vmstat получает их из /proc/vmstat
?). Другие команды, в частности, sar -B
сообщают pgpgin/s
и pgpgout/s
как Кибибайты, загруженные/выгруженные в секунду в течение определенного интервала.
В недавних тестах я увидел, что pgpgin/s
и pgpgout/s
значения из sar также точно соответствуют скорости, рассчитанной из значений vmstat для указанного интервала. Это приводит меня к выводу, что vmstat сообщает значения для страниц размером 1 КиБ. Таким образом, pgpgin/out
значения/proc/vmstat
количество КиБ, загруженных/выгруженных с момента загрузки.
У меня есть вопросы:
- Является ли это обоснованным выводом, и
- Если так, почему vmstat и другие службы выдают отчеты на страницах по 1 КиБ вместо страниц по 4 КиБ, которые являются «общей валютой» ОС и архитектуры? В частности, vmstat говорит «
pages paged in/out
», а не «KiBs paged in/out
». Это сбивает с толку.
решение1
Что касается счетчиков, то /proc/vmstat
функция, которая, по-видимому, обновляет эти значения, находится submit_bio
в 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
это макрос вLinux/include/linux/bio.h
64 #define bio_sectors(bio) ((bio)->bi_iter.bi_size >> 9)
Это, как мне кажется, предполагает, что числа подсчитываются в размерах сектора (512) байт. Учитывая, какое значение вы получите в итоге, если сдвинете вправо количество байт на девять.
В любом случае, похоже, что это схожая настройка для ядер 2.6.27 - 4.0.x.