В 8 раз медленнее кошка для тех же файлов на том же диске, но в другом каталоге
У меня проблема с тем, что у меня в 8 раз более медленный доступ к набору файлов по сравнению с теми же файлами в другом каталоге на машине с Linux.
Файловая система представляет собой файловую систему RAID-5 объемом 36 ТБ, экспортированную из Dell PERC H810, и отформатирована в ext4. Машина имеет 256 ГБ оперативной памяти, и я использую OpenSuSE 12.3 с ядром 3.7.10-1.45-рабочий стол.
Проблема проявляется в чем-то простом, например "time cat slowdir/* > /dev/null", но "time cat fastdir/* > /dev/null" примерно в 8 раз быстрее. Я очищаю кэш ввода-вывода между тестами (echo 3 > /proc/sys/vm/drop_caches), чтобы это не повлияло на мои результаты.
И slowdir, и fastdir находятся в одной файловой системе и в одном родительском каталоге.
Вот еще несколько странностей о проблеме. Если я сделаю следующее, проблема не исчезнет в новом каталоге alsoslowdir:
- CD / parentdir
- cp -r slowdir alsoslowdir
- echo 3> / proc / sys / vm / drop_caches
- time cat alsoslowdir / *> / dev / null (BAD: занимает 8 минут)
Но если я создам новый каталог alsofastdir и скопирую в него все файлы, то этот метод будет в 8 раз быстрее:
- CD / parentdir
- Mkdir Alsofastdir
- cp slowdir / * alsofastdir /
- echo 3> / proc / sys / vm / drop_caches
- время кота alsofastdir/* > /dev/null (ХОРОШО: занимает 1 минуту)
Все файлы имеют размер от 7 до 15 МБ в каждом из каталогов, и существует несколько тысяч файлов с общим объемом 58 ГБ в каталоге.
Я проверил статистику /usr/sbin/filefrag для всех файлов в быстрых и медленных каталогах, и все они имеют 1 или 2 экстента, с примерно одинаковым количеством экстентов 1 и 2 между ними.
Что мне не хватает?
2 ответа
В своем "быстром" тесте вы показали, что копируете рекурсивно: cp -r slowdir alsoslowdir
В вашем "медленном" тесте вы копировали не с рекурсивным флагом, а с подстановочным знаком: cp slowdir/* alsofastdir/
У вас есть подкаталоги в slowdir? Не уверен на 100%, включает ли подстановочный знак также подкаталоги, но я вполне уверен, что это не так, и распространяется только на все соответствующие "объекты" в каталоге, что означает, что подкаталоги будут оставлены пустыми.
Вы можете повторить тест и с абсолютной уверенностью убедиться, что данные, содержащиеся в каждом каталоге, идентичны.
Если это ни к чему не приведет... Возможно, просто добавьте "fast" ко всем именам каталогов? (j/k) Посмотрите, как найти хороший инструмент для тестирования производительности - cat действительно не является хорошим методом для измерения IMO. Найдите инструмент, который позволяет настраивать потоки, размер ввода / вывода, микс для чтения / записи и т. Д., При этом тесты запускаются для определенного файла (извините, на данный момент никаких конкретных имен инструментов не приходит на ум).
Кстати, что даже привело вас к тестированию производительности в отдельных каталогах, как вы делаете? Я уверен, что было какое-то странное поведение, с которым вы столкнулись, чтобы начать это...
Предполагается, что структура каталогов абсолютно одинакова (и вы должны действительно это проверить), ваши результаты могут быть искажены путем кэширования (как на уровне контроллера, так и на уровне ОС) и / или разной разметки физического диска для двух каталогов.
Попробуй это:
- убедитесь, что у вас есть двоичный файл iostat (обычно он входит в пакет sysstat)
- сделать недействительным кеш PERC, выдав
dd if=/dev/zero of=bigfile bs=4k count=1M oflag=direct; sync
- аннулировать кэш ОС, выдав
sync; echo 3 > /proc/sys/vm/drop_caches
- собрать статистику диска выдачи
iostat -x -k 5 > stat.txt & cat dir/* > /dev/null; killall iostat
- повторите все эти шаги для другого каталога, загрузите статистику диска (для обоих каталогов) и дайте мне посмотреть их