Повышение производительности репозитория git с сотнями тысяч небольших файлов

Я пытаюсь повысить производительность репозитория git, который почти исключительно используется мной для создания версий проекта научных вычислений. Программное обеспечение для моделирования проекта загружает небольшие (менее 100 КБ) текстовые файлы в довольно глубокие каталоги, представляя отдельные, относительно экономичные результаты моделирования. Я указываю, что они экономичны, чтобы показать, что я могу создать многие тысячи в течение короткого промежутка времени, а это означает, что ситуация будет только ухудшаться. Эти симуляции запускаются в виде пакетов, что может означать, что отдельные коммиты могут включать несколько сотен МБ данных, и все в форме этих глубоких поддеревьев, заполненных крошечными текстовыми файлами. Институциональный вычислительный кластер, на котором я это запускаю, использует массив жестких дисков RAID6 емкостью 33 ТБ для хранения всех данных моей группы (если это имеет значение, на данный момент этот диск не имеет огромного запаса в процентах — около 1,6 ТБ).

Я разумно уверен, что это плохая производительность со стороны массива RAID6, потому что когда я запускаю git add . верхнего уровня, это может занять десятки минут, даже если изменилось всего несколько файлов. Совершать так же плохо. Отправка после того, как что-то зафиксировано, обычно все еще занимает минуты, но немного быстрее (и медленная часть отправки — это не та часть, где данные отправляются по сети). Выполнение всего этого в интерактивном сеансе, когда я запросил дополнительные ядра, также ускоряет процесс, но добавление новых результатов моделирования может занять несколько минут. Когда я делаю то же самое на своем ноутбуке, в котором установлен современный твердотельный накопитель NVME-PCIE, эти операции занимают секунды.

Итак, какой-нибудь совет? Я посмотрел на git lfs, но не уверен, что это поможет мне тонну, потому что указатели, которые он будет создавать, не в миллион раз меньше, чем файлы, на которые они будут указывать, что является нормальным вариантом использования. Если люди все еще думают, что это поможет, я думаю, я могу попробовать. Кроме того, если это имеет значение, Linux кластера старый (конечно), поэтому: git version 1.8.3.1...

С удовольствием добавим больше контекста, если это необходимо. РЕДАКТИРОВАТЬ git count-objects -vH возвращает:

count: 1
size: 4.00 KiB
in-pack: 229216
packs: 1
size-pack: 1.25 GiB
prune-packable: 0
garbage: 0
size-garbage: 0 bytes

P.S. Я добавил тег large-data, несмотря на то, что мои данные легко помещаются на носителе данных одного устройства. Я добавил его, потому что данные стали достаточно большими/сложными, чтобы стать громоздкими, как объясняется в сообщении. Если люди считают, что это действительно неуместно, я могу удалить это.


person LGS    schedule 29.03.2021    source источник
comment
Это не просто старо, 5 лет — это древность с точки зрения Git. Я читал об улучшениях, сделанных специально для репозиториев со многими файлами в более поздних выпусках. Рассмотрите возможность обновления установки Git кластера. См. stackoverflow.com/questions/46920246/   -  person CodeCaster    schedule 29.03.2021
comment
Эту рану я не в силах исцелить. Я могу попросить об этом, но я думаю, что мне нужно двигаться вперед своим ходом. Я не думаю, что это слишком старо, чтобы использовать git lfs. Как вы думаете, производительность в моей ситуации была бы существенно лучше, если бы у меня был более свежий мерзавец?   -  person LGS    schedule 29.03.2021
comment
Ах, наши ответы были не синхронизированы. Я спрошу у своего ИТ, возможно ли обновление.   -  person LGS    schedule 29.03.2021
comment
Да, я отредактировал после того, как вы ответили, и вы отредактировали после этого. Насколько я знаю, за последние несколько лет Microsoft внесла в Git различные улучшения производительности, потому что у них есть репозитории с десятками, если не сотнями тысяч исходных файлов (см. devblogs.microsoft.com/devops/). Ваша версия 2015 года старше тех улучшений, которые, я считаю, были среди других значительных улучшений. Конечно, время доступа к вашему диску NVMe поможет, но какая версия работает на этом ноутбуке? Попробуйте сравнить с 1.8.3.1 на ноуте.   -  person CodeCaster    schedule 29.03.2021
comment
Ха, неплохая идея. Мой родной гит на ноуте намного новее-git version 2.25.1. Я считаю, что это родная версия последней версии Ubuntu 20.04, которой является мой ноутбук. Интересно, смогу ли я безболезненно откатиться к старому мерзавцу...   -  person LGS    schedule 29.03.2021
comment
Кроме того, я не совсем уверен, что репозитории git обратно совместимы, то есть что репозиторий, созданный с этой версией 2.25, по-прежнему читается с версией 1.8. Это должно быть, но не уверен, что материал продолжает работать, поэтому убедитесь, что у вас есть копия (и/или основной поток).   -  person CodeCaster    schedule 29.03.2021
comment
Я использовал conda-forge для локальной установки git 2.30.2 и попытался запустить gc, что, как я знаю, исторически занимало много времени для этого репозитория. С новыми обновлениями я не вижу больших улучшений. Я использовал утилиту unix время от времени gc, и результат был: ``` real 62m11.552s user 231m51.624s sys 0m10.071s   -  person LGS    schedule 29.03.2021
comment
Форматирование репозитория обратно совместимо. Первый GC будет дорогим, но последующие (без --aggressive) должны быть быстрее.   -  person torek    schedule 30.03.2021
comment
Да, в качестве обновления, по крайней мере, вытягивания и слияния кажутся теперь намного быстрее. Я собираюсь «отвечать на это сам», если только @CodeCaster не захочет вместо этого написать то, что было сказано в комментариях, в поле ответа, чтобы я мог закрыть вопрос.   -  person LGS    schedule 30.03.2021
comment
Не стесняйтесь отвечать себе, это было просто предчувствие!   -  person CodeCaster    schedule 30.03.2021


Ответы (1)


Как указал @CodeCaster, git в моем кластере действительно был древним, и отчасти это было источником проблемы. Я не совсем уверен, что массив рейдов в кластере моей школы не просто какой-то медленный, но после обновления до более поздней версии git мои извлечения, нажатия, добавления и фиксации стали гораздо менее болезненными. Они перешли от десятков минут к нескольким секундам (что больше, чем скорость, к которой я привык).

Для чего это стоит, этот ответ SO убедил меня попробовать обновить git (опять же, спасибо @CodeCaster). Как указал @torek, репозитории обратно совместимы, поэтому не было проблем с обработкой моего репозитория, который обрабатывался git из 2015 года с git из этого года.

Если кто-то, читающий это, придет к выводу, что ему будет неудобно использовать это решение, потому что у них нет root в их общей инфраструктуре, мой подход состоял в том, чтобы использовать conda для установки другого git в среде conda, с которой я все равно работал. На момент написания этого поста conda install -c conda-forge git в чистой среде miniconda3 вы получите git 2.30.2, который достаточно актуален. Самое последнее обновление производительности, упомянутое в другом сообщении SO, относится к версии 2.24. Я предполагаю, что есть и другие способы локальной установки git, но в среде научных вычислений, где обычно есть локальная конда, доступная для пользователя без особых проблем, это казалось самым простым путем к более новой версии.

person LGS    schedule 02.04.2021