Низкая производительность msysGit на подключенном сетевом диске
У меня есть веб-сервер разработки, каталог приложения которого сопоставлен с моим локальным компьютером как диск Z: (например, \\web_server\wwwroot). Для доступа к общей папке требуются учетные данные домена (моя учетная запись домена является совладельцем этой папки).
Я умею читать и писать файлы нормально, но производительность msysGit низкая.
Веб сервер:
patrick@web_server /c/inetpub/wwwroot (master) $ time git status > /dev/null
real 0m1.887s
user 0m0.015s
sys 0m0.015s
Локальный компьютер (доступ к подключенному сетевому диску Z)
patrick@local_machine /z (master) $ time git status > /dev/null
real 0m25.500s
user 0m0.000s
sys 0m0.015s
Итак, как я могу выяснить причину 25-секундного зависания?
2 ответа
git status
это команда, которая читает и пишет много файлов Сетевое хранилище, даже через некоторые подключения к локальной сети, может быть неприемлемо медленным при работе с большим количеством файлов, большим количеством данных или обоими.
Проблема в том, что SMB (Server Message Block, также известный как Samba, также известный как Windows File Sharing) - это очень "болтливый" протокол, отправляющий множество маленьких пакетов назад и вперед, и он требует загрузки "ходов приложений", что увеличивает масштаб больше данных вам нужно. "Поворот" - это двустороннее путешествие между клиентом и сервером.
Несколько вещей:
Пытаться
ping
Использование удаленного хоста с локального компьютера. Если это больше, чем 5 миллисекунд, сетевое хранилище, вероятно, не подходит для гораздо большего, чем загрузка нескольких килобайт в несколько файлов. Также проверьте джиттер и потерю пакетов. Джиттер - это когда пинг сильно варьируется между различными значениями, а потеря пакета - это когда пинг полностью отбрасывается (на него не реагируют). Оба очень плохие нарушения, почти так же плохо, как задержка.Попробуйте использовать WireShark для наблюдения за трафиком между вашим хостом и маршрутизатором при выполнении
git status
, Вероятно, вы увидите много TCP-запросов, которые выглядят примерно так:Пакет выходит из вашей машины
- Ваша машина ждет (ничего не делает)
- Сервер отправляет ответ
Для каждого пакета, исходящего с вашего компьютера и предназначенного для удаленного блока, пометьте этот пакет "O" как "исходящий". Для каждого пакета, исходящего из удаленного блока и предназначенного для вашего компьютера, пометьте этот пакет "I" как "входящий".
- Подсчитайте количество пакетов "I" в строке без промежуточных пакетов "O".
- Подсчитайте количество пакетов "O" в строке без промежуточных пакетов "I".
- Придумайте примерное соотношение количества пакетов "I" к количеству пакетов "O".
- Если вы читаете (скачиваете) файлы, и соотношение не в пользу пакетов "I" (пакетов, поступающих на ваш компьютер), то протокол является болтливым.
- Если вы пишете (загружаете или изменяете) файлы, а соотношение не в пользу "O" -пакетов (пакетов, исходящих с вашего компьютера), то протокол является болтливым.
- Проверьте размер каждого пакета относительно ожидаемой пропускной способности соединения при необработанной загрузке HTTP большого файла.
- Умножьте задержку на количество циклов и добавьте время передачи файлов, чтобы получить некоторое число, которое должно составлять около 25 секунд.
Решение: уменьшите время ожидания, или используйте более новую версию протокола SMB, поддерживаемую более новыми версиями Windows Server (с меньшим количеством обращений к приложениям и, следовательно, более высокой производительностью по глобальной сети), или используйте что-то вроде FTP, который имеет очень низкий уровень чата (но все же большие накладные расходы при доступе ко многим файлам), или просто работайте на сервере напрямую и передавайте данные только по мере необходимости (например, zip-файлы) на удаленный сервер.
Посмотрите этот вопрос, чтобы узнать, что можно сделать для ускорения работы сетевого диска, например, перевести его в режим "медленной связи", чтобы файлы в конечном итоге синхронизировались. Это очень помогает, потому что вы читаете и пишете на локальный диск, а не в сеть.