Linux disk cache disable

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

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

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

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

Размер 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 вносим, например:

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

Источник

How to clear the buffer/pagecache (disk cache) under Linux

Are you facing a performance issue and you suspect it might be related to cache usage? High cache usage should not normally cause performance issues, but it might be the root cause in some rare cases.

What is Memory Cache

In order to speed operations and reduce disk I/O, the kernel usually does as much caching as it has memory By design, pages containing cached data can be repurposed on-demand for other uses (e.g., apps) Repurposing memory for use in this way is no slower than claiming pristine untouched pages.

What is the purpose of /proc/sys/vm/drop_caches

Writing to /proc/sys/vm/drop_caches allows one to request the kernel immediately drop as much clean cached data as possible. This will usually result in some memory becoming more obviously available; however, under normal circumstances, this should not be necessary.

How to clear the Memory Cache using /proc/sys/vm/drop_caches

Writing the appropriate value to the file /proc/sys/vm/drop_caches causes the kernel to drop clean caches, dentries and inodes from memory, causing that memory to become free.

1. In order to clear PageCache only run:

2. In order to clear dentries (Also called as Directory Cache) and inodes run:

3. In order to clear PageCache, dentries and inodes run:

Running sync writes out dirty pages to disks. Normally dirty pages are the memory in use, so they are not available for freeing. So, running sync can help the ensuing drop operations to free more memory.

Page cache is memory held after reading files. Linux kernel prefers to keep unused page cache assuming files being read once will most likely to be read again in the near future, hence avoiding the performance impact on disk IO.

dentry and inode_cache are memory held after reading directory/file attributes, such as open() and stat(). dentry is common across all file systems, but inode_cache is on a per-file-system basis. Linux kernel prefers to keep this information assuming it will be needed again in the near future, hence avoiding disk IO.

How to clear the Memory Cache using sysctl

You can also Trigger cache-dropping by using sysctl -w vm.drop_caches=[number] command.

1. To free pagecache, dentries and inodes, use the below command.

2. To free dentries and inodes only, use the below command.

3. To free the pagecache only, use the below command.

Источник

How to Disable Disk Write Caching in Ubuntu To Prevent Data Loss

This simple tutorial is going to show you how to disable disk write caching in Ubuntu to prevent data loss when you may experience power failure.

Enable write caching improves disk performance, but a power outage or equipment failure might result in data loss or corruption. It’s recommended only for disks with a backup power supply.

Some third-party programs require disk write caching to be enabled or disabled. If your disk are used for Event Store databases, it’s highly recommended to disable disk caching to help ensure that data is durable when the machine might experience a power, device or system failure.

In Ubuntu, it’s easy to check out whether disk caching is enabled on your disk or not by running below command:

Replace /dev/sda with your device and you’ll see below similar outputs:

Model=WDC WD3200BPVT-22JJ5T0, FwRev=01.01A01, SerialNo=WD-WX61EC1KZK99
Config=< HardSect NotMFM HdSw>15uSec SpinMotCtl Fixed DTR>5Mbs FmtGapReq >
RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=50
BuffType=unknown, BuffSize=8192kB, MaxMultSect=16, MultSect=off
CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=625142448
IORDY=on/off, tPIO=, tDMA=
PIO modes: pio0 pio3 pio4
DMA modes: mdma0 mdma1 mdma2
UDMA modes: udma0 udma1 udma2 udma3 udma4 udma5 *udma6
AdvancedPM=yes: unknown setting WriteCache=enabled
Drive conforms to: Unspecified: ATA/ATAPI-1,2,3,4,5,6,7

* signifies the current active mode

The words in red, WriteCache=enabled, means caching is enabled! To disable it, edit the “/etc/hdparm.conf” with your favorite editor, here I use vi as example:

Uncomment the line “#write_cache = off” (without quotes) by removing the # at its beginning. So it looks like:

# -W Disable/enable the IDE drive’s write-caching feature
write_cache = off

After that, restart your computer and check out the write caching status again to make sure it’s disabled.

Источник

ext4 отключить кэш диска

