Кратковременные файлы сбрасываются на диск?

9

Моя программа создает много небольших недолговечных файлов. Как правило, они удаляются в течение секунды после создания. Файлы находятся в файловой системе ext4, поддерживаемой настоящим жестким диском. Я знаю, что Linux периодически сбрасывает ( pdflush) грязные страницы на диск. Поскольку мои файлы недолговечны, скорее всего они не кэшируются pdflush. У меня вопрос, вызывает ли моя программа много записей на диск? Моя забота - это жизнь моего жесткого диска.

Поскольку файлы небольшие, давайте предположим, что сумма их размеров меньше, чем dirty_bytesи dirty_background_bytes.

В Ext4 включен журнал по умолчанию, т.е. журнал метаданных. Я также хочу знать, записаны ли метаданные или данные на диск.

У Юнчжэн
источник
> Моя программа создает много маленьких недолговечных файлов, сколько стоит «много»? Вы удаляете эти файлы или переписываете файлы? > Я также хочу знать, записаны ли метаданные или данные на диск. Я считаю, что режим метаданных по умолчанию упорядочен, то есть метаданные фиксируются до того, как данные записываются на диск. Конечно, есть опции монтирования, которые вы можете добавить, чтобы изменить это. > Мой вопрос: моя программа вызывает много записей на диск? на это сложно ответить, учитывая предоставленную вами информацию. Рассматривали ли вы использование таких инструментов, как iotop и sysstat для мониторинга дискового ввода-вывода?
AngryWombat
ReiserFS лучше подходит для крошечных файлов, если вы действительно хотите, чтобы они попадали на диск. Tmpfs - это хорошо, если вам все равно
xenoterracide
Некоторые уточнения: (1). файловая система ext4 не смонтирована с syncопцией. Вы можете рассмотреть установленную по умолчанию Fedora, Debian или Ubuntu. Вы выбираете один. (2). Каждый файл составляет около 60 КБ. (3). Около 1000 файлов создаются и удаляются в секунду, но в любое время существует не более 10 файлов. Другими словами, пропускная способность ввода / вывода велика, но занимаемое пространство мало.
Ву Юнчжэн

Ответы:

5

Простой эксперимент с использованием ext4:

Создать изображение размером 100 МБ ...

# dd if=/dev/zero of=image bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.0533049 s, 2.0 GB/s

Сделать это петлей устройства ...

# losetup -f --show image
/dev/loop0

Сделай файловую систему и смонтируй ...

# mkfs.ext4 /dev/loop0
# mount /dev/loop0 /mnt/tmp

Сделайте какой-нибудь запуск с недолговечными файлами. (Измените это на любой метод, который вы предпочитаете.)

for ((x=0; x<1000; x++))
do
    (echo short-lived-content-$x > /mnt/tmp/short-lived-file-$x
     sleep 1
     rm /mnt/tmp/short-lived-file-$x ) &
done

Размонтировать, синхронизировать, разблокировать.

# umount /mnt/tmp
# sync
# losetup -d /dev/loop0

Проверьте содержимое изображения.

# strings image | grep short-lived-file | tail -n 3
short-lived-file-266
short-lived-file-895
short-lived-file-909
# strings image | grep short-lived-content | tail -n 3

В моем случае он перечислил все имена файлов, но не содержимое файла. Так что только содержание не было написано.

frostschutz
источник
Хорошая попытка. Теперь я убежден. Я также попробовал ext2, и получил тот же результат, что и вы. Я изменил вашу рабочую нагрузку параллельного ввода-вывода на последовательную и получил один недолговечный файл-999 и 8 недолговечный-контент- *. У кого-нибудь есть объяснение?
Ву Юнчжэн
@msw: отредактировано на случай, если неясно. В противном случае, пожалуйста, уточните.
frostschutz
Это просто глупо. Файлы существуют одновременно, нечего было перезаписывать, и файловые системы не перезаписывают содержимое удаленных файлов, так как это может снизить производительность. Но во что бы то ни стало, используйте nbdи регистрируйте трафик (или аналогичный метод отслеживания всех записей).
frostschutz
7

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

Если вы действительно хотите избежать записи на диск, посмотрите tmpfs ,

