Visual Studio тормозит на общей папке через VPN: почему сохранение превращается в круговые рейсы
Правка через общую папку превращает сохранение, меню и отслеживание изменений в круговые рейсы. Перенесите рабочую копию локально и передавайте историю одним объектом, а не обходом.
Решение, которое открывается за секунду с локального диска, открывается за тридцать секунд с общей папки, доступной через туннель. Туннель редко бывает причиной сам по себе. Меняется то, что операции, которые были локальными вызовами, становятся синхронными круговыми рейсами, и редактор выполняет несколько из них до появления окна. Механизм ниже объясняет, почему каждый дорог и какие можно убрать.
Что делает редактор, пока файл открыт
Редактор с отслеживанием изменений держит подписку на каждый открытый файл. Локальный том обслуживает эту подписку из файловой системы без сети. Через общую папку та же функция может деградировать до повторных чтений метаданных, потому что модель уведомлений ведёт себя по-разному через SMB. Отключение отслеживания изменений — честный первый эксперимент, так как оно убирает целый класс запросов, не трогая туннель.
Система проектов добавляет свой трафик. Загрузка решения перебирает каталоги, читает файлы проекта и может проверять SDK или пакеты, и каждая проверка — круговой рейс, когда путь удалённый. Решение со множеством проектов умножает это число, поэтому время открытия растёт быстрее, чем предполагают размеры файлов.
Поиски оболочки, которые истекают до появления меню
Windows добавляет второй источник зависаний, не имеющий отношения к IDE. Проводник и его расширения оболочки заново разрешают принтеры, подключённые диски и ранее использованные ярлыки каждый раз, когда открывается контекстное меню. Когда эти цели находятся в сети, до которой туннель не достаёт, каждое разрешение блокируется до истечения тайм-аута, и только потом меню отрисовывается. Поэтому щелчок правой кнопкой может зависать на секунды, пока сам файл открывается нормально.
Удалите мёртвые подключения и очереди печати или оставьте только те, что существуют в сети, в которой вы действительно находитесь. То же рассуждение охватывает всё, что в фоне разрешает путь, включая списки недавних файлов и закреплённые папки.
net use
Get-Printer | Select-Object Name, PortName
Measure-Command { Get-ChildItem \files\proj | Out-Null }
Почему побеждает локальная рабочая копия
Работа прямо на общей папке — худшая конфигурация для цикла правки, сборки и теста, потому что редактор, компилятор и клиент контроля версий читают эти удалённые файлы каждый отдельно. Каждый из них платит за свой круговой рейс, а сборка платит один раз на файл. Локальная копия с отправкой через репозиторий заменяет поток мелких пересечений одним намеренным. Линия не улучшилась; число пересечений рухнуло.
Это структурное изменение, а не упражнение по настройке, и именно поэтому оно работает, когда настройки туннеля не работают. Оно также делает режим отказа очевидным: если сборка с локальной копией всё ещё медленная, общая папка никогда не была проблемой.
Переносите историю одним объектом
Когда сам репозиторий должен пересечь туннель, отправляйте историю одним объектом, а не обходом. Пакет — это один файл и потому одна передача, тогда как checkout, обходящий тысячи свободных объектов, стоит тысячи пересечений. Mercurial и Git оба поддерживают такую форму.
hg bundle --base 9f2c1a7e outgoing.hg
hg unbundle outgoing.hg
git bundle create repo.bundle main
git clone repo.bundle repo
Базовая ревизия — та часть, которую нужно угадать точно, потому что она решает, сколько истории путешествует. Упаковка всего работает и тратит линию, тогда как упаковка от последнего общего изменения переносит только то, чего не хватает другой стороне.
Измерьте три операции, прежде чем винить пропускную способность
Измерьте три вещи отдельно: один небольшой файл открыт, один каталог перечислен, одно сохранение завершено. Если все три медленны пропорционально числу файлов, затраты — это круговые рейсы. Если одна застревает, а остальные в порядке, подозревайте тайм-аут к недоступному ресурсу, а не пропускную способность. Запишите, в какой сети была машина при каждом запуске, потому что ноутбук, заново подключающийся к другому профилю, может изменить ответ между попытками.
Затем повторите те же три против локальной копии проекта. Разница — это цена общей папки, и именно эту цифру стоит приводить, когда кто-то предлагает более быструю линию как решение.