Что означают поля «buff / cache» и «util mem» в верхней части?

28

В выводе top есть два поля, помеченных как «buff / cache» и «util Mem» в строках памяти и подкачки:

введите описание изображения здесь

Что означают эти два поля?

Я пробовал гуглить их, но результаты приводят только к общим статьям сверху, и они не объясняют, что означают эти поля.

user2064000
источник

Ответы:

31

top«S не страница руководства описывает поля, но free» s делает:

буферы

Память, используемая буферами ядра ( Buffersв /proc/meminfo)

кэш

Память, используемая страницей кеша и слябов ( Cachedи SReclaimableв /proc/meminfo)

бафф / кэш

Сумма буферов и кеша

имеется в наличии

Оценка того, сколько памяти доступно для запуска новых приложений, без подкачки. В отличии от данных , предоставляемых в кэше или свободных полей, это поле занимает в кэш учетной записи страницы , а также , что не все плиты памяти возмещению будет утилизированы из - за предметы , находящихся в эксплуатации ( MemAvailableв /proc/meminfo, доступны на ядрах 3.14, эмулировать на ядрах 2.6.27+ в остальном тоже самое что и бесплатно)

По сути, «buff / cache» подсчитывает память, используемую для данных, которые находятся на диске или должны скоро оказаться там, и в результате потенциально могут использоваться (соответствующая память может быть сделана доступной немедленно, в случае кеша или при наличии достаточного времени, в случае буферов - последние в любом случае должны оставаться небольшими); «Available» измеряет объем памяти, который может быть выделен и использован без дополнительной подкачки (см. Как я могу получить объем доступной памяти для разных распределений? Для более подробной информации).

Стивен Китт
источник
1
Буферы / кэш не доступны, если достаточно времени ; они являются сегментами памяти, которые доступны сразу, если какая-либо программа требует выделения памяти. Смотрите также linuxatemyram.com
DopeGhoti
4

Просто для пояснения, буферы ссылаются на записываемые данные - эта память не может быть восстановлена ​​до завершения записи.

Кэш относится к данным, которые были прочитаны - он хранится в случае необходимости повторного чтения, но может быть немедленно восстановлен, поскольку его всегда можно перечитать с диска.

WallStProg
источник
Это не совсем то, что это значит здесь. /proc/meminfoимеет поле для Writebackконкретно. Существует отдельное поле Buffers, и это то , что проявляется как buffersв free -w. Типичная причина Buffersиспользования памяти показана здесь: « 30% оперативной памяти составляют« буферы ». Что это? »
sourcejedi
Отсюда ( access.redhat.com/solutions/406773 ) я понимаю, что Writeback - это та часть буферов, которая еще не была записана на диск. Или ты говоришь что-то еще?
WallStProg
Это описание будет вводить в заблуждение. Buffersявляется (сейчас) частью кеша страниц; это не учитывается Cached, но считается частью Active(file) + Inactive(file). Смотрите комментарии к ответу Стивена Китта. Dirtyявляется частью кэша страниц, в которую была записана запись, и поэтому в конечном итоге необходимо выполнить обратную запись на диск. Writebackне включаетDirty . Следовательно, Writebackне является частью стоимости Buffers.
Sourcejedi
Что на Buffersсамом деле означает кеш страниц, связанный с блочным устройством. Некоторые файловые системы используют это внутренне; другие не используют его вообще. / исправляет мой ответ на вопрос «30% моей оперативной памяти - буферы».
Sourcejedi
2

Каноническим источником этой информации является /usr/src/linux/Documentation/filesystems/proc.txt

Буферы : Относительно временное хранилище для блоков сырых дисков не должно быть очень большим (20 МБ или около того). Кэширование : кэш в памяти для файлов, считываемых с диска (кэш страниц). Не включает SwapCached.

Вы также можете найти более подробную информацию здесь .

Linux Page Cache (« Cached :» от meminfo) является крупнейшим потребителем оперативной памяти на большинстве систем. Каждый раз, когда вы выполняете read () из файла на диске, эти данные считываются в память и помещаются в кеш страниц (1.).
Буферный кеш (" Buffers :" в meminfo) близок по отношению к кэшам dentry / inode.

Или анализ исходного кода, как это .

Количество buffersявляется возвращаемым значением функцииnr_blockdev_pages(void)

long nr_blockdev_pages(void)
{
        struct block_device *bdev;
        long ret = 0;
        spin_lock(&bdev_lock);
        list_for_each_entry(bdev, &all_bdevs, bd_list) {
                ret += bdev->bd_inode->i_mapping->nrpages;
        }
        spin_unlock(&bdev_lock);
        return ret;
}

Количество cached:

global_page_state(NR_FILE_PAGES) – total_swapcache_pages – i.bufferram
axiqia
источник