MSW
источник
2
tmpfs действительно хорошо подходит в этом случае, но я все же хочу знать, как общий вопрос операционной системы: записываются ли данные на диск (без необходимости)?
У Юнчжэн
Ваш вопрос должен быть гораздо более конкретным, чем вы могли бы сформулировать, чтобы получить окончательный ответ. Буферный кэш обеспечивает сложный компромисс между производительностью и постоянством, на который невозможно ответить абстрактно. Используя перечисленные инструменты @AngryWombat, вы можете измерить фактическую запись в вашем конкретном приложении, но существует множество факторов, которые могут варьировать от запуска к запуску.
MSS
Хорошо, если pdflush приходит после удаления файла. Написание было бы ненужным.
У Юнчжэн
1

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

  1. Данные устаревают после /proc/sys/vm/dirty_writeback_centisecs, по умолчанию 5 секунд.

  2. В кеше слишком мало памяти для хранения данных, больше, чем в dirty_ratioгрязных страницах (по умолчанию 20%).

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

psusi
источник
0

Возможность записи на диск недолговечных файлов зависит не только от поведения файлового кэша ядра по умолчанию, но также от деталей реализации драйвера файловой системы и параметров монтирования указанной файловой системы. Можно настроить систему таким образом, чтобы все всегда было немедленно записано на диск (по сути, DOS-подобное поведение).

Одна файловая система, в которой заметно интересующее вас поведение (так называемое «отложенное размещение») - это XFS. С его помощью вы можете быть более или менее уверены (если в другом месте нет забавных вариантов конфигурации), что блоки, принадлежащие только что удаленным файлам, будут повторно использоваться в памяти без промежуточного доступа к диску. XFS может по-прежнему хотеть обновить свой журнал метаданных (который будет записываться на диск довольно часто; тем не менее, учитывая, что журнал XFS является только метаданными, он достаточно мал, чтобы быть установленным на каком-то другом быстром устройстве, например, на найденном ОЗУ с резервным питанием от батареи). на многих RAID контроллерах).

Из-за этого поведения весьма часто можно найти полностью обнуленные, но в остальном законно выглядящие файлы (размер и другие метаданные без изменений) в файловой системе XFS после внезапного отключения питания. Такова стоимость поддержки быстрых «временных» файловых операций.

Немного теории

В общем, системный вызов, обращающийся к файловой системе, довольно быстро завершается в методе, определяемом драйвером файловой системы (присоединяется к «struct inode_operations» и «struct file_operations», когда VFS-драйвер зарегистрирован). То, что происходит после этого, остается исключительно на усмотрение реализации файловой системы. Обычно используется нечто похожее на следующий подход (этот простой пример взят из драйвера Linux FAT):

if (IS_DIRSYNC(dir))
    (void)fat_sync_inode(dir);
else
    mark_inode_dirty(dir);

Если файловая система смонтирована в режиме синхронизации, все изменения немедленно отправляются на диск (в данном случае через fat_sync_inode ()). В противном случае блок помечается как «грязный» и остается в кэше памяти, пока не будет сброшен при некоторой разумной возможности.

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

oakad
источник
Спасибо за Ваш ответ. Похоже, ext4 также имеет отложенное размещение. Значит ли это, что мой ответ НЕТ? (в другом месте нет забавных опций конфигурации). Означает ли это также, что мой ответ ДА, если используется ext2?
Ву Юнчжэн
Я думаю, что даже с ext2 на современном ядре ответ будет НЕТ. Эта конкретная проблема много обсуждалась, и краткий взгляд на исходный код ядра показывает, что драйвер ext2 в основном полагается на операции ядра «по умолчанию», чтобы выполнять свою работу (таким образом, все задерживается кешем блоков). Я полагаю, я должен обновить свой ответ, чтобы включить некоторую дополнительную информацию.
Oakad
Мой ext4 явно не смонтирован с syncопцией. Я бы никогда этого не сделал.
У Юнчжэн
Когда я отмечаю грязный индекс, я предполагаю, что файловая система отвечает за маркировку соответствующей страницы как грязной. Позже, когда индекс удаляется, очищает ли файловая система грязную страницу? Если нет, данные будут записаны на диск без необходимости.
У Юнчжэн
2
Неиспользуемые блоки данных «освобождаются», поэтому они перестают быть грязными. Если вы записали какой-то материал в файл, а затем обрезали его до сброса, мусор за EOF просто исчезает (вроде). С метаданными это может быть не так просто, потому что могут быть различные компромиссы в отношении целостности структур данных файловой системы. Кстати, из вашего вопроса не очевидно, что вы всегда ожидаете полного контроля над вашей платформой - большинство приложений обычно работают на машинах неизвестной конфигурации, в стороне от разработчика.
дубад