Запись в подпапку происходит быстрее, чем в родительскую.

Запись в подпапку происходит быстрее, чем в родительскую.

Я использую dd для измерения производительности записи и заметил нечто странное: запись в /data/emzed2 происходит быстрее, чем запись в /data. Вот как я измерял производительность:

$ dd если=/dev/нольиз=/data/emzed2/testfileбс=32

^C4921834+0 записей в

4921834+0 записей из 157498688 байт (157 МБ) скопировано, 2,87329 с,54,8 МБ/с

$ dd если=/dev/нольиз=/data/testfileбс=32

^C2487991+0 записей в

2487991+0 записей из 79615712 байт (80 МБ) скопировано, 2,6501 с,30,0 МБ/с

Обе папки находятся на одном разделе SSD-диска. Я использую Ubuntu 14.04 и повторил эксперимент несколько раз с похожими результатами.

Есть идеи, что происходит?

решение1

Похоже, что вас задели оптимизации ext4. Некоторые из них описаны вРазметка диска Ext4документация.

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

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

Пятый трюк заключается в том, что том диска разбивается на группы блоков по 128 МБ. […] Когда в корневом каталоге создается каталог, распределитель inode сканирует группы блоков и помещает этот каталог в наименее загруженную группу блоков, которую он может найти.

В результате, emzed2вероятно, был создан пустой блок размером 128 МБ.

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

Следовательно, /data/testfileсоздается в (вероятно, сильно загруженной) корневой группе блоков, в то время как /data/emzed2/testfileсоздается в (вероятно, пустой) emzed2группе блоков.

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

Для /data/emzed2/testfileфайловая система сначала выделит все блоки данных в emzed2группе блоков. Если этот блок изначально был пуст, для первых 128 МБ это означает полное отсутствие фрагментации. Для /data/testfileфайловая система сначала заполнит корневую группу блоков, если она еще не заполнена, а затем будет искать другие места для хранения данных.

Кроме того, вы увеличиваете файл на 32 байта за раз. К счастью, файловые системы, такие как ext4, выделяют больше данных, чем вы запрашиваете (кусками по 8 Кб в случае ext4) и пытаются отложить выделение. Вероятно, вы увидите похожую картину с bs=8196, но разница в скорости может уменьшиться при большем размере блока.

Связанный контент