
Эти вопросыКратко перечислите формат команды free, отметив, что буферы — это память ядра, которая должна быть записана на диск, а кэш — это данные файла, которые не нужно записывать на диск.
В моей системе, в отличие от большинства случаев, когда я работал бесплатно, буферы занимают более 10% оперативной памяти. Обычно буферы имеют небольшое, почти символическое значение.
Мой вопрос: что именно находится в области, называемой буферами? Могу ли я поискать ее с помощью lsof
? Состоит ли она из открытых областей файлов, которые не были очищены? Это области файлов, отображенные в памяти? Что это?
Система работает хорошо, и объем подкачки используется мало, поэтому производительность хорошая.
решение1
free
извлекает свои данные из/proc/meminfo
slkwr133701:/usr/src/linux # free
total used free shared buffers cached
Mem: 2053456 434572 1618884 0 77888 201820
slkwr133701:/usr/src/linux # cat /proc/meminfo
MemTotal: 2053456 kB
MemFree: 1618736 kB
Buffers: 77928 kB
....
Это относится к памяти, используемой для временного хранения блочного ввода-вывода. Ядро должно постоянно назначать и освобождать блоки одного и того же размера, такие как передачи блочного ввода-вывода, сетевые пакеты и буферы сокетов
Вы можете лучше рассмотреть кэши и распределение буферов, запустивslabtop
В ответ на ваш вопрос об использовании: система обычно выделяет больше блоков, чем ей необходимо, но по мере увеличения «давления на память» эти дополнительные блоки будут освобождены.
решение2
"буферы" могут быть восстановлены при нехватке памяти. Так что это похоже на кэш страницы (столбец "cache"); не является большой причиной для беспокойства. Значение "буферов" может быть маленьким или большим, это зависит от того, что делает ваша система :-). Мы можем найти несколько типов кэша, подсчитанных здесь.
Буферный кэш — это буквально кэш страниц для блочного устройства. Linux просто сообщает о них отдельно.[*] Вы можете заметить использование «буферов», когда программы читают/записывают узел блочного устройства, например dd status=progress if=/dev/sda of=/dev/null
. По-видимому, люди также замечают это при запуске программы DVD-плеера.
Доказательства см. здесь:30% оперативной памяти — это «буферы». Что это?
Если вы не обращались к узлу блочного устройства, ваши «буферы», вероятно, все находятся в файловой системе.метаданные. Файловые системы используют буферный кэш внутренне для удобства. Они гарантируют, что файл никогда не будет дублироватьсяданные- содержимое файла - которое хранится в кэше главной страницы. То, для чего именно файловая система использует кэш буфера - если вообще использует - зависит от файловой системы.
На машине с небольшим объемом физической оперативной памяти я заметил, что "буферы" могут выглядеть высокими, когда у меня файловые системы ext3/ext4. Это потому, что записи в журнал проходят через буферный кэш. (См. ссылку выше). Файловые системы ext3/4 также хранят содержимое каталогов в буферном кэше.
Во-вторых, «буферы», отображаемые командой, free
также включают SReclaimable, то есть плиты, подлежащие восстановлению. (Показано здесь:Правильный способ мониторинга памяти Linux, еще раз).
Память плиты - этонетчасть кэша страницы/буфера. Однако удобно считать их вместе. Они оба являются восстанавливаемыми, и основное (единственное?) использование восстанавливаемых слябов — кэширование файловой системы. Например, метаданные файлов (inodes) и поиск путей (dentry) кэшируются в восстанавливаемых слябах.Возвращаемая память Slab [может] занимать большую часть системной памяти в преимущественно простаивающих системах с большим количеством файлов.."
Вы можете увидеть сырые Buffers
и SReclaimable
значения в cat /proc/meminfo
. Вы также можете запустить slabtop
, чтобы увидеть список плит. AFAICT, slabtop
не дает статистику по плитам как подлежащим восстановлению или нет. Но вы обычно можете догадаться, и если есть какая-то подозрительная плита, я думаю, вы можете найти ее по названию.
[*] Для целей этого ответа "буферный кэш" — это кэш, подсчитанный Buffers
в /proc/meminfo
. Однако другие источники могут ссылаться на весь кэш страниц как на единый буферный кэш. Если вам нужно историческое объяснение, см. первую ссылку.
Кроме того, разработчики Linux могли использовать термин «буферный кеш» для обозначения разных вещей, когда они спорили о реализациях файловой системы.
решение3
Во-вторых, «буферы», отображаемые командой free, также включают SReclaimable
Согласно странице руководства команды free (версия 3.3.15): «Память кэша, используемая кэшем страниц и слэбами (кэшируется и SReclaimable в /proc/meminfo)»
Таким образом, SReclaimable включает в себя кэш, а не буферы.