Недолгие файлы сбрасываются к диску?

Можно сказать удару перехешировать:

hash -r
9
21.08.2013, 06:11
4 ответа

Простой эксперимент с помощью 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, синхронизация, нецикл.

# 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

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

5
27.01.2020, 20:06
  • 1
    Хорошая попытка. Теперь я убежден. Я также попробовал ext2 и получил тот же результат как Вы. Я изменил Вашу параллельную рабочую нагрузку ввода-вывода на последовательную и получил один short-lived-file-999 и 8 недолгого содержания -*. У кого-либо есть какое-либо объяснение? –  Wu Yongzheng 22.08.2013, 18:00
  • 2
    @msw сообщения: отредактированный в случае, если это было неясно. Иначе уточните. –  frostschutz 23.08.2013, 14:36
  • 3
    Это просто глупо. Файлы существуют одновременно, не было ничего для перезаписи, и файловые системы не перезаписывают удаленное содержание файла, поскольку выполнение так вредило бы производительности. Но любой ценой, использовать nbd и зарегистрируйте трафик (или похожий метод трассировки всех записей). –  frostschutz 23.08.2013, 23:33

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

Если Вы действительно хотите избежать записей на диск вообще, изучите tmpfs,

7
27.01.2020, 20:06
  • 1
    tmpfs является действительно подходящим вариантом в этом случае, но я все еще хочу знать, поскольку общий вопрос об операционной системе, данные записаны в диск (излишне)? –  Wu Yongzheng 21.08.2013, 08:29
  • 2
    Ваш вопрос должен был бы быть намного более конкретным, чем можно, вероятно, сформулировать для получения категорического ответа. Кэш-буфер добивается сложного компромисса между производительностью и персистентностью, которой нельзя ответить в кратком обзоре. Используя инструменты @AngryWombat перечислил Вас, мог измерить фактические записи под из Вашего определенного приложения, но существует столько факторов, которые могли заставить его варьироваться от выполненного для выполнения. –  msw 21.08.2013, 09:05
  • 3
    Ну, если pdflush прибывает после того, как файл удален. Запись его была бы ненужной. –  Wu Yongzheng 21.08.2013, 09:11

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

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

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

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

1
27.01.2020, 20:06

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

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

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

Некоторая теория

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

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

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

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

0
27.01.2020, 20:06
  • 1
    Спасибо за Ваш ответ. Кажется, что ext4 также задержал выделение. Это означает, что мой ответ НЕТ? (учитывая никакие забавные параметры конфигурации в другом месте). Это также означает, что мой ответ - ДА, если ext2 используется? примечание –  Wu Yongzheng 21.08.2013, 19:11
  • 2
    сомнений я думал бы, что даже с ext2 на современном ядре ответ будет НЕТ. Этот конкретный вопрос обсуждался много, и краткий взгляд на источник ядра показывает, что ext2 драйвер главным образом полагается на операции ядра "по умолчанию", чтобы сделать его материал (таким образом, все отложено из-за кэша блока). Я предполагаю, я должен обновить свой ответ, для включения некоторой дополнительной Превосходной информации –  oakad 22.08.2013, 07:04
  • 3
    Мой ext4, очевидно, не смонтирован с sync опция. Я никогда не делал бы этого. –  Wu Yongzheng 22.08.2013, 08:51
  • 4
    При маркировке inode грязного я предполагаю, что файловая система ответственна за маркировку соответствующей грязной страницы. Позже, когда inode удален, файловая система чистит грязную страницу? В противном случае данные будут сброшены к диску излишне. –  Wu Yongzheng 22.08.2013, 08:55
  • 5
    Неиспользованные блоки данных "выпущены", таким образом они прекращают быть грязными. Если Вы записали некоторый материал в файл, и затем усеченный это до сброса, спам мимо EOF просто исчезает (вид). С метаданными это не может быть настолько просто, потому что может быть различная торговля offs относительно целостности структур данных файловой системы. Между прочим, не очевидно из Вашего вопроса, что Вы всегда ожидаете полностью управлять своей платформой - большинство приложений обычно заканчивает тем, что работало на машинах неизвестной конфигурации, далеко от разработчика. –  oakad 22.08.2013, 09:59

Теги

Похожие вопросы