Только начал осваивать линукс. Поэтому периодически возникают достаточно специфические вопросы, на которые я не смог найти ответы быстрым поиском по гуглу.
Есть сервер на базе Ubuntu-Server. На нем 12Gb оперативной памяти, а так же swap раздел объемом 20Gb. Решил разобрать по поводу кэша в линукс системах.
Мне кажется эта тема станет полезной не только для меня, но и для других пользователей операционных систем Unix и, наверное, даже для тех, кто далеко не новичок.
Для контроля за оперативной памятью, \\\\\\\"коробочного решения\\\\\\\" я знаю следующие методы: (Нажать на spoiler для просмотра)
Spoiler
Вывод команды top следующий:
Вывод команды free -m:
Вывод cat /proc/meminfo:
Код: Выделить всё
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.