Войти с помощью учетной записи Майкрософт
Войдите или создайте учетную запись.
Здравствуйте,
Select a different account.
У вас несколько учетных записей
Выберите учетную запись, с помощью которой вы хотите войти.

Проблемы

После установки Microsoft SQL Server 2017 на RHEL 7,4 программа завершает работу и генерирует дамп ядра при попытке запустить средство MSSQL-CONF. Кроме того, в журналах systemctl для службы MSSQL-Server (journalctl-u MSSQL-Server. Service)регистрируется следующая запись: 

Программа обнаружила неустранимую ошибку и не может продолжить работу. Доступны следующие диагностические сведения.   Причина: 0x00000003       Сообщение: результат   StackTrace: 00005577212bcd92 0000557721266767        Процесс: 590-sqlservr       Поток: 594 (поток приложения 0x1000)   ИД экземпляра: afe0f97b-fdbc-4a4d-910c-038e7ee2049b      ИД сбоя: 544c4c67-0f49-4877-a959-92c14798d58e   Метка построения: f7473acad6f0299cd161863aaa02e4284434ab6d915c7b467e2a14e907290249   Сбор основных дампов и сведений...

Причина

Эта проблема возникает из-за того, что SQL Server 2017 в Linux несовместим со стандартными макетами. Из-за параметров, включенных в RHEL 7,4, все процессы начинаются с legacy_va_layout. 

При запуске SQL Server в Linux проверяет диапазоны адресов. При обнаружении несовместимости из-за устаревшего внешнего вида, она вызывает Assert, завершает работу программы и генерирует основной дамп.

RHEL 7,4 может переключиться на использование устаревшего макета поддержки по одной из указанных ниже причин.

  • Предельное значение для мягкого стека не ограничено (например, модифицированный сценарий limits. conf или параметр ulimit-s ).

  • Включен макет Global Legacy ва (например, sysctl 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 () | | vvvvvvvvvvvvvvvvvvvv | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |^^^^^^^^^^^^^^| |            КУЧА | +----------------------+ |     СЕГМЕНТЫ ELF | +----------------------+ +----------------------+ 0

MMAP_BASE находится ближе к началу адресного пространства. По мере добавления сопоставлений в адресное пространство их размер растет. Это настройка по умолчанию для RHEL, и именно в этом случае SQL Server ожидает его возникновения при запуске.

Запуск простой программы

Выполнение простой программы, mmaps страницу и возвращающей адрес, возвращенный ядром (пример):

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) |            СТОПКА | | vvvvvvvvv ^ vvvvvvvvvv | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |                                  | |^^^^^^^^^^^^^^| |          MMAP () | +----------------------+ TASK_UNMAPPED_BASE (PAGE_ALIGN (TASK_SIZE/3)) |                                  | |                                  | |                                  | |^^^^^^^^^^^^^^| |            КУЧА | +----------------------+ |     СЕГМЕНТЫ ELF | +----------------------+ +----------------------+ 0

Здесь MMAP_BASE размещается в одной трети от адресного пространства. По мере добавления сопоставлений выделена область адресов (расширяется). Так как у нас есть 47-разрядное виртуальное адресное пространство, в 64-разрядной версии Linux MMAP_BASE размещается около 42nd ТБ виртуального "0x2A0000000000". Таким образом, некоторые адреса, которые уже сопоставлены под 64TB при попытке установить фиксированные карты, не будут отображаться в MSSQL.

Настройка размера стека для неограниченного роста ("Безлимитный")

 [root@localhost ~] # ulimit-s без ограничений  [root@localhost ~] #./mmap   mmap 0x2b6634464000

* Настройка ВМ. 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

Вы можете получить тот же эффект, что и для настройки VM. legacy_va_layout, изменив размер стека, чтобы он увеличивался без ограничений. Разница заключается в том, что после того, как администратор настроит VM. legacy_va_layout = 1, система будет глобально использовать этот макет устаревшего для всех процессов. (Единственный способ перекрыть этот параметр — это сбросить значение параметра sysctl) на 0.) Тем не менее, если у вас есть VM. legacy_va_layout = 0 (по умолчанию), вы можете настроить эту характеристику, изменив предельный размер стека для каждого сеанса для входа, вызвав ulimit (или настроив ограничения. conf).

Нужна дополнительная помощь?

Совершенствование навыков
Перейти к обучению
Первоочередный доступ к новым возможностям
Присоединение к программе предварительной оценки Майкрософт

Были ли сведения полезными?

Насколько вы удовлетворены качеством перевода?
Что повлияло на вашу оценку?

Спасибо за ваш отзыв!

×