Войти
Android, Windows, Apple, Ликбез. Социальные сети. Драйверы
  • Японские телефоны Новый японский смартфон
  • Lenovo G500S: характеристики, основные особенности
  • Определяем серию продукта видеокарт Nvidia Характеристики карты nvidia 9800 gt
  • А конкуренты у смартфона есть
  • Что такое расширение файла TRZ?
  • Не работает динамик в "айфоне"
  • Как проверить использование памяти на Linux. Оптимизация Linux под нагрузку

    Как проверить использование памяти на Linux. Оптимизация Linux под нагрузку

    Недавно на одном из виртуальных серверов столкнулся с проблемой долгой записи на диск. И под эту тему нашел интересную , в которой подробно рассмотрен вопрос функционирования кэширования операций записи на диск в Linux. Сегодня будет перевод этой статьи.

    Кэширование в Linux

    При записи данных на диск (любой программой) Linux кэширует эту информацию в области памяти, называемой Page Cache (страничный кэш). Информацию об этой области памяти можно посмотреть с помощью команд free, vmstat или top . Полную информацию об этой области памяти можно посмотреть в файле /proc/meminfo . Ниже приведен пример этой файла на сервере с 4-мя GB RAM:

    MemTotal: 3950112 kB MemFree: 622560 kB Buffers: 78048 kB Cached: 2901484 kB SwapCached: 0 kB Active: 3108012 kB Inactive: 55296 kB HighTotal: 0 kB HighFree: 0 kB LowTotal: 3950112 kB LowFree: 622560 kB SwapTotal: 4198272 kB SwapFree: 4198244 kB Dirty: 416 kB Writeback: 0 kB Mapped: 999852 kB Slab: 57104 kB Committed_AS: 3340368 kB PageTables: 6672 kB VmallocTotal: 536870911 kB VmallocUsed: 35300 kB VmallocChunk: 536835611 kB HugePages_Total: 0 HugePages_Free: 0 Hugepagesize: 2048 kB

    Размер Page Cache показан в параметре "Cached", в данном примере он составляет 2,9 GB. При записи страниц в память размер параметра "Dirty" увеличивается. При начале непосредственно записи на диск будет увеличиваться параметр "Writeback" до тех пор, пока запись не закончится. Достаточно сложно увидеть параметр "Writeback" высоким, так как его значение увеличивается только во время опроса, когда операции ввода/вывода (I/O) поставлены в очередь, но еще не записаны на диск.
    Linux обычно записывает данные из кэша на диск с помощью процесса pdflush . В любой момент в системе запущено от 2 до 8 потоков pdflush . В файле /proc/sys/vm/nr_pdflush_threads можно посмотреть сколько в данный момент активных потоков. Каждый раз все существующие потоки pdflush заняты по крайней мере 1 секунду. Новые потоки пытаются записать данные в свободные очереди устройств, таким образом, чтобы на каждое активное устройство был 1 поток сбрасывающий данные из кэша. Каждый раз по прошествии секунды без какой либо активности со стороны pdflush убирается 1 поток. В Linux можно настроить минимальное и максимальное количество pdflush потоков.

    Настройка pdflush

    Каждый поток pdflush контролируется несколькими параметрами в /proc/sys/vm :

    • /proc/sys/vm/dirty_writeback_centisecs (default 500): в сотых долях секунд. Этот параметр означает как часто pdflush возобновляет работу для записи данных на диск. По умолчанию возобновляет работу 2 потока каждые 5 секунд.
      Возможно недокументированное поведение, которое пресекает попытки уменьшения dirty_writeback_centisecs для более агрессивного кэширования данных процессом pdflush. Например, в ранних версиях ядра 2.6 Linux в файле mm/page-writeback.c код включал логику, которая описывалась "если запись на диск длится дольше, чем параметр dirty_writeback_centisecs, тогда нужно поставить интервал в 1 секунду". Эта логика описана только в коде ядра, и ее функционирование зависит от версии ядра Linux. Так как это не очень хорошо, поэтому вы будете защищены от уменьшения этого параметра.
    • /proc/sys/vm/dirty_expire_centiseconds (default 3000): в сотых долях секунд. Этот параметр указывает как долго данные могут находится в кэше, после чего должны быть записаны на диск. Значение по умолчанию очень долгое: 30 секунд. Это означает, что при нормальной работе до тех пор пока в кэш не запишется достаточно данных для вызова другого метода pdflush, Linux не будет записывать данные на диск, находящиеся в кэше менее 30 секунд.
    • /proc/sys/vm/dirty_background_ratio (default 10): Максимальный процент оперативной памяти, который может быть заполнен страничным кэшем до записи данных на диск. Некоторые версии ядра Linux могут этот параметр устанавливать в 5%.

      В большинстве документации этот параметр описывается как процент от общей оперативной памяти, но согласно исходным кодам ядра Linux это не так. Глядя на meminfo, параметр dirty_background_ratio расчитывается от величины MemFree + Cached - Mapped . Поэтому для нашей демонстрационной системы 10% составляет немного меньше, чем 250MB, но не 400MB.

    Итого: Когда pdflush начинает запись?

    В конфигурации по умолчанию, данные, записываемые на диск, находятся в памяти до тех пор пока:

    • они дольше 30 секунд находятся в памяти;
    • кэшированные страницы занимают более 10% рабочей памяти.

    Если на сервере операции записи происходят часто, то однажды будет достигнут параметр dirty_background_ratio, и вы сможете увидеть, что вся запись на диск идет только через этот параметр не дожидаясь истечения параметра dirty_expire_centiseconds.

    Процесс записи страниц

    Параметр /proc/sys/vm/dirty_ratio (default 40): Максимальный процент общей оперативной памяти, который может быть выделен под страничный кэш, до того как pdflush будет писать данные на диск.

    Примечание : Во время записи на диск все процессы блокируются на запись, не только тот который заполнил буфер на запись. Это может вызвать спровоцировать блокировку одним процессов всех операций вводы/вывода в системе. Провести этот

    Рекомендации по оптимизации Linux для операций, требующий частой записи

    Обычно люди при попытке увеличения производительности дисковой подсистемы сталкиваются с проблемой, что Linux буферизует слишком много информации сразу. Это особенно трудно для операций, требующий синхронизации файловой системы, использующих вызовы fsync. Если во время такого вызова в кэше много данных, то система может "подвиснуть" пока не закончится этот вызов.
    Другая частая проблема происходит потому что слишком много требуется записать до того, как начнется запись на физический диск, операции ввода/вывода происходят чаще, чем при нормальной работе. Вы получите более долгие периоды, когда запись на диск не происходит, пока большой кэш не будет заполнен, после чего сработает один из триггеров pdflush и данные запишутся на максимальной скорости.

    dirty_background_ratio : Основной инструмент настройки, обычно уменьшают этот параметр. Если ваша цель снизить количество данных, хранимое в кэше, так что данные будут писаться на диск постепенно, а не все сразу, то уменьшение этого параметра наиболее эффективный путь. Более приемлемо значение по умолчанию для систем имеющих много оперативной памяти и медленные диски.

    dirty_ratio : Второй по значимости параметр для настройки. При значительном снижении этого параметра приложения, которые должны писать на диск, будут блокироваться все вместе.

    dirty_expire_centisecs : Попробуйте уменьшить, но не сильно. Позволяет уменьшить время нахождения страниц в кэше до записи на диск, но это значительно снизит среднюю скорость записи на диск, т.к. это менее эффективно. Это особенно проявится на системах с медленными дисками.

    Инструкция по настройке параметров

    В файле /etc/sysctl.conf вносим, например:

    Vm.dirty_background_ratio = 10 vm.dirty_ratio = 40

    После синхронизируем данные кэша и диска, очистим кэш и сохраним параметры.

    Sync; echo 3 > /proc/sys/vm/drop_caches; sysctl -p

    Как и любая другая операционная система, Linux очень эффективно работает с оперативной памятью. Доступная память свободно распространяется между процессами, неиспользуемые страницы сбрасываются в раздел подкачки на диске, а в случае переполнения памяти, срабатывает специальный механизм, встроенный в ядро, который анализирует все процессы и уничтожает виновника.

    Когда любой процесс пишет данные на диск, они сохраняются ядром в отдельном кэше. Очень часто этот кэш занимает достаточно много места. В этой статье мы рассмотрим как освободить память в Linux, а точнее, как очистить созданный программами кэш.

    В каждом дистрибутиве Linux можно использовать три команды чтобы очистить кэш памяти linux. Причем нам не придется завершать никаких процессов. Вот эти команды:

    Очистка кэша PageCache:

    sync; echo 1 > /proc/sys/vm/drop_caches

    Очистка inode и dentrie:

    sync; echo 2 > /proc/sys/vm/drop_caches

    Очистка inode и dentrie и PageCache:

    sync; echo 3 > /proc/sys/vm/drop_caches

    Перед тем как выполнять любую из этих команд выполните:

    Это нужно потому, что для работы каждой из команд необходимы права суперпользователя. А теперь давайте рассмотрим что происходит при выполнении этих команд.

    Утилита sync заставляет систему записать все кэшированные, но еще не записанные данные на диск. Это нужно чтобы освободить как можно больше памяти. По умолчанию данные после записи на диск не удаляются из кэша, это нужно для того, чтобы программа могла быстрее их считать при необходимости.

    Если не выполнить команду sync мы тоже освободим немного места, но после ее выполнения результат будет лучше.

    Символ разделения; дает знать оболочке, что перед тем как выполнить другую команду, нужно дождаться завершения работы первой. Последняя команда echo 1 > /proc/sys/vm/drop_caches записывает значение 1 в файл /proc/sys/vm/drop_caches. Это дает сигнал ядру, что нужно очистить выбранный нами вид кэша.

    Виды кэша в Linux

    А теперь давайте рассмотрим виды кэша, которые позволяют очищать эти команды, а также как все это работает.

    PageCache или страничный кэш - это место, куда ядро складывает все данные, которые вы записывали или читали из диска. Это очень сильно ускоряет работу системы, так как если программе во второй раз понадобятся те же данные, они просто будут взяты из оперативной памяти. Но по этой причине этот кэш занимает больше всего места.

    Посмотреть размер страничного кэша можно с помощью утилиты free. Здесь он показан в последней колонке - cached:

    Такой кэш чистить эффективнее и безопаснее всего.

    Кэш inode и dentrie тоже относится к файловой системе. Только в него записываются не сами данные, а структура файловой системы, расположение файлов и папок. При запросе расположения файла или содержимого папки ядро формирует специальные структуры, в которых есть вся эта информация. При следующем запросе структуры будут уже сохранены в памяти. Для каждой файловой системы существует свой кэш inode и общий кэш dentrie.

    Этот кэш занимает очень мало памяти. Данные представлены в байтах, и как видите, это очень мало. Посмотреть его можно командой:

    cat /proc/slabinfo | egrep dentry\|inode

    Очищать его чтобы освободить память linux не рекомендуется, так как памяти потребляется немного, а на новое сканирование файловой системы идет относительно много времени.

    Нужно ли очищать кэш вообще?

    Во-первых, если занято очень много памяти, вы можете очистить страничный кэш, особенно если это он занимает много памяти. Во-вторых, очистить кэш памяти linux может понадобиться, если вы изменяли какие-либо настройки файловой системы или ядра, а теперь хотите проверить как это отразилось на скорости операций чтения/записи. В таком случае можно очистить все кэши и сделать это без перезагрузки, что очень удобно.

    Операционная система Linux разработана таким образом, что перед тем как обратиться к диску, будет просмотрен кэш диска, и если там есть нужные данные, к диску обращений не будет. Если очистить кэш Linux то операционная система будет работать немного медленнее, поскольку ей придется искать данные на диске.

    Автоматическая очистка кэша

    Давайте рассмотрим как автоматически очистить кэш памяти ежедневно в два часа ночи с помощью планировщика заданий cron.

    Сначала создадим bash скрипт со следующим содержимым:

    sudo vi /usr/local/bin/clearcache.sh

    sync ; echo 1 > /proc/sys/vm/drop_caches

    Очищать будем только страничный кэш, так как он занимает больше всего. Другие виды трогать не будем, чтобы зря не понижать производительность системы.

    sudo chmod 755 /usr/local/bin/clearcache.sh

    Осталось добавить задание в планировщик cron. Для этого выполните команду:

    И в открывшемся редакторе добавьте строчку:

    0 2 * * * /usr/local/bin/clearcache.sh

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

    Настройка размера кэша памяти

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

    За это отвечает файл /proc/sys/vm/vfs_cache_pressure. Он содержит относительный показатель, насколько агрессивно нужно удалять страницы из кэша. По умолчанию установлен параметр 100. Если его уменьшить ядро будет реже удалять страницы и это приведет к очень быстрому увеличению кэша. При нуле страницы вообще не будут удаляться. Если значение больше 100, размер кэша будет увеличиваться медленнее и неиспользуемые страницы будут сразу удаляться.

    Например, сделаем минимальный размер кэша:

    echo 1000 > /proc/sys/vm/vfs_cache_pressure

    Не забудьте, что это очень сильно снизит производительность вашей системы, потому что вместо кэша данные будут читаться из диска.

    Как очистить память подкачки

    Пространство подкачки очистить очень просто. Для этого выполните:

    swapoff -a && swapon -a

    Имейте в виду, что при очистке swap, все данные будут перенесены обратно в оперативную память.

    Выводы

    Вот и все. Вы уже знаете очистить кэш linux и освободить память. Не забудьте, что все команды, приведенные в этой статье нужно выполнять от имени суперпользователя, иначе ничего работать не будет. Если остались вопросы, спрашивайте в комментариях!

    Похожие записи:


    Ядро Linux сконструировано таким образом, что память в данной операционной системе используется с расчетом на максимальную производительность всей системы. И тут стоит сравнить две памяти: медленную и быструю — оперативную память и память жесткого диска(SSD-диска). Скорость чтения/записи в оперативную память намного превышает скорость доступа к жесткому диску. А значит напрашивается вполне элементарный вывод: лучше читать из оперативной памяти, нежели тот же файл с жесткого диска. Однако учитывая ограниченное количество оперативной памяти нельзя хранить все что попало в оперативной памяти, так как главное предназначение оперативной памяти — работа с приложениями.

    Как Linux(CentOS) использует оперативную память

    Вернемся к конструкции Linux(CentOS), которая кэширует в оперативную память все файлы, которые были запрошены с моменты запуска компьютера. Это и называется файловый кэшем CentOS и который и является основным виновников всех криков и ругательств по поводу того, что Linux съел всю вашу оперативную память. Разумеется, с переполнением оперативной памяти малоиспользуемые файлы будут выкинуты и перезаписаны новыми файлами, а так же опустошать файловый кэш на тот размер, который запросят приложения. Для досконального разбора ситуации приведем вывод top с моего сервера:

    Нас будут интересовать последний две строки. Строка Mem: показывает использование оперативной памяти. Первое значение с подписью total обозначает что используется система с 2 ГБ ОЗУ. Далее идет значение в 500+ МБ с припиской used, которая указывает сколько памяти занято на данный момент. После этого идет значение с припиской free , что говорит о свободной памяти. Далее приписка buffers — что то связано с буферами хз чего(пока не несет серьезной нагрузки в этой статье). И самое интересное, это последний пункт из последней строчки с припиской cached — показывает сколько памяти было использовано под файловый кэш, про который и шла речь чуть выше.

    Исходя из приведенного скрина выходит, что оперативная память забита на 530МБ и что доступными для дальнейшего использования только 1.4 ГБ памяти.(Приведенный скрин не совсем хорошо описывает всю прелесть файлового кэша, когда после нескольких часов работы компьютера оперативка забивается на 90-95 процентов. Тут же приведен скрин работы после нескольких минут после включения компьютера).

    Однако не деле же свободной являются 1,65 ГБ памяти, что выходит если сложить свободную память(free) и закэшированную память(cached) вместе. Это справедливо благодаря тому, что файловый кэш CentOS выделит занятые просторы оперативной памяти, если это понадобиться какому-то приложению или самой системе. Таким образом, под приложения и ОС(на данный момент) может быть выделено еще 250МБ, которая сейчас используется под файловый кэш.

    Поэтому когда вы видите пугающе маленькие значения в поле free не забывайте прибавить к этому и значение поля cached. Тогда вы и получите полный объем свободной оперативной памяти . Исходя из всего этого можно вообще отказаться от каких-либо изменений в работе Linux(CentOS), так как действия ОС не слишком агрессивны и столь необходимая оперативная память для ваших приложений всегда будет доступна.

    Проблемы при слишком большом файловом кэше

    Однако на своем опыте скажу, что когда под файловый кэш вкупе с приложениями выделяется более 90-95% всей оперативной памяти, то дальнейшая работа всей системы несколько замедляет. Так как настройкой я занимался именно веб-сервера, то самым лучшим показателем тут становится быстродействие сайтов, которое начинает хромать при практически полностью заполненной ОЗУ. К тому же замечено, что при заполненной ОЗУ увеличивается работа центрального процессора, который постоянно решает что выкинуть из ОЗУ и что туда добавить. Поэтому было принято решение ограничить максимальный размер файлового кэша CentOS .

    Очищение файлового кэша CentOS

    В этом направление многие предлагают вручную очищать файловый кэш, а чтобы автоматизировать этот процесс, записать задание в cron с запуском раз в день, или раз в несколько часов. Для более полной картины приведу эту команду:

    sh -c ‘echo 1 > /proc/sys/vm/drop_caches"

    Команда действительно делает свое дело и файловый кэш полностью очищается. Но и тут же начинает вновь пополняться и вскоре снова забьет все свободное место на диске. Но есть и другое решение.

    Ограничение размера файлового кэша

    Для этого нам необходимо изменить значение в файле /proc/sys/vm/min_free_kbytes на то значение, которое вы хотите чтобы не выделялось под файловый кэш. Другими словами, указанный вами в КБ размер оперативной памяти всегда будет оставаться пустым, не занятым файловым кэшем. Честно сказать, не нашел более конкретный материал в котором было бы сказано как именно этот параметр работает:

    1. Оставляет под приложения и систему указанный объем исходя из всего объема ОЗУ? или
    2. Оставляет под приложения и систему указанный объем исходя из свободной ОЗУ?

    Сам склоняюсь ко второму варианту, так как файловый кэш по умолчанию имеет более низкий приоритет, нежели приложения, а потому отдает занятые территории по первому требованию.

    Но вернемся к файлу, которому я задал значение 700000, то есть 700 МБ. Сразу после изменения вы уже заметите изменения, так как файловый кэш будет сброшен настолько, чтобы удовлетворить новые требования. Однако такое состояние будет длиться только до ближайшей перезагрузки и потому нам нужно закрепить свои действия. Для этого в файл /etc/sysctl.conf дописать строчку

    vm.min_free_kbytes=700000

    Разумеется тут нужно указать ваше значение. Можете перезагрузить и проверить файл /proc/sys/vm/min_free_kbytes значение которого не должно смениться на значение по умолчанию.

    Вот таким образом можно ограничить максимальный размер, который можно выделить в оперативной памяти под нужды файлового кэша.

    Как и любая другая операционная система, Linux очень эффективно работает с оперативной памятью. Доступная память свободно распространяется между процессами, неиспользуемые страницы сбрасываются в раздел подкачки на диске, а в случае переполнения памяти, срабатывает специальный механизм, встроенный в ядро, который анализирует все процессы и уничтожает виновника.

    Когда любой процесс пишет данные на диск, они сохраняются ядром в отдельном кэше. Очень часто этот кэш занимает достаточно много места.

    КАК ОСВОБОДИТЬ ПАМЯТЬ В LINUX
    В каждом дистрибутиве Linux можно использовать три команды чтобы очистить кэш памяти linux. Причем нам не придется завершать никаких процессов. Вот эти команды:

    Очистка кэша PageCache:

    Sync; echo 1 > /proc/sys/vm/drop_caches

    Очистка inode и dentrie:

    Sync; echo 2 > /proc/sys/vm/drop_caches

    Очистка inode и dentrie и PageCache:

    Sync; echo 3 > /proc/sys/vm/drop_caches

    Перед тем как выполнять любую из этих команд выполните:

    Это нужно потому, что для работы каждой из команд необходимы права суперпользователя. А теперь давайте рассмотрим что происходит при выполнении этих команд.

    Утилита sync заставляет систему записать все кэшированные, но еще не записанные данные на диск. Это нужно чтобы освободить как можно больше памяти. По умолчанию данные после записи на диск не удаляются из кэша, это нужно для того, чтобы программа могла быстрее их считать при необходимости.

    Если не выполнить команду sync мы тоже освободим немного места, но после ее выполнения результат будет лучше.

    Символ разделения; дает знать оболочке, что перед тем как выполнить другую команду, нужно дождаться завершения работы первой. Последняя команда echo 1 > /proc/sys/vm/drop_caches записывает значение 1 в файл /proc/sys/vm/drop_caches. Это дает сигнал ядру, что нужно очистить выбранный нами вид кэша.

    ВИДЫ КЭША В LINUX
    А теперь давайте рассмотрим виды кэша, которые позволяют очищать эти команды, а также как все это работает.

    PageCache или страничный кэш - это место, куда ядро складывает все данные, которые вы записывали или читали из диска. Это очень сильно ускоряет работу системы, так как если программе во второй раз понадобятся те же данные, они просто будут взяты из оперативной памяти. Но по этой причине этот кэш занимает больше всего места.

    Посмотреть размер страничного кэша можно с помощью утилиты free. Здесь он показан в последней колонке - cached:

    Такой кэш чистить эффективнее и безопаснее всего.

    Кэш inode и dentrie тоже относится к файловой системе. Только в него записываются не сами данные, а структура файловой системы, расположение файлов и папок. При запросе расположения файла или содержимого папки ядро формирует специальные структуры, в которых есть вся эта информация. При следующем запросе структуры будут уже сохранены в памяти. Для каждой файловой системы существует свой кэш inode и общий кэш dentrie.

    Этот кэш занимает очень мало памяти. Данные представлены в байтах, и как видите, это очень мало. Посмотреть его можно командой:

    Cat /proc/slabinfo | egrep dentry\|inode


    Очищать его чтобы освободить память linux не рекомендуется, так как памяти потребляется немного, а на новое сканирование файловой системы идет относительно много времени.

    НУЖНО ЛИ ОЧИЩАТЬ КЭШ ВООБЩЕ?
    Во-первых, если занято очень много памяти, вы можете очистить страничный кэш, особенно если это он занимает много памяти. Во-вторых, очистить кэш памяти linux может понадобиться, если вы изменяли какие-либо настройки файловой системы или ядра, а теперь хотите проверить как это отразилось на скорости операций чтения/записи. В таком случае можно очистить все кэши и сделать это без перезагрузки, что очень удобно.

    Операционная система Linux разработана таким образом, что перед тем как обратиться к диску, будет просмотрен кэш диска, и если там есть нужные данные, к диску обращений не будет. Если очистить кэш Linux то операционная система будет работать немного медленнее, поскольку ей придется искать данные на диске.

    АВТОМАТИЧЕСКАЯ ОЧИСТКА КЭША
    Давайте рассмотрим как автоматически очистить кэш памяти ежедневно в два часа ночи с помощью планировщика заданий cron.

    Сначала создадим bash скрипт со следующим содержимым:

    Sudo vi /usr/local/bin/clearcache.sh

    Sync ; echo 1 > /proc/sys/vm/drop_caches

    Очищать будем только страничный кэш, так как он занимает больше всего. Другие виды трогать не будем, чтобы зря не понижать производительность системы.

    Sudo chmod 755 /usr/local/bin/clearcache.sh

    Осталось добавить задание в планировщик cron. Для этого выполните команду:

    Sudo crontab -e

    И в открывшемся редакторе добавьте строчку:

    0 2 * * * /usr/local/bin/clearcache.sh

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

    НАСТРОЙКА РАЗМЕРА КЭША ПАМЯТИ
    Куда удобнее не очищать кэш каждый раз, а настроить ограничение, при превышении которого система сама будет удалять лишние страницы. Вы не можете явно ограничить сколько мегабайт может система использовать под кэш. Будет использоваться вся доступная память по мере необходимости, но можно настроить скорость удаления просроченных страниц из кэша.

    За это отвечает файл /proc/sys/vm/vfs_cache_pressure. Он содержит относительный показатель, насколько агрессивно нужно удалять страницы из кэша. По умолчанию установлен параметр 100. Если его уменьшить ядро будет реже удалять страницы и это приведет к очень быстрому увеличению кэша. При нуле страницы вообще не будут удаляться. Если значение больше 100, размер кэша будет увеличиваться медленнее и неиспользуемые страницы будут сразу удаляться.

    Например, сделаем минимальный размер кэша:

    Echo 1000 > /proc/sys/vm/vfs_cache_pressure

    Не забудьте, что это очень сильно снизит производительность вашей системы, потому что вместо кэша данные будут читаться из диска.

    КАК ОЧИСТИТЬ ПАМЯТЬ ПОДКАЧКИ
    Пространство подкачки очистить очень просто. Для этого выполните:

    Swapoff -a && swapon -a

    Имейте в виду, что при очистке swap, все данные будут перенесены обратно в оперативную память.

    ВЫВОДЫ
    Вот и все. Вы уже знаете очистить кэш linux и освободить память.Все команды нужно выполнять от имени суперпользователя, иначе ничего работать не будет.


    В каждом дистрибутиве Linux можно использовать три команды чтобы очистить кэш памяти linux. Причем нам не придется завершать никаких процессов. Вот эти команды:

    Очистка кэша PageCache:
    # sync; echo 1 > /proc/sys/vm/drop_caches
    Очистка inode и dentrie:
    # sync; echo 2 > /proc/sys/vm/drop_caches
    Очистка inode и dentrie и PageCache:
    # sync; echo 3 > /proc/sys/vm/drop_caches
    Перед тем как выполнять любую из этих команд выполните:
    $ su -
    Это нужно потому, что для работы каждой из команд необходимы права суперпользователя. А теперь давайте рассмотрим что происходит при выполнении этих команд.

    Утилита sync заставляет систему записать все кэшированные, но еще не записанные данные на диск. Это нужно чтобы освободить как можно больше памяти. По умолчанию данные после записи на диск не удаляются из кэша, это нужно для того, чтобы программа могла быстрее их считать при необходимости.

    Если не выполнить команду sync мы тоже освободим немного места, но после ее выполнения результат будет лучше.

    Символ разделения; дает знать оболочке, что перед тем как выполнить другую команду, нужно дождаться завершения работы первой. Последняя команда echo 1 > /proc/sys/vm/drop_caches записывает значение 1 в файл /proc/sys/vm/drop_caches . Это дает сигнал ядру, что нужно очистить выбранный нами вид кэша.

    Виды кэша в Linux

    А теперь давайте рассмотрим виды кэша, которые позволяют очищать эти команды, а также как все это работает.

    PageCache или страничный кэш - это место, куда ядро складывает все данные, которые вы записывали или читали из диска. Это очень сильно ускоряет работу системы, так как если программе во второй раз понадобятся те же данные, они просто будут взяты из оперативной памяти. Но по этой причине этот кэш занимает больше всего места.

    Посмотреть размер страничного кэша можно с помощью утилиты free. Здесь он показан в последней колонке - cached:
    $ free -h

    Такой кэш чистить эффективнее и безопаснее всего.

    Кэш inode и dentrie тоже относится к файловой системе. Только в него записываются не сами данные, а структура файловой системы, расположение файлов и папок. При запросе расположения файла или содержимого папки ядро формирует специальные структуры, в которых есть вся эта информация. При следующем запросе структуры будут уже сохранены в памяти. Для каждой файловой системы существует свой кэш inode и общий кэш dentrie.

    Этот кэш занимает очень мало памяти. Данные представлены в байтах, и как видите, это очень мало. Посмотреть его можно командой:
    $ cat /proc/slabinfo | egrep dentry\|inode

    Очищать его чтобы освободить память linux не рекомендуется, так как памяти потребляется немного, а на новое сканирование файловой системы идет относительно много времени.

    Нужно ли очищать кэш вообще?
    Во-первых, если занято очень много памяти, вы можете очистить страничный кэш, особенно если это он занимает много памяти. Во-вторых, очистить кэш памяти linux может понадобиться, если вы изменяли какие-либо настройки файловой системы или ядра, а теперь хотите проверить как это отразилось на скорости операций чтения/записи. В таком случае можно очистить все кэши и сделать это без перезагрузки, что очень удобно.

    Операционная система Linux разработана таким образом, что перед тем как обратиться к диску, будет просмотрен кэш диска, и если там есть нужные данные, к диску обращений не будет. Если очистить кэш Linux то операционная система будет работать немного медленнее, поскольку ей придется искать данные на диске.

    Автоматическая очистка кэша

    Давайте рассмотрим как автоматически очистить кэш памяти ежедневно в два часа ночи с помощью планировщика заданий cron.

    Сначала создадим bash скрипт со следующим содержимым:
    $ sudo vi /usr/local/bin/clearcache.sh
    #!/bin/bash sync ; echo 1 > /proc/sys/vm/drop_caches
    Очищать будем только страничный кэш, так как он занимает больше всего. Другие виды трогать не будем, чтобы зря не понижать производительность системы.

    Дальше сделайте скрипт исполняемым:
    $ sudo chmod 755 /usr/local/bin/clearcache.sh
    Осталось добавить задание в планировщик cron. Для этого выполните команду:
    $ sudo crontab -e
    И в открывшемся редакторе добавьте строчку:
    0 2 * * * /usr/local/bin/clearcache.sh
    Теперь этот скрипт будет выполняться каждую ночь и выполнять очистку памяти, чтобы сервер мог работать нормально.

    Настройка размера кэша памяти

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

    За это отвечает файл . Он содержит относительный показатель, насколько агрессивно нужно удалять страницы из кэша. По умолчанию установлен параметр 100. Если его уменьшить ядро будет реже удалять страницы и это приведет к очень быстрому увеличению кэша. При нуле страницы вообще не будут удаляться. Если значение больше 100, размер кэша будет увеличиваться медленнее и неиспользуемые страницы будут сразу удаляться.

    Например, сделаем минимальный размер кэша:
    # echo 1000 > /proc/sys/vm/vfs_cache_pressure
    Не забудьте, что это очень сильно снизит производительность вашей системы, потому что вместо кэша данные будут читаться из диска.

    Как очистить память подкачки

    Пространство подкачки очистить очень просто. Для этого выполните:
    # swapoff -a && swapon -a
    Имейте в виду, что при очистке swap, все данные будут перенесены обратно в оперативную память.