Имеется ли возможность отключения кэширования для раздела с файловой системой ext4 ? На нём расположены файлы БД, и кэш обеспечивается самой СУБД. Возникает ситуация, когда ненужный мне кэш ext4 занимает лишнюю память, провоцируя своппинг и общую потерю производительности.

CentOs 2.6.32-279.9.1.el6.x86_64 #1 SMP Tue Sep 25 21:43:11 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux СУБД Progress (OpenEdge)

На нём расположены файлы БД, и кэш обеспечивается самой СУБД

use raw devices, Luke

1. В ФС нет кэша по сути, есть page cache данных с диска, он независим от FS.

2. Выставь vm.swappiness=0 и кеш ни при каких условиях не будет вызывать своппинг т.к. будет очищаться при первом требовании.

В общем проблема надуманная.

1. В ФС нет кэша по сути, есть page cache данных с диска, он независим от FS.

значит я неверно диагностировал причину своппинга, но для СУБД я выделяю буфер 32 гига (из семидесяти), что-то же «отжирает остальное. » может быть как раз page cache

2. Выставь vm.swappiness=0 и кеш ни при каких условиях не будет вызывать
своппинг т.к. будет очищаться при первом требовании

выставлял 1-ку, попробую 0

Имеется ли возможность отключения кэширования для раздела с файловой системой ext4 ?

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

сейчас стоИт RAID из четырёх дисков SSD.

База лежит на раиде ssd, операционка на раиде SAS. Оперативки 72 гига, размер базы 460 гигов, клиентских подключений 600. Для буфера СУБД выделяю половину от оперативки. Все прекрасно работает, пока не появляется своп (расположен на SAS). Предположил, что причиной свопа явился кэш файловой системы. Иными словами цель — определить что занимает оставшуюся оперативку и прекратить своппинг. Нууу, и совсем шикарно было бы использовать под буфер СУБД не половину оперативы, а бОльшую ее часть.

Отключи своп вообще, если он тебе мешает.

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

Отлично себе поведёт, это же не винда.

Предположил, что причиной свопа явился кэш файловой системы.

Источник

Как уменьшить дисковый кеш на linux?

Здравствуйте. У меня в ноутбуке с linux установлено 16 гб ОЗУ. Когда запускаю несколько программ, редактор кода, 40 вкладок в хроме, то всё начинает тормозить и новые программы просто не могут открыться, и в сведениях об использовании памяти написано свободно около 150 — 200 мб. При этом кэш дисков никогда меньше чем 60% от общего количества не занимает, всегда только больше (смотрю это в там же).

Из той информации, что я нашел — дисковый кэш должен отдавать часть памяти каждый раз, когда программам памяти не хватает. Но повторюсь меньше 60% он не занимает, т.е. как я понял ничего он не отдаёт. Кто шарит, подскажите, я этот момент правильно понял?

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

  • Вопрос задан более двух лет назад
  • 875 просмотров

новые программы просто не могут открыться

и в сведениях об использовании памяти написано свободно около 150 — 200 мб

Вы считаете кеши свободной или несвободной памятью?

И почему если предыдущий вариант «второе», то вы думаете, что все тормозит из-за нехватки памяти?

Кэш считаю занятой памятью. Ведь в утилите написано, свободно 150 мб из 15гб. Из них 60% кэш.

А из-за чего может в такой ситуации тормозить? Я описал сценарий, что не открывается программа, пока не закроешь какую-нибудь другую.

Это неправильная позиция.
Операционная система использует эту память, так как это эффективнее, чем не использовать её, но отдаст, когда полностью свободная память закончится.
Считайте кеш полезной свободной памятью. А free — бесполезной свободной.

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

для начала убедитесь что проблема действительно в дисковом кеше(не swap), попробуйте его сбросить когда всё начинает тормозить:
sync && echo 1 > /proc/sys/vm/drop_caches
запуск от суперпользователя

еще с кешем можно сразу почистить inode и dentrie
sync && echo 3 > /proc/sys/vm/drop_caches
(данная команда включает в себя и команду приведенную выше)

Источник

Читайте также:  Openvpn �� ������������ linux
Оцените статью