You have multiple accounts
Choose the account you want to sign in with.

Symptomer

Når du installerer Microsoft SQL Server-2017 på 7,4 RHEL, avsluttes programmet, og genererer en core dump når du prøver å kjøre verktøyet mssql-Konf. I tillegg logges følgende oppføring i systemctl-loggene for tjenesten mssql-server (journalctl -u mssql-server.service):

Dette programmet har oppstått en uopprettelig feil og kan ikke fortsette.
Følgende diagnostisk informasjon er tilgjengelig:
 
Årsak: 0x00000003
Melding: resultatet
Stacktrace: 00005577212bcd92 0000557721266767
Prosess: 590 - sqlservr
Tråd: 594 (programtråd 0x1000)
Forekomst-Id: afe0f97b-fdbc-4a4d-910c-038e7ee2049b
Crash Id: 544c4c67-0f49-4877-a959-92c14798d58e
Bygge stempel: f7473acad6f0299cd161863aaa02e4284434ab6d915c7b467e2a14e907290249
 
Innspilling av core dump og informasjon...

Årsak

Dette problemet oppstår fordi SQL Server-2017 på Linux er kompatibel med eldre VA-oppsett. På grunn av innstillinger som er aktivert på 7,4 RHEL, starter alle prosesser ved hjelp av legacy_va_layout.

Under oppstart bekrefter SQL Server på Linux-adresseområder. Når den finner en inkompatibilitet på grunn av en eldre VA-oppsettet, det hever en assert, avslutter programmet og genererer en core dump.

RHEL 7,4 kan bytte til å bruke et eldre VA-oppsett for én av følgende årsaker:

  • Grenseverdien myke stakken er satt til ubegrenset (for eksempel et endret limits.conf skript eller en ulimit -sS -innstilling).

  • En global eldre VA-oppsettet er aktivert (for eksempel sysctl vm.legacy_va_layout eller Endre /etc/sysctl.conf).

Løsning

  1. Legge til en ny rad i oppsettet for /etc/security/limit.conf , og skriv deretter inn følgende kode:     mssql soft stack 8192 root soft stack 8192

  1. Legge til en ny rad i oppsettet for /etc/sysctl.conf , og skriv deretter inn følgende kode:    vm.legacy_va_layout = 0

  2. Start datamaskinen på nytt: reboot

  1. Kontroller at myke stakken innstillingen for brukere, rot og mssql8192. Bytt til konteksten for brukeren, og deretter kjører du følgende kommando:  Ulimit -sS

  1. Kontroller at globale eldre VA-oppsettet er 0:   Sysctl vm.legacy_va_layout

Hvis du vil ha mer informasjon

Kontrollerer størrelsesgrensen stakk

Kontrollerer grensen på stakken og innstillingen for legacy_va_layout (standardverdier, hentet fra en ny installasjon av RHEL-7).

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

Når disse innstillingene er gjort i et x64 system, plass adresseoppsett ligner på følgende:

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

MMAP_BASE er nær toppen av adresseområdet. Som legges til tilordninger, vokser plass adressetildeling"ned." Dette er standardoppsettet for RHEL, og dette er hva SQL Server forventer å støte på når den starter.


Kjører et enkelt program

Kjører et enkelt program som mmaps en side, og returnerer adressen returneres av kjernen (eksempel):

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

Imidlertid hvis ett eller begge av parametere er endret, VA-oppsett kan gå tilbake til det gamle oppsettet:

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

Her er på MMAP_BASE plassert i en tredjedel av adresseområdet. Som legges til tilordninger, plass adressetildeling "vokser" (utvides).

Fordi vi har en 47-biters virtuelle adresseområdet, i 64-bit Linux blir MMAP_BASE plassert rundt 42nd TB virtuelle "0x2A0000000000". Derfor kuler mssql på adresser som allerede er tilordnet under 64TB når den prøver å angi de faste kart.


Justere stakkstørrelsen på, til å øke ubegrenset – "ubegrenset"

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


* justering av vm.legacy_va_layout

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


Du kan få samme effekt som innstillingen vm.legacy_va_layout ved å justere størrelsen på programstakken til å øke ubegrenset. Forskjellen er at når en administrator har angitt vm.legacy_va_layout=1, systemet globalt bruker eldre VA oppsettet for alle prosesser. (Det er den eneste måten å overstyre dette ved å tilbakestille det sysctl knob til 0.) Hvis du har vm.legacy_va_layout=0 (standard), kan du justere denne kjennetegn ved å justere stakk størrelsesgrensen på login-økt basis av utstedende ulimit (eller tilpasse limits.conf).

Trenger du mer hjelp?

Utvid ferdighetene dine
Utforsk opplæring
Vær først ute med de nye funksjonene
Bli med i Microsoft Insiders

Var denne informasjonen nyttig?

Hvor fornøyd er du med språkkvaliteten?
Hva påvirket opplevelsen din?

Takk for tilbakemeldingen!

×