Я использую 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
, но разница в скорости может уменьшиться при большем размере блока.