Linux сбросить кэш диска

linux notes

пятница, 13 июня 2014 г.

Эксперемент с дисковым кешем в Linux

Эффекты диского кеша во время выделения памяти в приложениях

Когда память заканчивается — это не круто, но OOM-killer должен убить только этот процесс и надеюсь остальные процессы он не затронет.

Отключим для начала swap, что бы приложение не начало съедать его.

Чистка дискового кеша

# echo 3 > /proc/sys/vm/drop_caches

И снова проверим состояние памяти:

Эффективность кеша диска во время работы приложений

# cat hello.py
print «Hello World! Love, Python»

# cat hello.java
class Hello <
public static void main(String[] args) throws Exception <
System.out.println(«Hello World! Regards, Java»);
>
>

Скомпилируем программу на Java:

Ух ты! Python выполнился в 64 раза быстрее, а Java в 8.5 раз быстрее.

Эффект дискового кеша на чтение файла

Давайте создадим небольшой файл и посмотрим, как дисковый кеш влияет на его скорость чтения. Я создал файл размером 500 Мб.

Сбросим дисковый кеш:

# echo 3 > /proc/sys/vm/drop_caches

И посмотрим состояние памяти:
# free -m
total used free shared buffers cached
Память: 7866 4448 3418 0 1 638
-/+ буферы/кэш: 3808 4057
Swap: 7627 183 7444

Создадим файл с нулями размером 500 Мб:
# dd if=/dev/zero of=bigfile bs=1M count=500
500+0 записей получено
500+0 записей отправлено
скопировано 524288000 байт (524 MB), 1,35606 c, 387 MB/c

# ls -lh bigfile
-rw-r—r— 1 root root 500M Июн 13 18:22 bigfile

Теперь проверим еще раз состояние памяти:
# free -m
total used free shared buffers cached
Память: 7866 5229 2637 0 7 1415
-/+ буферы/кэш: 3806 4060
Swap: 7627 183 7444

При создании файла, его содержимое пишется в дисковый кеш (кеш память увеличилась больше, чем на 500 Мб за счет того, что я выполняю все действия на ноутбуке, где запущено еще куча другого софта).

Давайте прочитаем его и посмотрим за сколько мы это сделаем:

Источник

Сброс кэша в Linux

Суббота, 28 Март 2015 00:00

Пока в Интернете ведутся войны на тему «надо ли вообще сбрасывать кэш в Linux», я для себя ответил на этот вопрос. Да, иногда это необходимо. Предположим, есть сервер, который работает под CentOS и выполняет монотонные несложные задачи ежедневно. Но раз в неделю он единовременно выполняет весьма ресурсоёмкую задачу, которая сильно нагружает процессор и «съедает» всю память (под кэш). Конечно, грамотные люди знают, что такое буфер, и как он работает. Но смысл хранить в памяти файловые данные, которые в лучшем случае потребуются через неделю, а скорее всего — просто устареют уже через пару дней!?

Моё предложение: дополнять скрипты редких ресурсоёмких задач командами очистки кэша.

К ресурсоёмким задачам, забивающим кэш лишней информацией я отношу следующие задачи, при условии их редкого выполнения:

  • Архивация (в моём случае tar способен «съесть» всю свободную память)
  • Обновление через yum
  • Анализ статистики веб-сервера и построение отчётов

Как известно, в версии ядра 2.6.16 (и более свежих) появился механизм, который вынуждает ядро сбросить страничный кэш и/или кэши inode+dentry. После выполнения команды высвобождается существенный объем ОЗУ. Ходят легенды, что издревле несчастные администраторы писали специальные скрипты, которые пытались выделить тонны памяти с единственной целью: чтобы изгнать кэш из памяти 🙂

Читайте также:  Samsung scx 4200 series �������� ��� mac os

Для использования /proc/sys/vm/drop_caches достаточно передать число.

Чтобы сбросить страничный кэш:

Чтобы сбросить кэши dentry и inodes:

Чтобы сбросить страничный кэш, dentry и inodes:

Теперь выполним лабораторную работу.

На веб-сервере, работающем под CentOS 6.6, было замечено, что в обычном режиме достаточно 1 Гб ОЗУ для выполнения всех задач, причем этот лимит никогда не превышается, а файл подкачки постоянно держится на величине 0 Kb. Однако, после выполнения тяжелых задач память целиком забивается, и — самое обидное! — сервер начинает своппить на обычных простых задачах, постепенно забивая файл подкачки и постоянно напрягая жесткий диск. Проведём мониторинг памяти до (красным) и после (синим) выполнения сброса.

Выигрыш очевиден. Если раньше было свободно 87 Мб, то стало свободно 1456 Мб даже при условии, что в качестве параметра сброса мы передавали единицу.

