ينهي 2017 ملقم SQL ويقوم بإنشاء ملف تفريغ المركز على RHEL 7.4 عند محاولة تشغيل تكوين mssql

ينطبق على: SQL Server 2017 on Linux (all editions)

الأعراض


بعد تثبيت Microsoft SQL Server 2017 على RHEL 7.4، إنهاء البرنامج ويقوم بإنشاء ملف تفريغ المركز عند محاولة تشغيل أداة تكوين mssql. بالإضافة إلى ذلك، يتم تسجيل الإدخال التالي في سجلات سيستيمكتل خدمة ملقم mssql (جورنالكتل-يو mssql-server.service)

السبب


تحدث هذه المشكلة لأن 2017 ملقم SQL على لينكس غير متوافق مع التخطيطات خامسا القديمة. نظراً للإعدادات التي تم تمكينها على RHEL 7.4، بدء تشغيل كافة العمليات باستخدام legacy_va_layout. 

أثناء بدء التشغيل، يتحقق SQL Server على لينكس من نطاقات العناوين. عندما يجد بسبب عدم توافق بسبب تخطيط خامسا قديمة، فإنه يثير تأكيد إنهاء البرنامج وتفريغ المركز.

RHEL 7.4 تقوم بالتبديل إلى استخدام تخطيط خامسا قديمة لأي من الأسباب التالية:

  • يتم تعيين قيمة الحد مكدس الناعمة إلى بلا حدود (على سبيل المثال، برنامج نصي limits.conf معدلة أو بيئة ulimit s ).
  • يتم تمكين تخطيط خامسا قديمة عمومية (على سبيل المثال، 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. تأكد من أن المكدس ناعمة إعداد المستخدمين و الجذر و mssql8192. قم بالتبديل إلى سياق المستخدم، ثم قم بتشغيل الأمر التالي:
        ulimit -s
  1. تأكد من أن تخطيط خامسا القديمة العالمية 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() || فففففففففففففففففففف ||                                  ||                                  ||                                  ||                                  ||                                  ||                                  ||                                  ||                                  ||                                  ||                                  ||                                  ||^^^^^^^^^^^^^^||            كومة الذاكرة المؤقتة |+----------------------+|     مقاطع قزم |+----------------------+---+ + 0

MMAP_BASE بالقرب من الجزء العلوي من مساحة العنوان. الحصول على إضافة تعيينات، تخصيص مساحة العنوان "ينمو أسفل." هذا هو الإعداد الافتراضي ل RHEL، وهذا ما يتوقعه SQL Server مواجهتها عند بدء تشغيله.

تشغيل برنامج بسيط

تشغيل برنامج بسيط مابس تلك صفحة وإرجاع العنوان يتم إرجاعها بواسطة kernel (على سبيل المثال):

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)|            مكدس || فبببببببب ^ فببببببببب ||                                  ||                                  ||                                  ||                                  ||                                  ||                                  ||                                  ||                                  ||                                  ||^^^^^^^^^^^^^^||          MMAP() |---+ + TASK_UNMAPPED_BASE (PAGE_ALIGN(TASK_SIZE/3))|                                  ||                                  ||                                  ||^^^^^^^^^^^^^^||            كومة الذاكرة المؤقتة |+----------------------+|     مقاطع قزم |+----------------------+---+ + 0

هنا، يتم وضع MMAP_BASE في ثلث مساحة العنوان. الحصول على إضافة تعيينات، تخصيص مساحة العنوان "يكبر" (توسيع).لأن لدينا مساحة عنوان ظاهرية 47-بت، في لينكس 64 بت، الحصول على وضع MMAP_BASE حول تيرابايت 42 الظاهري "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 vm.legacy_va_layout = 1 [root@localhost ~] #./mmap mmap 0x2b46f28f9000

يمكنك الحصول على نفس التأثير عند إعداد vm.legacy_va_layout بضبط حجم مكدس النمو غير محدود. الفرق أن بعد تعيين مسؤول vm.legacy_va_layout=1، سيقوم النظام على الصعيد العالمي باستخدام هذا التخطيط خامسا القديمة لكافة العمليات. (الطريقة الوحيدة لتجاوز هذا بإعادة تعيين مفتاح سيسكتل ذلك 0.) ومع ذلك، إذا كان لديك vm.legacy_va_layout=0 (الافتراضي)، يمكنك ضبط تلك الخاصية عن طريق ضبط حد حجم مكدس الذاكرة المؤقتة على أساس كل تسجيل دخول، جلسة بإصدار ulimit (أو limits.conf تخصيص).