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
Базова ревізія — це частина, яку треба влучити, бо вона вирішує, скільки історії подорожує. Пакування всього працює і марнує лінію, тоді як пакування від останньої спільної зміни переносить лише те, чого бракує іншій стороні.
Виміряйте три операції, перш ніж звинувачувати пропускну здатність
Виміряйте три речі окремо: один малий файл відкрито, один каталог перелічено, одне збереження завершено. Якщо всі три повільні пропорційно кількості файлів, витрати — це кругові рейси. Якщо одна застрягає, а інші гаразд, підозрюйте тайм-аут до недосяжного ресурсу, а не пропускну здатність. Запишіть, у якій мережі була машина під час кожного запуску, бо ноутбук, що знову підключається до іншого профілю, може змінити відповідь між спробами.
Потім повторіть ті самі три проти локальної копії проєкту. Різниця — це ціна спільної папки, і саме цю цифру варто наводити, коли хтось пропонує швидшу лінію як рішення.