В 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. Найдите инструмент, который позволяет настраивать потоки, размер ввода / вывода, микс для чтения / записи и т. Д., При этом тесты запускаются для определенного файла (извините, на данный момент никаких конкретных имен инструментов не приходит на ум).

Кстати, что даже привело вас к тестированию производительности в отдельных каталогах, как вы делаете? Я уверен, что было какое-то странное поведение, с которым вы столкнулись, чтобы начать это...

Предполагается, что структура каталогов абсолютно одинакова (и вы должны действительно это проверить), ваши результаты могут быть искажены путем кэширования (как на уровне контроллера, так и на уровне ОС) и / или разной разметки физического диска для двух каталогов.

Попробуй это:

  1. убедитесь, что у вас есть двоичный файл iostat (обычно он входит в пакет sysstat)
  2. сделать недействительным кеш PERC, выдав
    dd if=/dev/zero of=bigfile bs=4k count=1M oflag=direct; sync
  3. аннулировать кэш ОС, выдав
    sync; echo 3 > /proc/sys/vm/drop_caches
  4. собрать статистику диска выдачи
    iostat -x -k 5 > stat.txt & cat dir/* > /dev/null; killall iostat
  5. повторите все эти шаги для другого каталога, загрузите статистику диска (для обоих каталогов) и дайте мне посмотреть их
Другие вопросы по тегам