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

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

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

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

Ответы

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

Вопрос в том, насколько долго вы требуете?

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

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

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

Ответ 5

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