Разбираемся в кэшах Linux систем и Swaping-е

Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.

Модератор: Bizdelnick

Аватара пользователя
Gineaser
Сообщения: 157
Статус: Evrashka
ОС: Arch Linux

Разбираемся в кэшах Linux систем и Swaping-е

Сообщение Gineaser »

Доброго время суток.
Только начал осваивать линукс. Поэтому периодически возникают достаточно специфические вопросы, на которые я не смог найти ответы быстрым поиском по гуглу.
Есть сервер на базе Ubuntu-Server. На нем 12Gb оперативной памяти, а так же swap раздел объемом 20Gb. Решил разобрать по поводу кэша в линукс системах.

Мне кажется эта тема станет полезной не только для меня, но и для других пользователей операционных систем Unix и, наверное, даже для тех, кто далеко не новичок.

Для контроля за оперативной памятью, \\\\\\\"коробочного решения\\\\\\\" я знаю следующие методы: (Нажать на spoiler для просмотра)

Spoiler
Вывод команды top следующий:

Код: Выделить всё

Mem:  12322712k total,  3698744k used,  8623968k free,    68816k buffers
Swap: 25904804k total,   741236k used, 25163568k free,  1898116k cached


Вывод команды free -m:

Код: Выделить всё

             total       used       free     shared    buffers     cached
Mem:         12033       3676       8357          0         71       1923
-/+ buffers/cache:       1681      10352
Swap:        25297        723      24573


Вывод cat /proc/meminfo:

Код: Выделить всё

MemTotal:       12322712 kB
MemFree:         8549464 kB
Buffers:           72888 kB
Cached:          1973692 kB
SwapCached:       432024 kB


Изучение документации помогло кое что понять.

Во первых swap. Если swaping включен (man swapon, /proc/swaps) не используемые страницы в памяти будут скидываться в виртуальную область на жестком диске, тем самым освобождая физическую память (оперативную) и давая ресурсы для других приложений. Когда требуется обратиться к тем страницам, которые содержатся в свопе, они считываются с жесткого диска, помещаются в оперативку и обрабатываются.

Свапингом можно управлять, к примеру установить планку (значение свободной оперативки) при котором не используемые страницы начнут скидываться на жесткий диск.
Делать это можно посредством занесения значения в файл /proc/sys/vm/swappiness. По умолчанию значение 60. Оно в процентах. Что бы было проще понять приведу пример:
Если у меня оперативная память забивается больше чем на 40%, то не используемые страницы начинают писать на жесткий диск в swap. Если поставим значение 5% то swap начнет использоваться когда оперативная память забьется на 95%.

Еще, насколько я понял, можно то же самое сделать но с ограничением по количеству доступных страниц оперативки. Делается это в файле /proc/sys/vm/freepages
Файл имеет 3 значения через пробел в строчку. .
Первое значение - это предел, при котором система перестанет хранить в памяти не используемые страницы и начнет все скидывать в свап
Второе значение - это количество свободных страниц в оперативке, при котором система начнет \\\\\\\"суетится\\\\\\\" по в документации, на сколько я понял. Т.е. начнет активно использовать свап.
Третье значение - это количество свободных страниц в оперативке при котором система не свапит не используемые страницы.

Есть еще способ управление непосредственно самими страницами в оперативной памяти по средствам файла /proc/sys/vm/kswapd
Так же 3 значения.
Первое значение - максимальное количество страниц которые будут выбрасываться из памяти за раз. Если обрабатываются очень большие объемы данных с использованием свапа, мне кажется стоит увеличивать это значение.
Второе значение - количество попыток свапинга страницы. Не совсем понимая глубокую физику процесса сваппинга не знаю как влияет это значение и на что.
Третье значение - тоже не сосем понял предназначение, но если всё же понял :) из документации - это количество страниц которые будут считываться из/в оперативку за один запрос на отпраку в свап или извлечение из свапа. Ставить слишком много думаю не разумно. Тут скорее надо исходить из специфики железа (шина оперативной памяти, частота, двухканальные и прочие режимы работы)

