SQL Server 2017 beëindigt en genereert een kern dump op RHEL 7,4 wanneer u MSSQL-conf probeert uit te voeren

Symptomen

Nadat u Microsoft SQL Server 2017 hebt geïnstalleerd op RHEL 7,4, wordt er een kern dump gemaakt en wordt er een kern dump gegenereerd wanneer u het hulpprogramma MSSQL-conf probeert uit te voeren. Daarnaast wordt de volgende vermelding in de systemctl-logboeken vastgelegd voor de MSSQL-Server-service (journalctl-u MSSQL-server. service): 

Dit programma heeft een fatale fout aangetroffen en kan niet verder worden uitgevoerd. De volgende diagnostische informatie is beschikbaar:   Reden: 0x00000003       Bericht: resultaat   Stacktrace: 00005577212bcd92 0000557721266767        Proces: 590-SQLSERVR       Thread: 594 (Application thread 0x1000)   Exemplaar-id: afe0f97b-fdbc-4a4d-910c-038e7ee2049b      Crash-ID: 544c4c67-0f49-4877-a959-92c14798d58e   Build Stamp: f7473acad6f0299cd161863aaa02e4284434ab6d915c7b467e2a14e907290249   Kern dump en-informatie vastleggen...

Oorzaak

Dit probleem doet zich voor omdat SQL Server 2017 op Linux niet compatibel is met oudere VA-indelingen. Vanwege instellingen die zijn ingeschakeld voor RHEL 7,4, worden alle processen gestart met behulp van legacy_va_layout. 

Tijdens het opstarten worden de adresbereiken in SQL Server op Linux gecontroleerd. Wanneer een incompatibiliteits functie wordt gevonden vanwege een oudere VA-indeling, wordt het programma in de assert beëindigd, wordt het programma beëindigd en wordt een kern dump gegenereerd.

RHEL 7,4 kan een van de volgende redenen gebruiken voor het gebruik van een oudere indeling voor de bestandsindeling van VA:

  • De waarde van de zachte stack limiet is ingesteld op onbeperkt (bijvoorbeeld een aangepaste limiet. conf-script of een ulimit-s- instelling).

  • Er is een globale, bestaande VA-indeling ingeschakeld (bijvoorbeeld sysctl VM.legacy_va_layout of /etc/sysctl.conf).

Oplossing

  1. In de /etc/security/limits.conf -indeling voegt u een nieuwe rij toe en voert u de volgende code in:      mssql soft stack 8192 root soft stack 8192

  1. In de /etc/sysctl.conf -indeling voegt u een nieuwe rij toe en voert u de volgende code in:     vm.legacy_va_layout = 0

  2. Start de computer opnieuw op:  reboot

  1. Zorg ervoor dat de instellingen voor de variabele stapel voor beide gebruikers, root en MSSQL8192zijn. Schakel over naar de context van de gebruiker en voer de volgende opdracht uit:  ulimit -s

  1. Zorg ervoor dat de algemene, bestaande VA-indeling 0is:   Sysctl vm.legacy_va_layout

Meer informatie

De grootte van de stack controleren

De limiet van de stack en de instelling van de legacy_va_layout controleren (standaardwaarden die worden opgehaald uit een nieuwe RHEL-7-installatie).

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

Wanneer deze instellingen worden gemaakt in een x64-systeem, ziet de indeling voor de adresruimte er ongeveer zo uit:

+----------------------+ TASK_SIZE ((1UL << 47)-PAGE_SIZE) |            STACK | +----------------------+ +----------------------+ MMAP_BASE (STACK_SIZE + RND_OFFSET) |          MMAP () | | vvvvvvvvvvvvvvvvvvvv | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |^^^^^^^^^^^^^^| |            HEAP | +----------------------+ |     ELF SEGMENTEN | +----------------------+ +----------------------+ 0

MMAP_BASE staat bijna boven aan de adresruimte. Wanneer toewijzingen worden toegevoegd, wordt de toewijzing van de adresruimte uitgebreid. Dit is de standaardconfiguratie voor RHEL en de werking van SQL Server kan niet worden gevonden wanneer deze wordt gestart.

Een eenvoudig programma uitvoeren

Een eenvoudig programma uitvoeren dat een pagina mmapst en het adres retourneert dat wordt geretourneerd door de kernel (voorbeeld):

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

Als een van beide of beide parameters zijn gewijzigd, wordt de indeling VA mogelijk hersteld in de oude indeling:

+----------------------+ TASK_SIZE ((1UL << 47)-PAGE_SIZE) |            STACK | | vvvvvvvvv ^ vvvvvvvvvv | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |^^^^^^^^^^^^^^| |          MMAP () | +----------------------+ TASK_UNMAPPED_BASE (PAGE_ALIGN (TASK_SIZE/3)) |                                  | |                                  | |                                  | |^^^^^^^^^^^^^^| |            HEAP | +----------------------+ |     ELF SEGMENTEN | +----------------------+ +----------------------+ 0

Hier wordt de MMAP_BASE op een derde van de adresruimte geplaatst. Wanneer toewijzingen worden toegevoegd, wordt de toewijzing van de adresruimte opgegroeid (uitvouwen). Aangezien we een 47-bits virtuele adresruimte hebben, in 64-bits Linux, wordt MMAP_BASE geplaatst voor de virtuele 42nd van de 0x2A0000000000. Daarom lopen MSSQL niet onder de adressen die al onder 64TB zijn toegewezen wanneer ze een vaste plattegrond proberen in te stellen.

De grootte van de stack aanpassen, zodat de niet-gelimiteerde optie onbegrensd wordt

 [root@localhost ~] # ulimit-s Limited  [root@localhost ~] #./mmap   mmap 0x2b6634464000

* vm.legacy_va_layout aanpassen

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

U kunt hetzelfde effect weergeven als het instellen van vm.legacy_va_layout door de stackgrootte aan te passen zodat de stack groter wordt. Het verschil is dat nadat een beheerder vm.legacy_va_layout = 1 heeft ingesteld, in het systeem globaal gebruikmaakt van die oudere indeling van de VA-indeling voor alle processen. (De enige manier om dit te negeren is door de sysctl-knop opnieuw in te stellen op 0.) Als u echter vm.legacy_va_layout = 0 (standaardinstelling) hebt, kunt u dit kenmerk aanpassen door de stack limiet voor een aanmeldingssessie op basis van een ulimit te geven (of om limieten aan te passen.

Meer hulp nodig?

Uw vaardigheden uitbreiden
Training verkennen
Als eerste nieuwe functies krijgen
Deelnemen aan Microsoft insiders

Was deze informatie nuttig?

Bedankt voor uw feedback.

Hartelijk dank voor uw feedback! Het lijkt ons een goed idee om u in contact te brengen met een van onze Office-ondersteuningsagenten.

×