6

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

$ dd if =/dev/zero of =/data/emzed2/testfile bs = 32

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

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

$ dd if =/dev/zero of =/data/testfile bs = 32

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

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

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

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

1 ответ1

4

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

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

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

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

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

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

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .