Низкая производительность 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-файлы) на удаленный сервер.

Посмотрите этот вопрос, чтобы узнать, что можно сделать для ускорения работы сетевого диска, например, перевести его в режим "медленной связи", чтобы файлы в конечном итоге синхронизировались. Это очень помогает, потому что вы читаете и пишете на локальный диск, а не в сеть.

Другие вопросы по тегам