Записываемый 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?