בדף הזה מוסבר איך לכוון את מקביליות הלקוח של Linux NFS עבור NetApp Volumes.
מקביליות היא מספר פעולות ה-NFS שיכולות להיות בהמתנה בין לקוח לבין נפח אחסון בכל זמן נתון. כוונון המקביליות עוזר לכם להתאים את הלקוח למגבלות השרת ולמנוע ירידה בביצועים כתוצאה מעומק תור מוגזם.
ב-Linux, מקביליות נשלטת על ידי רשומות בטבלת משבצות (NFSv3) או משבצות סשן של NFSv4.1, במקום אפשרויות הרכבה. צריך להגדיר את ההגדרות האלה לפני שמבצעים הרכבה, או להרכיב מחדש מערכות קבצים של NFS אחרי שמשנים אותן.
מידע על אפשרויות טעינה, כמו nconnect, זמין במאמר אפשרויות טעינה של Linux NFS. מידע נוסף על סדר ההגדרה זמין במאמר אופטימיזציה של לקוחות NFS ב-Linux.
הסברים על המונחים
המונחים המרכזיים הבאים קשורים ל-NFS concurrency ב-Linux:
טבלת משבצות RPC: מגבלה לכל חיבור TCP על פעולות NFS RPC בהמתנה בלקוח (NFSv3).
משבצות לסשנים: מגבלת NFSv4.1 על פקודות ממתינות שנקבעו בסשן בין הלקוח לשרת.
נקודת קצה של אחסון: כתובת IP יחידה של נפח שאליה הלקוחות מתחברים.
nconnect: אפשרות הרכבה שפותחת כמה חיבורי TCP לאותה נקודת קצה. היא מכפילה את מספר הפעולות המקבילות לכל חיבור.
פרמטרים של Linux
בטבלה הבאה מפורטים הפרמטרים וקבצי התצורה שמשמשים להגדרת בו-זמניות (concurrency) של NFS לכל גרסת פרוטוקול:
| פרוטוקול | פרמטר | הגדרות אישיות |
|---|---|---|
| NFSv3 | sunrpc.tcp_max_slot_table_entries |
/etc/sysctl.conf, sysctl -p |
| NFSv3 | sunrpc.tcp_slot_table_entries |
חלק מההפצות; אפשר לעיין במסמכי התיעוד של ההפצה |
| NFSv4.1 | max_session_slots |
/etc/modprobe.d/ (לדוגמה, nfsclient.conf), הפעלה מחדש |
NFSv3
בקטעים הבאים מתוארות המגבלות של לקוח ושרת NFSv3, מוסבר איך nconnectמשפיע על בו-זמניות, איך להעריך את דרישות הבו-זמניות ואיך להגדיר מגבלות על יחידות קיבולת.
מגבלות על לקוחות ושרתים
ב-NFSv3 לא מתבצעת הסכמה על מקביליות בין הלקוח לשרת. כל צד מגדיר מגבלה משלו.
NetApp Volumes NFSv3 server: עד 128 הקשרים של ביצוע לכל חיבור TCP.
לקוח Linux מודרני (ברירת מחדל):
sunrpc.tcp_max_slot_table_entries = 65536.
אין צורך במספר ברירת מחדל של משבצות לקוח שגדול ממגבלת השרת. אם הלקוח שולח יותר פעולות ממתינות ממה שהשרת יכול לטפל בהן ביעילות, השרת יכול לצמצם את חלון ה-TCP, מה שמשפיע על הביצועים.
המלצה: מגדירים את sunrpc.tcp_max_slot_table_entries ל-128 או פחות לכל חיבור. בסביבות עם הרבה לקוחות וחיבורים, כדאי לשמור על סך השימוש במשבצות פנויות לכל נקודת קצה של אחסון על 10,000 או פחות.
איך nconnect משפיע על מקביליות ב-NFSv3
המספר המקסימלי המשוער של בקשות בו-זמניות ללקוח אחד מחושב באופן הבא:
(sunrpc.tcp_max_slot_table_entries per connection) x (nconnect value)
ערך המקבילות מוגבל על ידי השרת לכל חיבור (128) ועל ידי הדרישות של עומס העבודה.
דוגמה 1: משבצות זמן שמוגדרות כברירת מחדל, ללא nconnect
חיבור TCP אחד.
הלקוח יכול לנסות עד 65,536 פעולות בהמתנה, אבל השרת מקבל עד 128 פעולות לכל חיבור.
המקבילות האפקטיבית מוגבלת על ידי מגבלת השרת של 128.
דוגמה 2: 128 משבצות, ללא nconnect
sunrpc.tcp_max_slot_table_entries=128חיבור אחד.
הלקוח והשרת מסונכרנים ב-128 פעולות לא גמורות.
דוגמה 3: 100 משבצות, nconnect=8
שמונה חיבורי TCP.
עד 100 פעולות בהמתנה לכל חיבור.
עד 800 פעולות ממתינות מלקוח אחד (8 x 100), בכפוף למגבלת השרת לכל חיבור של 128.
דוגמה 4: הרבה לקוחות (בסגנון EDA)
250 לקוחות, כל אחד עם
sunrpc.tcp_max_slot_table_entries=8ובליnconnect.לכל לקוח יכולות להיות עד שמונה פעולות בהמתנה לכל חיבור.
המספר הכולל בכל הלקוחות: עד 2,000 פעולות ממתינות לכתובת IP אחת של נפח (250 x 8), שזה במסגרת ההנחיות לגבי נקודת קצה של 10,000 משבצות.
כשמרחיבים את מספר הלקוחות, כדאי להשתמש בערכים נמוכים יותר של משבצות לכל לקוח. מומלץ להשתמש ב-nconnect בלקוחות בודדים עם נפח תעבורה גבוה, ולא כתחליף לתכנון משבצות ברמת החווה.
הערכת מספר החיבורים הנדרש בו-זמנית באמצעות חוק ליטל
כדי להעריך את מספר החיבורים בו-זמנית שנדרש לעומס העבודה, משתמשים בנוסחה הבאה:
מקביליות = (קצב הפעולה) x (השהייה בשניות)
דוגמה: הרבה לקוחות, נקודת קצה אחת
יעד של 4,000 MiBps עם ממוצע של 256 KiB I/O וזמן אחזור של 10 ms:
קצב הפעולות: בערך 16,000 IOPS.
מקביליות: בערך 16,000 x 0.010 = 160.
עם 1,250 לקוחות: 160 חלקי 1,250 = בערך 0.13 משבצות לכל לקוח אם מחלקים באופן שווה. כדי לשמור על מרווח ביטחון מתחת למגבלה של 10,000 משבצות, כדאי להשתמש במספר שלם קטן לכל לקוח, כמו 2, 4 או 8.
הגדרת sunrpc.tcp_max_slot_table_entries (NFSv3)
בהרבה הפצות של Linux, systemd-sysctl פועל לפני שמודול ליבת sunrpc נטען. המערכת מתעלמת מהערכים ב-/etc/sysctl.conf או ב-/etc/sysctl.d/ עבור sunrpc.* בזמן האתחול. הפעלת sysctl -p אחרי האתחול פועלת רק עד להפעלה מחדש הבאה, אם לא משתמשים באחת משיטות ההתמדה הבאות.
שיטה 1: אם הבדיקה מראה שערך נמוך מ-128 מספיק, משתמשים בערך הזה. מגדירים את הערך של tcp_slot_table_entries ושל tcp_max_slot_table_entries
כזהה, אלא אם במסמכי התיעוד של ההפצה מצוין אחרת.
אחרי שמשנים את ההגדרות האלה, צריך לטעון או לטעון מחדש את מערכות הקבצים של NFS. הגדרות המשבצת חלות על העברות RPC שנוצרות אחרי שההגדרה נכנסת לתוקף.
שיטה 2 (מומלצת): אפשרויות מודול ב-/etc/modprobe.d/
הפרמטרים של המודול מוחלים כש-sunrpc נטען בשימוש הראשון ב-NFS אחרי האתחול. ההגדרות האלה נשמרות גם אחרי הפעלה מחדש, כך שלא צריך להגדיר את sysctl בזמן האתחול.
יצירה
/etc/modprobe.d/sunrpc.conf:options sunrpc tcp_slot_table_entries=128 tcp_max_slot_table_entries=128
אם ההפצה שלכם דורשת זאת אחרי שינויים ב-modprobe, צריך לבנות מחדש את initramfs. זה נפוץ ב-RHEL כשהמודול נמצא ב-initramfs. למידע נוסף, אפשר לעיין במסמכי התיעוד של ספק Linux.
מבצעים הפעלה מחדש, או מבטלים את הטעינה של
sunrpcוטוענים אותה מחדש רק אם אין לכם נקודות הרכבה פעילות של NFS, וספר ההוראות מאפשר זאת.מוודאים שהתג
sunrpcנטען ושהערכים הרצויים מוגדרים:cat /proc/sys/sunrpc/tcp_slot_table_entries cat /proc/sys/sunrpc/tcp_max_slot_table_entries
מבצעים Mount או remount לייצוא של NetApp Volumes.
NFSv4.1
בקטעים הבאים מוסבר איך מתבצעת ההתקשרות של סשן NFSv4.1, מוצגות דוגמאות לאופטימיזציה של הביצועים ומוסבר איך מגדירים את המגבלות של משבצות סשן.
משא ומתן על סשן
פרוטוקול NFSv4.1 יוצר סשנים בין הלקוח לשרת. הלקוח והשרת מנהלים משא ומתן על המספר המקסימלי של פקודות בהמתנה (max_reqs) על ידי בחירת הערך הנמוך מבין שני הערכים הנתמכים.
שרת NetApp Volumes NFSv4.1: 180 פקודות לכל סשן.
ברירת המחדל של לקוח Linux: 64 (
max_session_slots).משא ומתן על סשן: הערך המינימלי של הלקוח והשרת, שלרוב הוא 64 עם לקוח ברירת המחדל.
כל חיבור TCP לשרת תומך בעד 128 פקודות NFS שלא בוצעו. עם ברירת המחדל של 64 משבצות סשן וחיבור יחיד, המקביליות מוגבלת ל-64. כדי להשתמש ביותר משבצות סשן בחיבורים, צריך להשתמש ב-nconnect=2 ומעלה רק להרכבות שאינן Kerberos. מידע נוסף על אפשרויות הרכבה זמין במאמר אפשרויות הרכבה של Linux NFS.
דוגמה 1: 64 משבצות סשן כברירת מחדל, ללא nconnect
חיבור אחד.
עד 64 פקודות ממתינות לסשן.
דוגמה 2: 64 משבצות לסשן, nconnect=2
הסשן עדיין מוגבל ל-64 משבצות בסך הכול, שמחולקות בין שני חיבורים, או בערך 32 לכל חיבור.
ההגדרה הזו משפרת את זמן האחזור על ידי הקטנת עומק התור לכל חיבור, בלי להגדיל את מספר החיבורים הכולל.
דוגמה 3: max_session_slots=180, no nconnect
בסשן מותרות 180 פקודות, וחיבור אחד מוגבל ל-128 פעולות בהמתנה.
המגבלה בפועל היא 128.
דוגמה 4: max_session_slots=180, nconnect=2
בסשן אפשר להשתמש בעד 180 פקודות בשני חיבורים, או בכ-90 פקודות לכל חיבור.
ההגדרה הזו נדרשת כדי לחרוג מהמגבלה של 128 חיבורים בודדים ברמת הסשן.
כדי להשיג מקסימום מקביליות של NFSv4.1 ב-NetApp Volumes בלי Kerberos, צריך להגדיר את max_session_slots=180 ולהשתמש ב-nconnect=2 או בגרסה מתקדמת יותר. מומלץ לבדוק את ההגדרה הזו באמצעות עומס העבודה.
הגדרת מספר מקסימלי של משבצות סשן ל-NFSv4.1
יצירה
/etc/modprobe.d/nfsclient.conf:options nfs max_session_slots=180
מפעילים מחדש את הלקוח.
בודקים את ההגדרה אחרי שקיים לפחות חיבור NFSv4.1 אחד:
systool -v -m nfs
מוודאים שהערך
max_session_slotsמופיע בפלט.
השינויים האלה מחייבים הפעלה מחדש של חבילת לקוח NFS רגילה ב-Linux. כדאי לתכנן את התחזוקה בהתאם.
נפחים גדולים וחשבונות מרובי-לקוחות
כמה מכונות וירטואליות, כתובת IP אחת של נפח: הפחתה של
sunrpc.tcp_max_slot_table_entriesלכל לקוח.כוננים בנפח גדול עם כמה כתובות IP: חלות הגבלות על כל חיבור בין לקוח לכתובת IP. כדאי לפזר את הלקוחות בין נקודות הקצה ככל האפשר. מידע נוסף זמין במאמר חיבור נפחי אחסון גדולים עם כמה נקודות קצה לאחסון.