Sintomas

Depois de instalar o Microsoft SQL Server 2017 no ponto 7.4 do RHEL, o programa termina e gera uma cópia principal da quando tenta executar a ferramenta de mssql conf. Além disso, a entrada seguinte é registada nos registos de systemctl para o serviço de servidor de mssql (journalctl -u mssql-server.service): 

Este programa encontrou um erro fatal e não é possível continuar a executar. Estão disponíveis as seguintes informações de diagnóstico:         Razão: 0x00000003       Mensagem: resultado   Stacktrace: 00005577212bcd92 0000557721266767 processo: 590 - sqlservr       Thread: 594 (thread de aplicação 0x1000)   Id da instância: afe0f97b-fdbc-4a4d-910c-038e7ee2049b      Id de falha: 544c4c67-0f49-4877-a959-92c14798d58e   Criar carimbo: f7473acad6f0299cd161863aaa02e4284434ab6d915c7b467e2a14e907290249   Capturar informações de estado do núcleo e informações...

Causa

Este problema ocorre porque o SQL Server 2017 no Linux é incompatível com esquemas de VA legacy. Devido às definições que estão activadas no ponto 7.4 do RHEL, todos os processos comece por utilizar legacy_va_layout. 

Durante o arranque, o SQL Server no Linux verifica os intervalos de endereços. Quando é encontrada uma incompatibilidade devido a um esquema de VA legacy, gera uma declaração, termina o programa e gera uma cópia principal da.

RHEL 7.4 poderá mudar para utilizar um esquema de VA legacy para qualquer um dos seguintes motivos:

  • O valor de limite de pilha de software é definido como ilimitado (por exemplo, um script de limits.conf modificados ou uma definição de ulimit -s ).

  • Um esquema de VA legacy global está activado (por exemplo, sysctl vm.legacy_va_layout ou Modificar /etc/sysctl.conf).

Resolução

  1. O esquema de /etc/security/limits.conf , adicionar uma nova linha e, em seguida, introduza o seguinte código:      mssql soft stack 8192 root soft stack 8192

  1. O esquema de /etc/sysctl.conf , adicionar uma nova linha e, em seguida, introduza o seguinte código:     vm.legacy_va_layout = 0

  2. Reinicie o computador:  reboot

  1. Certifique-se de que a pilha de software para utilizadores, raiz e mssql, a definição é 8192. Mude para o contexto do utilizador e, em seguida, execute o seguinte comando:  ulimit -s

  1. Certifique-se de que o esquema de VA legacy global é 0:   Sysctl vm.legacy_va_layout

Mais Informações

A verificar o limite de tamanho da pilha

Verificar o limite de tamanho da pilha e a definição de legacy_va_layout (valores predefinidos, provenientes de uma nova instalação de RHEL-7).

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

Quando estas definições são efectuadas num x64 sistema, o esquema do espaço de endereço se assemelhe ao seguinte:

+ --- + TASK_SIZE ((1UL << 47)-PAGE_SIZE) |            PILHA | +----------------------+ + --- + MMAP_BASE (STACK_SIZE + RND_OFFSET) |          MMAP() | | vvvvvvvvvvvvvvvvvvvv | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |^^^^^^^^^^^^^^| |            PILHA | +----------------------+ |     SEGMENTOS DE ELF | +----------------------+ + --- + 0

MMAP_BASE esteja próximo do topo do espaço de endereços. Como mapeamentos adicionados, a atribuição de espaço de endereços "cresce para baixo." Esta é a configuração predefinida para RHEL e este é o SQL Server que espera encontrar quando é iniciado.

Executar um programa simple

Executar um programa simple que mmaps uma página e devolve o endereço devolvido pelo kernel (exemplo):

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

No entanto, se um ou ambos os parâmetros forem alterados, o esquema de VA poderão reverter para o esquema legacy:

+ --- + TASK_SIZE ((1UL << 47)-PAGE_SIZE) |            PILHA | | vvvvvvvvv ^ vvvvvvvvvv | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |^^^^^^^^^^^^^^| |          MMAP() | + --- + TASK_UNMAPPED_BASE (PAGE_ALIGN(TASK_SIZE / 3)) |                                  | |                                  | |                                  | |^^^^^^^^^^^^^^| |            PILHA | +----------------------+ |     SEGMENTOS DE ELF | +----------------------+ + --- + 0

Aqui, o MMAP_BASE é colocado num terço do espaço de endereços. Como mapeamentos adicionados, a atribuição de espaço de endereços "cresce" (expande). Porque temos um espaço de endereço virtual 47 bits, 64-bit Linux, MMAP_BASE é colocada à volta a TB 42nd virtual "0x2A0000000000". Por conseguinte, mssql Lomba ou depressão em endereços que já estão mapeados abaixo 64TB quando tenta definir suas mapas fixos.

Ajustar o tamanho da pilha, a crescer sem limites à — "ilimitado"

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

* ajustando 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

Pode obter o mesmo efeito que a definição vm.legacy_va_layout ajustando o tamanho da pilha de aumentar os ilimitado. A diferença é que depois de um administrador de vm.legacy_va_layout=1, o sistema será globalmente utilizar esse esquema VA legacy para todos os processos. (É a única forma de substituí-lo repondo o manípulo que sysctl para 0.) No entanto, se tiver vm.legacy_va_layout=0 (predefinição), pode ajustar essa característica ajustando o limite de tamanho da pilha numa base por início de sessão-sessão pelo emissor ulimit (ou personalizar limits.conf).

Precisa de mais ajuda?

Aumente os seus conhecimentos

Explore as formações >

Seja o primeiro a obter novas funcionalidades

Aderir ao Microsoft insiders >

As informações foram úteis?

Quão satisfeito está com a qualidade do idioma?
O que afetou a sua experiência?

Obrigado pelo seu feedback!

×