En lösning som öppnas på en sekund från en lokal disk tar trettio sekunder från en delning som nås genom en tunnel. Tunneln är sällan orsaken i sig. Det som ändras är att åtgärder som var lokala anrop blir synkrona rundturer, och editorn utför flera av dem innan fönstret visas. Mekanismen nedan förklarar varför var och en är dyr och vilka du kan ta bort.

Vad editorn gör medan en fil är öppen

En editor med ändringsspårning håller en prenumeration på varje fil den har öppen. En lokal volym betjänar den prenumerationen från filsystemet utan nätverk. Över en delning kan samma funktion degenerera till upprepade metadataläsningar, eftersom aviseringsmodellen inte beter sig likadant över SMB. Att stänga av ändringsspårning är ett rimligt första experiment, eftersom det tar bort en hel klass av förfrågningar utan att röra tunneln.

Projektsystemet lägger till sin egen trafik. Inläsning av en lösning räknar upp kataloger, läser projektfiler och undersöker kanske SDK:er eller paket, och varje undersökning är en rundtur när sökvägen är fjärransluten. En lösning med många projekt multiplicerar det antalet, och därför växer öppningstiden snabbare än filstorlekarna antyder.

Skalningsuppslag som löper ut innan menyn visas

Windows bidrar med en andra källa till stopp som inte har något med IDE:n att göra. Utforskaren och dess skalutbyggnader löser om skrivare, mappade enheter och genvägar som använts tidigare varje gång en snabbmeny öppnas. När dessa mål ligger på ett nätverk som tunneln inte når, blockerar varje upplösning tills en tidsgräns löper ut, och först då ritas menyn. Därför kan en högerklick hänga i sekunder medan själva filen öppnas normalt.

Ta bort de döda mappningarna och skrivarköerna, eller behåll bara dem som finns på nätverket du faktiskt är på. Samma resonemang täcker allt som löser en sökväg i bakgrunden, inklusive listor över senaste filer och fästa mappar.

net use
Get-Printer | Select-Object Name, PortName
Measure-Command { Get-ChildItem \files\proj | Out-Null }

Varför en lokal arbetskopia vinner

Att arbeta direkt på delningen är den sämsta uppsättningen för en loop med redigering, bygge och test, eftersom editorn, kompilatorn och versionshanteringsklienten var och en läser dessa fjärrfiler separat. Var och en betalar sin egen rundtur, och ett bygge betalar en gång per fil. En lokal kopia med push genom repositoriet ersätter en flod av små överfarter med en enda avsiktlig. Förbindelsen har inte blivit bättre; antalet överfarter har kollapsat.

Det är en strukturell förändring och inte en trimningsövning, och det är just därför det fungerar när tunnelinställningar inte gör det. Det gör också felläget uppenbart: om bygget fortfarande är långsamt med en lokal kopia var delningen aldrig problemet.

Flytta historiken som ett objekt

När repositoriet självt måste korsa tunneln, skicka historiken i ett objekt i stället för att gå igenom den. Ett bundle är en enda fil och därmed en enda överföring, medan en checkout som går igenom tusentals lösa objekt kostar tusentals överfarter. Mercurial och Git stöder båda den formen.

hg bundle --base 9f2c1a7e outgoing.hg
hg unbundle outgoing.hg
git bundle create repo.bundle main
git clone repo.bundle repo

Basrevisionen är den del som måste träffas, eftersom den avgör hur mycket historik som reser. Att bunta allt fungerar och slösar med förbindelsen, medan buntning från den senaste gemensamma ändringen bara flyttar det den andra sidan saknar.

Mät tre åtgärder innan du skyller på bandbredden

Mät tre saker separat: en liten fil öppnad, en katalog listad, en sparning slutförd. Om alla tre är långsamma i proportion till filantalet är kostnaden rundturer. Om en fastnar medan de andra är bra, misstänk en tidsgräns mot en onåbar resurs och inte bandbredd. Notera vilket nätverk maskinen var på vid varje körning, eftersom en bärbar dator som återansluter till en annan profil kan ändra svaret mellan försök.

Upprepa sedan samma tre mot en lokal kopia av projektet. Skillnaden är priset för delningen, och det är talet som ska citeras när någon föreslår en snabbare förbindelse som lösningen.

Relaterade artiklar