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
גרסת הבסיס היא החלק שצריך לקלוע, כי היא קובעת כמה היסטוריה נוסעת. אריגת הכול עובדת ומבזבזת את החיבור, בעוד אריגה מהשינוי המשותף האחרון מעבירה רק את מה שחסר לצד השני.
מדדו שלוש פעולות לפני שמאשימים את רוחב הפס
מדדו שלושה דברים בנפרד: קובץ קטן אחד נפתח, תיקייה אחת נמנתה, שמירה אחת הושלמה. אם כל השלושה איטיים ביחס למספר הקבצים, העלות היא נסיעות הלוך ושוב. אם אחד נתקע והאחרים תקינים, חשדו בזמן המתנה מול משאב בלתי נגיש ולא ברוחב הפס. רשמו באיזו רשת הייתה המכונה בכל הרצה, כי מחשב נייד שמתחבר מחדש לפרופיל אחר יכול לשנות את התשובה בין ניסיונות.
לאחר מכן חזרו על אותם שלושה מול עותק מקומי של הפרויקט. ההבדל הוא מחיר כונן הרשת, וזה המספר שיש לצטט כשמישהו מציע חיבור מהיר יותר כפתרון.