Síntomas

Después de instalar Microsoft SQL Server 2017 en RHEL 7,4, el programa finaliza y genera un volcado básico cuando intenta ejecutar la herramienta MSSQL-conf. Además, se registra la siguiente entrada en los registros de systemctl para el servicio MSSQL-Server (journalctl-u MSSQL-Server. Service): 

Este programa ha encontrado un error grave y no puede continuar ejecutándose. La siguiente información de diagnóstico está disponible:   Motivo: 0x00000003       Mensaje: resultado   StackTrace: 00005577212bcd92 0000557721266767        Proceso: 590-sqlservr       Subproceso: 594 (subproceso de aplicación 0x1000)   Identificador de instancia: afe0f97b-fdbc-4a4d-910C-038e7ee2049b      Identificador de bloqueo: 544c4c67-0F49-4877-a959-92c14798d58e   Crear sello: f7473acad6f0299cd161863aaa02e4284434ab6d915c7b467e2a14e907290249   Capturando el volcado principal y la información...

Causa

Este problema se produce porque SQL Server 2017 en Linux no es compatible con los diseños VA heredados. Debido a que la configuración está habilitada en RHEL 7,4, todos los procesos se inician con legacy_va_layout. 

Durante el inicio, SQL Server en Linux verifica los intervalos de direcciones. Cuando encuentra una incompatibilidad debido a un diseño heredado de VA, genera una aserción, finaliza el programa y genera una descarga básica.

RHEL 7,4 puede cambiar al uso de un diseño de VA heredado por cualquiera de las razones siguientes:

  • El valor límite de la pila de software se establece en sin límite (por ejemplo, una secuencia de comandos limits. conf modificada o una ulimit ).

  • Se habilita un diseño de VA heredado global (por ejemplo, sysctl VM. legacy_va_layout o modificar/etc/sysctl.conf).

Resolución

  1. En el diseño /etc/Security/limits.conf , agregue una nueva fila y, a continuación, escriba el siguiente código:      mssql soft stack 8192 root soft stack 8192

  1. En el diseño /etc/sysctl.conf , agregue una nueva fila y, a continuación, escriba el siguiente código:     vm.legacy_va_layout = 0

  2. Reinicie el equipo:  reboot

  1. Asegúrese de que la configuración de la pila de software para los usuarios, root y mssql, sea 8192. Cambie al contexto del usuario y, a continuación, ejecute el siguiente comando:  ulimit -s

  1. Asegúrese de que la distribución de VA heredada global es 0:   Sysctl vm.legacy_va_layout

Más información

Comprobar el límite del tamaño de pila

Comprobar el límite del tamaño de pila y la configuración de legacy_va_layout (valores predeterminados, tomados de una instalación nueva de RHEL-7).

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

Cuando se realiza esta configuración en un sistema x64, el diseño del espacio de direcciones es similar al siguiente:

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

MMAP_BASE está cerca de la parte superior del espacio de direcciones. A medida que se agregan las asignaciones, la asignación del espacio de direcciones "crece". Esta es la configuración predeterminada para RHEL, y esto es lo que SQL Server espera encontrar cuando se inicia.

Ejecución de un programa sencillo

Ejecutar un programa sencillo que mmaps una página y devuelve la dirección devuelta por el kernel (por ejemplo):

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

Sin embargo, si cambia alguno de los parámetros, el diseño VA puede revertir a su diseño heredado:

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

Aquí, la MMAP_BASE se coloca en un tercio del espacio de direcciones. A medida que se agregan asignaciones, la asignación del espacio de direcciones "aumenta" (se expande). Dado que tenemos un espacio de dirección virtual de 47 bits, en Linux de 64 bits, MMAP_BASE se coloca cerca de la "0x2A0000000000 virtual de 42nd TB". Por lo tanto, MSSQL pasa por las direcciones que ya están asignadas debajo de 64TB cuando intenta establecer sus mapas fijos.

Ajustar el tamaño de la pila, para aumentarla sin límites,

 [root@localhost ~] # ulimit-s Unlimited  [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

Puede tener el mismo efecto que establecer VM. legacy_va_layout ajustando el tamaño de la pila para que crezca sin límites. La diferencia es que después de que un administrador establezca VM. legacy_va_layout = 1, el sistema usará de forma global ese diseño de VA heredado para todos los procesos. (La única manera de invalidar esto es restablecer ese tirador sysctl a 0). Sin embargo, si tiene VM. legacy_va_layout = 0 (valor predeterminado), puede ajustar esa característica ajustando el límite del tamaño de pila para cada sesión de inicio de sesión emitiendo ulimit (o personalizando limits. conf).

¿Necesita más ayuda?

Ampliar sus conocimientos
Explorar los cursos
Obtener nuevas características primero
Unirse a Microsoft Insider

¿Le ha sido útil esta información?

¿Cuál es tu grado de satisfacción con la calidad del lenguaje?
¿Qué ha afectado a tu experiencia?

¡Gracias por sus comentarios!

×