Очистка оперативной памяти

Изображение пользователя Mike.

После переезда на KDE 5, возникла проблема со свободной памятью. Как оказалось, в 5-х кедах 4 гига оперативы достаточно быстро съедаются. Анализ показал, что половина оперативы занята программами, а вторая половина - дисковым кэшем. При частых операциях с файлами, особенно с большими, Linux кеширует эти самые файлы в оперативную память. В принципе, в этом нет ничего страшного, потому что как только, занятая закешированными файлами, оперативная память понадобится ядру, она будет частично освобождена для более приоритетной задачи. Но бывает так, что это освобождение памяти дает резкую нагрузку на swap, и комп начинает притормаживать. Т.к. у меня на компе постоянно крутится виртуалбокс, мне эти тормоза оказываются весьма критичны, и я озадачился, как этот дисковый кэш из оперативы сбрасывать.

Для начала посмотрим, сколько оперативы у нас свободно. В принципе, без разницы, чем это смотреть, механизмов достаточно: виджет на рабочем столе, команды free -m, top или еще что. Кому как удобно. В выводе команды можете посмотреть, чем и до какой степени у ваз загружена оператива. Если дискового кэша много, то, возможно, есть резон его сбросить.
Чтобы сбросить страничный кэш (page-cache) необходимо от имени рута выполнить команду:
echo 1 > /proc/sys/vm/drop_caches
Для сброса кэшей индексных узлов (inode) и записей каталогов (dentry) выполняем команду:
echo 2 > /proc/sys/vm/drop_caches
Если же есть необходимость сделать сброс и того, и другого, то команда выглядит так:
echo 3 > /proc/sys/vm/drop_caches

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

Ну и чтобы постоянно не делать все это ручками, можно сваять нехитрый скрипт:
#!/bin/bash
sync
echo 3 > /proc/sys/vm/drop_caches

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

Наслаждайтесь!

Комментарии (5)

+3
MacLeod - 8 Апрель, 2015 - 17:01
Изображение пользователя MacLeod.

Хотелось бы добавить, что данное решение - частный случай, и всем не стоит кидаться добавлять его себе в крон.

Use of this file can cause performance problems. Since it discards cached
objects, it may cost a significant amount of I/O and CPU to recreate the
dropped objects, especially if they were under heavy use. Because of this,
use outside of a testing or debugging environment is not recommended.
(Использование этого файла может вызвать проблемы с производительностью. Поскольку он отбрасывает кэшированные объекты, расплата за это может составить значительное количество операций ввода/вывода и проца, чтобы пересоздать сброшенные объекты, особенно, если они находятся под интенсивным использованием. Поэтому, использование вне рамок тестирования или отладки не рекомендуется.)

Источник https://www.kernel.org/doc/Documentation/sysctl/vm.txt

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

0
Mike - 8 Апрель, 2015 - 17:25
Изображение пользователя Mike.

ну тут уже каждый сам выбирает, чем жертвовать: тормозами из-за переполнения ОЗУ или увеличением времени запуска программ =)

+1
MacLeod - 8 Апрель, 2015 - 17:49
Изображение пользователя MacLeod.

Если разобраться, случаев, загоняющих машину в своп, при достатке оперативки, не так много. Как правило, это происходит при выделении процессу большого непрерывного куска памяти, что и происходит при запуске виртуалки. Там суть даже не в том, что память до ее запуска была забита кэшем - она могла быть просто сильно фрагментирована, и, чтобы выделить большой непрерывный кусок, скажем на 2 гига, система, в режиме ошпаренного кота, свопит фрагменты, мешающие это сделать. Аналогичную картину можно наблюдать и на менее прожорливых процессах, но малом количестве свободной оперативки при сильной фрагментации.

0
Mike - 8 Апрель, 2015 - 18:08
Изображение пользователя Mike.

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

0
MacLeod - 8 Апрель, 2015 - 19:53
Изображение пользователя MacLeod.

Достаток для resident size, я так понимаю, есть, иначе - никакая очистка кэша бы не помогла в принципе =)

Отправить комментарий

CAPTCHA на основе изображений
Введите цифры