VPN 공유에서 Visual Studio가 느린 이유: 저장이 왕복이 되는 까닭
공유를 통한 편집은 저장, 메뉴, 변경 내용 추적을 왕복으로 바꿉니다. 작업 복사본을 로컬로 옮기고, 기록은 훑는 대신 하나의 객체로 묶어 보내세요.
로컬 디스크에서 일 초에 열리는 솔루션이 터널을 거쳐 도달하는 공유에서는 삼십 초가 걸려 열린다. 터널 자체가 원인인 경우는 드물다. 달라지는 것은 로컬 호출이던 작업이 동기식 왕복이 된다는 점이며, 편집기는 창이 나타나기 전에 그중 몇 개를 수행한다. 아래 메커니즘은 각각이 왜 비싼지, 어느 것을 제거할 수 있는지 설명한다.
파일이 열려 있는 동안 편집기가 하는 일
변경 내용 추적을 켠 편집기는 열린 모든 파일에 구독을 유지한다. 로컬 볼륨은 그 구독을 네트워크 없이 파일 시스템에서 처리한다. 공유를 거치면 알림 모델이 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
기준 리비전은 제대로 맞춰야 하는 부분이다. 얼마나 많은 기록이 이동할지를 결정하기 때문이다. 모두 묶으면 동작하지만 회선을 낭비하고, 마지막 공통 변경에서 묶으면 상대편에 없는 것만 움직인다.
대역폭을 탓하기 전에 세 작업을 측정하라
세 가지를 따로 측정하라. 작은 파일 하나 열기, 디렉터리 하나 나열하기, 저장 하나 끝내기. 셋 다 파일 수에 비례해 느리다면 비용은 왕복이다. 하나만 막히고 나머지가 괜찮다면 대역폭이 아니라 닿을 수 없는 자원에 대한 시간 초과를 의심하라. 실행마다 기계가 어느 네트워크에 있었는지 기록하라. 다른 프로필로 다시 연결한 노트북은 시도 사이에 답을 바꿀 수 있다.
그다음 같은 셋을 프로젝트의 로컬 복사본에 대해 반복하라. 그 차이가 공유의 값이며, 누군가 회선을 더 빠르게 하면 해결된다고 말할 때 인용해야 할 숫자다.