Проблемы
После установки 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).
Решение
-
В макете /etc/security/limits.conf добавьте новую строку, а затем введите следующий код: mssql soft stack 8192 root soft stack 8192
-
В макете /etc/sysctl.conf добавьте новую строку, а затем введите следующий код: vm.legacy_va_layout = 0
-
Перезагрузите компьютер. reboot
-
Убедитесь в том, что параметр "программный стек" для пользователей, корневых и MSSQL— 8192. Переключитесь на контекст пользователя, а затем выполните следующую команду: ulimit -s
-
Убедитесь в том, что глобальный устаревший макет устарел ( 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).