Во вторых существует еще 2 вида кэша, что представляет для меня особый интерес.
Первый кэш из них - это кэш inode и dentry дескрипторов.
На сколько я понял из англоязычной документации это кэш который помещается в оперативную память при обращение к каталогам в файловой системе, которые грубо говоря являются файлами, содержащими как раз эти дескрипторы:
- (метаданные файлов внутри этого каталога) inode - время последнего доступа, права, UID/GID, размер. Не содержат имен, тем самым не имеют привязку к конкретному файлу, который представляет собой для ОС - набор байт.
- dentry - привязывают inode файла и имя файла в ФС.
И логически рассуждая, я пришел к выводу что кэш inode и dentry увеличивают время доступа к конкретному файлу, т.е. метаданные и связи хранятся в оперативки и считывать их с блочных устройств не надо.
Управлять этим кешем (очищать) можно по средстам принудительного ввода в файл /proc/sys/vm/drop_caches значения 2. К примеру так: echo 2 > /proc/sys/vm/drop_caches
Но как включить этот кэш я не нашел, на сколько я могу судить по командам мониторинга оперативки выше, он не используется. Можно посмотреть информацию о этих кешах через cat /proc/slabinfo | grep inode/dentry. Еще можно так: cat /proc/sys/fs/dentry-state,
cat /proc/sys/fs/inode-state


Второй кэш - это pagecache.
И вот тут я не совсем понял для чего он вообще и что из себя представляет. Непосредственно именно он забивает оперативную память. Хорошо понятно что это не swap. И по названию это какие то страницы оперативной памяти. Но какие и страницы чего?
Наверно к этому кэшу можно отнести следующие настройки: /proc/sys/vm/buffermem
Указывается в процентах общее количество системной буферной памяти. Имеет три значения идущие в строчку и разделенные проблемами. Из документации понял что:
первое значение - минимальный уровень буферной памяти
второе значение - уровень буферной памяти, который будет работать в том случае, если вы уберете скажем линейку оперативки, т.е. произойдет уменьшение общего количества оперативной памяти (?) так или нет не знаю.
третье значение - уровень максимально доступной буферной памяти.

Очистка этого кэша производится вводом в файл /proc/sys/vm/drop_caches значения 1
Сразу очищается почти вся оперативная память. Сбоев в работе не замечено. После очистки необходимо выполнять sync.
Кстати значение \\\\\\\"0\\\\\\\" для файла /proc/sys/vm/drop_caches установит значение по дефолту, а значение \\\\\\\"3\\\\\\\" очистит и inode+dentry кэш + pagecache.

Все что узнал вкратце изложил. Если я чего то не понимаю или не правильно представляю, очень прошу поправить и объяснить. Особенно хочу узнать что же такое всё же pagecache.
Обезьянка видит - Обезьянка делает...
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: Разбираемся в кэшах Linux систем и Swaping-е

Сообщение frp »

Gineaser писал(а):
05.06.2011 21:52
Второй кэш - это pagecache.
И вот тут я не совсем понял для чего он вообще и что из себя представляет.

http://en.wikipedia.org/wiki/Page_cache
В нем хранятся данные, считанные с диска. Он значительно ускоряет считывание данных т.к. уменьшается количество обращений к винчестеру - данные, которые есть в pagecache, считываются из него.
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: Разбираемся в кэшах Linux систем и Swaping-е

Сообщение Portnov »

Ну и ещё не надо забывать, что page cache — это не занятая память. Т.е. под него отводится свободное место в памяти, когда свободной памяти становится меньше — он уменьшается, и наоборот. Так что выражение «память забита page cache» не имеет особого смысла.

Можете ещё вот это посмотреть: http://iportnov.blogspot.com/2010/03/linux-10.html, там немного про управление памятью есть. Подробнее — в книжках про ядро, хотя бы у Р.Лава.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: Разбираемся в кэшах Linux систем и Swaping-е

Сообщение frp »

Portnov писал(а):
06.06.2011 09:51
Ну и ещё не надо забывать, что page cache — это не занятая память. Т.е. под него отводится свободное место в памяти, когда свободной памяти становится меньше — он уменьшается, и наоборот. Так что выражение «память забита page cache» не имеет особого смысла.

Есть еще "грязные" страницы, которые нельзя просто взять и выбросить, и память повторно можно будет использовать только когда грязные страницы будут сброшены на диск (обычно это не вызывает проблем, но в особых случаях, когда памяти мало и какая-то программа запросила выделить и стала очень быстро писать в память, по размеру равную всей свободной, то эта самая программа сильно загонит систему в своп, а pagecache сбросится на диск до этого не успеет).
Спасибо сказали: