Запись через RAM-диск или массовое кеширование файловой системы?

У меня есть программа, которая очень сильно поражает файловую систему, читает и записывает набор рабочих файлов. Файлы размером в несколько гигабайт, но не такие большие, чтобы не помещаться на RAM-диске. Машины, на которых работает эта программа, обычно являются блоками Ubuntu Linux.

Есть ли способ настроить файловый менеджер, чтобы иметь очень очень большой кеш, и даже кешировать записи, чтобы они попали на диск позже?

Или есть способ создать RAM-диск с возможностью записи на реальный диск?

5 ответов

Решение

По умолчанию Linux будет использовать свободную оперативную память (почти всю) для кэширования доступа к диску и будет задерживать запись. Эвристика, используемая ядром для определения стратегии кэширования, не идеальна, но победить их в конкретной ситуации нелегко. Кроме того, в журналируемых файловых системах (т.е. в настоящее время во всех файловых системах по умолчанию) фактическая запись на диск будет выполняться способом, устойчивым к сбоям; это подразумевает немного накладных расходов. Вы можете попробовать поиграть с параметрами файловой системы. Например, для ext3, попробуйте установить с data=writeback или даже async (эти параметры могут улучшить производительность файловой системы за счет снижения устойчивости к сбоям). Также используйте noatime уменьшить активность файловой системы.

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

Вы проверили, используют ли ваши диски встроенный кэш записи? Это может иметь существенное значение. В Linux вы можете переключать поведение с hdparm:

/sbin/hdparm -W 0 /dev/hda 0 Disable write caching
/sbin/hdparm -W 1 /dev/hda 1 Enable write caching

Очевидно, что если включено кэширование записи, существует вероятность потери или повреждения данных, если ваша система отключится из-за нечистоты (например, отключение питания).

С точки зрения программного обеспечения ядро ​​Linux использует два основных числа для параметризации поведения записи.

/proc/sys/vm/dirty_ratio
/proc/sys/vm/dirty_background_ratio

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

Вы можете создать виртуальный диск и RAID-1 с физическим разделом. Посмотрите на опции --write-главным образом и --write-behind. Вы можете использовать их для создания физического диска, с которого нельзя читать (только для записи), и для задания количества ожидающих операций записи соответственно.

Кроме того, посмотрите на документацию для pdflush. Здесь есть хорошая страница: http://www.westnet.com/~gsmith/content/linux-pdflush.htm (также ссылается на ire_and_curses). Помимо того, что упоминалось, вы, вероятно, захотите увеличить обмен до 100 в пользу дисковый кеш поверх свопа.

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

Вопрос здесь действительно в том, сколько прочности вам требуется?

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

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

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

Может быть, вам нужен RAM-диск на основе SSD?

Другие вопросы по тегам