Visual Studio langsam auf einer VPN-Freigabe: Warum Speichern zu Rundreisen wird
Das Bearbeiten über eine Freigabe macht Speichern, Menüs und Änderungsverfolgung zu Rundreisen. Verschieben Sie die Arbeitskopie lokal und bündeln Sie die Historie, statt sie abzulaufen.
Eine Lösung, die von einer lokalen Platte in einer Sekunde öffnet, braucht dreißig Sekunden von einer Freigabe, die über einen Tunnel erreicht wird. Der Tunnel ist selten die Ursache an sich. Was sich ändert, ist, dass Vorgänge, die lokale Aufrufe waren, zu synchronen Rundreisen werden, und der Editor führt mehrere davon aus, bevor das Fenster erscheint. Der folgende Mechanismus erklärt, warum jeder einzelne teuer ist und welche Sie entfernen können.
Was der Editor tut, während eine Datei geöffnet ist
Ein Editor mit Änderungsverfolgung hält ein Abonnement für jede geöffnete Datei. Ein lokales Volume bedient dieses Abonnement aus dem Dateisystem ohne Netzwerk. Über eine Freigabe kann dieselbe Funktion zu wiederholten Metadatenlesungen verkommen, weil sich das Benachrichtigungsmodell über SMB nicht gleich verhält. Die Änderungsverfolgung abzuschalten ist ein fairer erster Versuch, denn er entfernt eine ganze Klasse von Anforderungen, ohne den Tunnel anzutasten.
Das Projektsystem fügt eigenen Verkehr hinzu. Das Laden einer Lösung zählt Verzeichnisse auf, liest Projektdateien und prüft möglicherweise auf SDKs oder Pakete, und jede Prüfung ist eine Rundreise, wenn der Pfad entfernt liegt. Eine Lösung mit vielen Projekten vervielfacht diese Zahl, weshalb die Öffnungszeit schneller wächst, als die Dateigrößen vermuten lassen.
Shell-Abfragen, die ablaufen, bevor das Menü erscheint
Windows trägt eine zweite Ursache für Stockungen bei, die nichts mit der IDE zu tun hat. Der Explorer und seine Shell-Erweiterungen lösen Drucker, zugeordnete Laufwerke und zuvor verwendete Verknüpfungen jedes Mal neu auf, wenn ein Kontextmenü geöffnet wird. Liegen diese Ziele in einem Netz, das der Tunnel nicht erreicht, blockiert jede Auflösung, bis eine Zeitüberschreitung abläuft, und erst dann wird das Menü gezeichnet. Deshalb kann ein Rechtsklick sekundenlang hängen, während die Datei selbst normal öffnet.
Entfernen Sie die toten Zuordnungen und Druckerwarteschlangen oder behalten Sie nur die, die in dem Netz existieren, in dem Sie tatsächlich sind. Dieselbe Überlegung gilt für alles, was im Hintergrund einen Pfad auflöst, einschließlich Listen zuletzt verwendeter Dateien und angehefteter Ordner.
net use
Get-Printer | Select-Object Name, PortName
Measure-Command { Get-ChildItem \files\proj | Out-Null }
Warum eine lokale Arbeitskopie gewinnt
Direkt auf der Freigabe zu arbeiten ist die schlechteste Einrichtung für eine Schleife aus Bearbeiten, Bauen und Testen, weil Editor, Compiler und Versionsverwaltungsclient diese entfernten Dateien jeweils getrennt lesen. Jeder von ihnen zahlt seine eigene Rundreise, und ein Build zahlt einmal pro Datei. Eine lokale Kopie mit Push durch das Repository ersetzt eine Flut kleiner Überquerungen durch eine einzige bewusste. Die Verbindung ist nicht besser geworden; die Zahl der Überquerungen ist zusammengebrochen.
Das ist eine strukturelle Änderung und keine Tuning-Übung, und genau deshalb funktioniert sie, wenn Tunnel-Einstellungen es nicht tun. Sie macht auch den Fehlermodus offensichtlich: Wenn der Build mit einer lokalen Kopie immer noch langsam ist, war die Freigabe nie das Problem.
Verschieben Sie die Historie als ein Objekt
Wenn das Repository selbst den Tunnel überqueren muss, senden Sie die Historie als ein Objekt, statt sie abzulaufen. Ein Bundle ist eine einzige Datei und daher ein einziger Transfer, während ein Checkout, der Tausende loser Objekte abläuft, Tausende Überquerungen kostet. Mercurial und Git unterstützen beide diese Form.
hg bundle --base 9f2c1a7e outgoing.hg
hg unbundle outgoing.hg
git bundle create repo.bundle main
git clone repo.bundle repo
Die Basisrevision ist der Teil, den man richtig treffen muss, denn sie entscheidet, wie viel Historie reist. Alles zu bündeln funktioniert und verschwendet die Verbindung, während das Bündeln ab der letzten gemeinsamen Änderung nur das bewegt, was der anderen Seite fehlt.
Messen Sie drei Vorgänge, bevor Sie die Bandbreite beschuldigen
Messen Sie drei Dinge getrennt: eine kleine Datei geöffnet, ein Verzeichnis aufgelistet, ein Speichern abgeschlossen. Wenn alle drei im Verhältnis zur Dateianzahl langsam sind, sind die Kosten Rundreisen. Wenn eines hängt, während die anderen in Ordnung sind, vermuten Sie eine Zeitüberschreitung gegen eine unerreichbare Ressource und nicht die Bandbreite. Notieren Sie, in welchem Netz sich der Rechner bei jedem Lauf befand, denn ein Laptop, der sich mit einem anderen Profil neu verbindet, kann die Antwort zwischen Versuchen ändern.
Wiederholen Sie dann dieselben drei gegen eine lokale Kopie des Projekts. Der Unterschied ist der Preis der Freigabe, und das ist die Zahl, die man nennt, wenn jemand eine schnellere Verbindung als Lösung vorschlägt.