מאפייני הבעיה

לאחר התקנת Microsoft SQL Server 2017 RHEL 7.4, התוכנית מסיים ומפיק קובץ dump ליבה כאשר תנסה להפעיל את הכלי תצור mssql. בנוסף, הערך הבא נרשם ביומני systemctl עבור שירות שרת mssql (journalctl -u mssql-server.service): 

תוכנית זו נתקל בשגיאה מכרעת ואינו יכול להמשיך לפעול. המידע האבחוני הבא זמין:         סיבה: 0x00000003       הודעה: התוצאה   Stacktrace: תהליך 0000557721266767 00005577212bcd92: sqlservr --590       הליך המשנה: 594 (הליך משנה של יישום 0x1000)   מזהה מופע: afe0f97b-fdbc-4a4d-910c-038e7ee2049b      לקרוס מזהה: 544c4c67-0f49-4877-a959-92c14798d58e   בניית חותמת: f7473acad6f0299cd161863aaa02e4284434ab6d915c7b467e2a14e907290249   לכידת core dump ומידע...

סיבה

בעיה זו מתרחשת מכיוון 2017 שרת SQL ב- Linux אינה תואמת עם פריסות VA מדור קודם. עקב הגדרות שאינן זמינות ב- RHEL 7.4, כל התהליכים להתחיל על-ידי שימוש legacy_va_layout. 

במהלך ההפעלה, שרת SQL ב- Linux מאמתת את טווחי הכתובות. כאשר הוא מוצא חוסר תאימות עקב פריסה VA מדור קודם, הוא מפעיל של קביעת, מסיים את התוכנית ו יוצרת קובץ dump של הליבה.

RHEL 7.4 עשוי לעבור באמצעות פריסה VA מדור קודם בשל אחת מהסיבות הבאות:

  • ערך הגבול של מחסנית רכים מוגדר ללא הגבלה (לדוגמה, קובץ script limits.conf שעבר או הגדרה של ulimit -s ).

  • פריסה VA מדור קודם הכללי יהיה זמין (לדוגמה, sysctl vm.legacy_va_layout או שינוי של /etc/sysctl.conf).

פתרון

  1. בפריסה של /etc/security/limits.conf , הוסף שורה חדשה ולאחר מכן הזן את הקוד הבא:      mssql soft stack 8192 root soft stack 8192

  1. בפריסה של /etc/sysctl.conf , הוסף שורה חדשה ולאחר מכן הזן את הקוד הבא:     vm.legacy_va_layout = 0

  2. הפעל מחדש את המחשב:  reboot

  1. ודא כי הערימה רכים הגדרת משתמשים, הבסיס עבור והן עבור mssql, 8192. מעבר להקשר של המשתמש, ולאחר מכן הפעל את הפקודה הבאה:  ulimit -s

  1. ודא כי הפריסה VA מדור קודם הכללית הוא 0:   Sysctl vm.legacy_va_layout

מידע נוסף

בודק את מגבלת גודל מחסנית

בודק את מגבלת גודל מחסנית ואת ההגדרה legacy_va_layout (ערכי ברירת מחדל, לקוח מתוך התקנה חדשה RHEL-7).

 [root@localhost ~]# sysctl vm.legacy_va_layout  vm.legacy_va_layout = 0  [root@localhost ~]# ulimit -s  8192

כאשר הגדרות אלה מבוצעות ב- x64 המערכת, פריסת מרחב הכתובות לנוסח הבא:

+---+ TASK_SIZE ((1UL << 47)-PAGE_SIZE) |            מחסנית | +----------------------+ +---+ MMAP_BASE (STACK_SIZE + RND_OFFSET) |          MMAP() | | vvvvvvvvvvvvvvvvvvvv | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |^^^^^^^^^^^^^^| |            ערימה | +----------------------+ |     מקטעים ELF | +----------------------+ +---+ 0

MMAP_BASE הוא ליד החלק העליון של מרחב הכתובות. כפי מיפויים נוספות, הקצאת שטח הכתובת "גדל למטה." זוהי הגדרת ברירת המחדל עבור RHEL, וזו SQL Server מצפה שתתקל בהן בעת הפעלתו.

הפעלת תוכנית פשוטה

הפעלת תוכנית פשוטה זו mmaps דף ומחזירה את הכתובת שהוחזרו על-ידי הליבה (דוגמה):

mmap code ========= #include <stdio.h> #include <sys/mman.h>   int main() {     void* result = mmap(NULL, 0x1000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);     printf("mmap %p\n", result);     return 0; }   [root@localhost ~]# ./mmap  mmap 0x7fb6976d6000

עם זאת, אם אחת או את שתיהן הפרמטרים משתנים, הפריסה שו עשוי לחזור לפריסתו מדור קודם:

+---+ TASK_SIZE ((1UL << 47)-PAGE_SIZE) |            מחסנית | | vvvvvvvvv ^ vvvvvvvvvv | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |^^^^^^^^^^^^^^| |          MMAP() | +---+ TASK_UNMAPPED_BASE (PAGE_ALIGN(TASK_SIZE / 3)) |                                  | |                                  | |                                  | |^^^^^^^^^^^^^^| |            ערימה | +----------------------+ |     מקטעים ELF | +----------------------+ +---+ 0

כאן, MMAP_BASE ממוקם אצל בשליש מרחב הכתובות. כפי מיפויים נוספות, הקצאת שטח הכתובת "גדל" (מרחיב). כיוון של מרחב הכתובות הווירטואליות של 47-סיביות, 64-bit Linux, יש לנו MMAP_BASE ממוקם סביב טרה-בתים 42nd וירטואלית "0x2A0000000000." לכן, mssql ספסים כתובות שאינן ממופות כבר מתחת 64 טרה-בתים כאשר היא מנסה להגדיר מפות הקבוע שלו.

התאמת גודל מחסנית, לגדול מאוגדות — "מוגבל"

 [root@localhost ~] ulimit # -s מוגבל  [root@localhost ~] #. / mmap mmap 0x2b6634464000

* התאמת vm.legacy_va_layout

 [root@localhost ~] # ulimit -s 8192  [root@localhost ~] vm.legacy_va_layout=1 -w sysctl #  vm.legacy_va_layout = 1  [root@localhost ~] #. / mmap mmap 0x2b46f28f9000

באפשרותך לקבל את אותה ההשפעה כמו הגדרה vm.legacy_va_layout על-ידי התאמת גודל מחסנית לגדול ללא הגבלה. ההבדל הוא לאחר מנהל מערכת מגדיר vm.legacy_va_layout=1, המערכת באופן כללי שישמש אותה פריסה VA מדור קודם עבור כל התהליכים. (הדרך היחידה כדי לעקוף זאת היא על-ידי איפוס זה כפתור sysctl ל- 0). עם זאת, אם יש לך vm.legacy_va_layout=0 (ברירת המחדל), באפשרותך להתאים אותו מאפיין על-ידי התאמת את מגבלת גודל מחסנית על בסיס לפי--הפעלת כניסה על-ידי ulimit המנפיקה (או התאמה אישית של limits.conf).

זקוק לעזרה נוספת?

הרחב את הכישורים שלך
סייר בהדרכה
קבל תכונות חדשות לפני כולם
הצטרף למשתתפי Microsoft insider

האם מידע זה היה שימושי?

עד כמה אתם מרוצים מאיכות השפה?
מה השפיע על החוויה שלכם?

תודה על המשוב!

×