Теперь сервер в состоянии проработать ещё неделю, совершенно не напрягая жесткий диск.

This is a non-destructive operation and will only free things that are completely unused. Dirty objects will continue to be in use until written out to disk and are not freeable. If you run «sync» first to flush them out to disk, these drop operations will tend to free more memory.

Источник

Как освободить память Linux

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

Когда любой процесс пишет данные на диск, они сохраняются ядром в отдельном кэше. Очень часто этот кэш занимает достаточно много места. В этой статье мы рассмотрим как освободить память в 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 или страничный кэш — это место, куда ядро складывает все данные, которые вы записывали или читали из диска. Это очень сильно ускоряет работу системы, так как если программе во второй раз понадобятся те же данные, они просто будут взяты из оперативной памяти. Но по этой причине этот кэш занимает больше всего места.

Читайте также:  Инструкция обратилась по адресу память не может быть read windows 10

Посмотреть размер страничного кэша можно с помощью утилиты 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

!/bin/bash
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, все данные будут перенесены обратно в оперативную память.

Как освободить память занимаемую процессами

Если в вашей системе нет памяти и кэш здесь ни при чём, следует завершить несколько процессов, потребляющих больше всего памяти. Для этого сначала надо вычислить такие процессы. Чтобы это сделать можно воспользоваться утилитой ps:

Читайте также:  Линукс чья разработка страна

ps -e -o pid,user,%mem,command —sort %mem

Как видите, больше всего здесь памяти занимает chromium. Теперь вам надо его завершить. Идентификатор процесса, по которому его можно завершить отображается в первой колонке. Поэтому:

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

Выводы

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

Источник

Как очистить кэш ввода-вывода диска в Linux

Мне нужно сделать это для более предсказуемого бенчмаркинга.

5 ответов

звучит так, как будто вы хотите синхронизация или sync ().

Если вы хотите очистить дисковый кэш: echo 3 | sudo tee /proc/sys/vm/drop_caches

вы можете сделать это так:

вы можете использовать strace, чтобы увидеть, что это три разных syscalls

кроме того, может быть желательно отключить кэш HDD с помощью hdparm, не уверен, что вы бенчмаркинг.

в любом случае, вы не можете запретить HDD кэшировать последние 64/32/16 МБ недавно использованных данных. Чтобы убить этот кэш, просто напишите некоторое количество нулей (и флеш) + прочитайте какое-то несвязанное место с HDD. Это необходимо, так как кэш может быть разделить для чтения-часть и писать-часть. После этого вы можете проверить HDD.

очистка кэша диска: echo 3 | sudo tee /proc/sys/vm/drop_caches

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

чтобы освободить pagecache:

echo 1 > /proc/sys/vm/drop_caches

для того чтобы освободить dentries и inodes:

echo 2 > /proc/sys/vm/drop_caches

чтобы освободить pagecache, dentries and inodes:

echo 3 > /proc/sys/vm/drop_caches

поскольку это неразрушающая операция, а грязные объекты не являются свободными, пользователь должен сначала запустить «синхронизацию», чтобы убедиться, что все кэшированные объекты освобождены.

короткий достаточно хороший ответ: (копипаст дружелюбный)

объяснение:

sync : от страницы: буферы файловой системы flush. Force изменил блоки на диск, обновите суперблок.

echo 3 > /proc/sys/vm/drop_cache : из документов ядра это приведет к удалению ядром чистых кэшей

blockdev —flushbufs /dev/sda : от страницы: устройство блокировки вызовов ioctls [to] буферы смыва.

hdparm -F /dev/sda : от страницы: очистите буфер кэша записи на диске (старые диски могут не реализовать это)

хотя команды blockdev и hdparm выглядят аналогично в соответствии с ответ выше они выдают различные ioctls на устройство.

длинный, вероятно, лучший способ:

(Я предполагаю, что вы отформатировали диск, но вы можете адаптировать эти команды, если вы хотите писать прямо на диск)

запустите это только один раз перед 1-м бенчмарком:

запустить это каждый раз, когда вы хотите очистить кэш:

запустите это, когда закончите.

объяснение:

жесткий диск может иметь Кеши H/W, которые не будут очищены вышеуказанными командами. Я пишу и читаю псевдослучайные данные, прыгающие, чтобы заполнить их мусором. Сколько данных зависит от размера кэш HDD может быть. Я использую /dev / urandom, потому что это быстро, и нам все равно правда рандоме. Я создаю /mnt/test / temp-hddread.ТМП с самого начала и использовать его каждый раз, когда я хочу прочитать достаточно случайных данных. Я создаю и удаляю /mnt/test / temp-hddwrite.ТМП каждый раз, когда я хочу написать достаточно случайных данных.

кредиты

я написал этот ответ, основанный на лучших частях существующих ответов.

Источник

Оцените статью