Поделиться через


Рекомендации по производительности и конфигурации для SQL Server на Linux

Применимо к:SQL Server в Linux

В этой статье приводятся рекомендации по повышению производительности приложений баз данных, подключающихся к SQL Server на Linux. Эти рекомендации относятся именно к платформе Linux. При этом действуют все стандартные рекомендации в отношении SQL Server, например касающиеся проектирования индекса.

Следующие рекомендации содержат рекомендации по настройке SQL Server и операционной системы Linux (ОС). Рекомендуется использовать эти параметры конфигурации, чтобы обеспечить оптимальную производительность для установки SQL Server.

Рекомендации по конфигурации хранилища

Подсистема хранения, в которой размещаются данные, журналы транзакций и другие связанные файлы (например, файлы контрольных точек для выполняющейся в памяти OLTP), должна легко справляться со средней и пиковой рабочей нагрузкой.

Использование подсистемы хранения с соответствующей скоростью ввода-вывода, пропускной способностью и избыточностью

В локальных средах поставщик хранилища обычно поддерживает соответствующую конфигурацию аппаратного RAID с распределением данных по нескольким дискам, чтобы обеспечить соответствующие IOPS, пропускную способность и избыточность. Однако эта поддержка может отличаться между различными поставщиками хранилища и различными предложениями хранилища с различными архитектурами.

Для SQL Server в Linux, развернутом на виртуальных машинах Azure, рекомендуется использовать программный RAID для обеспечения соответствующих требований по IOPS и пропускной способности. При настройке SQL Server на виртуальных машинах Azure с аналогичными рекомендациями по хранению см. раздел "Настройка хранилища для SQL Server на виртуальных машинах Azure".

В следующем примере показано, как создать raid программного обеспечения в Linux на виртуальной машине Azure. Помните, что необходимо использовать соответствующее количество дисков данных для обеспечения требуемой пропускной способности и количества операций ввода-вывода для томов на основе требований данных, журнала транзакций и tempdb операций ввода-вывода. В следующем примере восемь дисков данных были подключены к виртуальной машине; четыре для размещения файлов данных, два для журналов транзакций и два для tempdb рабочей нагрузки.

Чтобы найти устройства (например, /dev/sdc) для создания RAID, используйте lsblk команду.

# For Data volume, using 4 devices, in RAID 5 configuration with 8KB stripes
mdadm --create --verbose /dev/md0 --level=raid5 --chunk=8K --raid-devices=4 /dev/sdc /dev/sdd /dev/sde /dev/sdf

# For Log volume, using 2 devices in RAID 10 configuration with 64KB stripes
mdadm --create --verbose /dev/md1 --level=raid10 --chunk=64K --raid-devices=2 /dev/sdg /dev/sdh

# For tempdb volume, using 2 devices in RAID 0 configuration with 64KB stripes
mdadm --create --verbose /dev/md2 --level=raid0 --chunk=64K --raid-devices=2 /dev/sdi /dev/sdj

Рекомендации по разбиению дисков на разделы и их настройке

Для SQL Server используйте конфигурацию RAID. Развернутая единица полосы файловой системы (sunit) и ширина полосы соответствуют геометрии RAID. Например, в следующем примере показана конфигурация на основе XFS для тома журнала.

# Creating a log volume, using 6 devices, in RAID 10 configuration with 64KB stripes
mdadm --create --verbose /dev/md3 --level=raid10 --chunk=64K --raid-devices=6 /dev/sda /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf

mkfs.xfs /dev/md3 -f -L log
meta-data=/dev/md3               isize=512    agcount=32, agsize=18287648 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1
data     =                       bsize=4096   blocks=585204384, imaxpct=5
         =                       sunit=16     swidth=48 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=285744, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

Логический массив представляет собой шесть дисков RAID-10 с размером полосы 64 КБ. Вы можете видеть следующее.

  • Для sunit=16 blks, 16 * 4096 размер блока = 64 КБ, соответствует размеру полосы.
  • Для swidth=48 blks, swidth / sunit = 3, что означает количество дисков данных в массиве, не включая диски четности.

SQL Server поддерживает как файловые системы ext4, так и XFS для размещения базы данных, журналов транзакций и других файлов, таких как файлы контрольных точек для OLTP в памяти в SQL Server. Используйте файловую систему XFS для размещения файлов данных SQL Server и файлов журнала транзакций.

Форматирование тома с помощью файловой системы XFS:

mkfs.xfs /dev/md0 -f -L datavolume
mkfs.xfs /dev/md1 -f -L logvolume
mkfs.xfs /dev/md2 -f -L tempdb

Вы можете настроить файловую систему XFS так, чтобы она была нечувствительна к регистру при создании и форматировании тома XFS. Эта конфигурация часто не используется в экосистеме Linux, но может использоваться по соображениям совместимости.

Например, можно выполнить следующую команду. Используется -n version=ci для настройки файловой системы XFS для игнорирования регистра.

mkfs.xfs /dev/md0 -f -n version=ci -L datavolume

Рекомендация по файловой системе постоянной памяти

Для конфигурации файловой системы на устройствах постоянной памяти установите размер блоков основной файловой системы на 2 МБ. Дополнительные сведения см. в технических рекомендациях.

Ограничение на количество открытых файлов

В рабочей среде может потребоваться больше подключений, чем ограничение открытого файла по умолчанию — 1024. Вы можете установить мягкие и жесткие ограничения на 1 048 576. Например, в RHEL измените /etc/security/limits.d/99-mssql-server.conf файл, чтобы иметь следующие значения:

mssql - nofile 1048576

Примечание.

Этот параметр не применяется к службам SQL Server, запущенным systemd. Для получения дополнительной информации см. Как настроить ограничения для служб в RHEL и systemd.

Отключить дату и время последнего доступа на файловых системах для файлов данных и журналов SQL Server

Чтобы убедиться, что диски, подключенные к системе, автоматически подключаются после перезагрузки, добавьте их в /etc/fstab файл. Используйте UUID (универсальный уникальный идентификатор) /etc/fstab для ссылки на диск, а не только имя устройства (например /dev/sdc1, ).

Используйте атрибут с любой noatime файловой системой, в которой хранятся файлы данных и журналов SQL Server. Сведения о задании этого атрибута см. в документации по Linux. В следующем примере показано, как включить noatime параметр для тома, подключенного на виртуальной машине Azure.

Запись точки подключения в /etc/fstab:

UUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" /data1 xfs rw,attr2,noatime 0 0

В предыдущем примере UUID представляет устройство, которое можно найти с помощью blkid команды.

SQL Server и возможность принудительного доступа к модулям (FUA) в подсистеме ввода-вывода

Некоторые версии поддерживаемых дистрибутивов Linux обеспечивают поддержку возможностей подсистемы ввода-вывода FUA, которая обеспечивает устойчивость данных. SQL Server использует функцию FUA для обеспечения высокой эффективности и надежного ввода-вывода для рабочих нагрузок SQL Server. Дополнительные сведения о поддержке FUA дистрибутивом Linux и его влиянии на SQL Server см. в статье SQL Server On Linux: принудительный доступ к единицам (FUA).

SUSE Linux Enterprise Server 12 с пакетом обновления 5 (SP5), Red Hat Enterprise Linux 8.0 и Ubuntu 18.04 представили поддержку возможностей FUA в подсистеме ввода-вывода. Если вы используете SQL Server 2017 (14.x) с накопительным пакетом обновления 6 и более поздних версий, следует использовать следующую конфигурацию для высокой производительности и эффективной реализации операций ввода-вывода с помощью FUA by SQL Server.

Используйте эту рекомендуемую конфигурацию, если выполнены следующие условия.

  • SQL Server 2017 (14.x) CU 6 и более поздних версий

  • Дистрибутив Linux и версия, поддерживающие возможности FUA (начиная с Red Hat Enterprise Linux 8.0, SUSE Linux Enterprise Server 12 с пакетом обновления 5 (SP5) или Ubuntu 18.04)

  • Файловая система XFS для хранилища SQL Server в ядрах Linux 4.18 или более поздних версиях.

  • файловая система ext4 для хранилища SQL Server в ядрах Linux 5.6 или более поздних версиях.

    Примечание.

    Файловую систему XFS следует использовать для размещения файлов данных SQL Server и файлов журналов транзакций, если версия ядра Linux ниже 5.6. Начиная с ядра версии 5.6, вы можете выбрать между XFS и ext4 в зависимости от ваших требований.

  • Подсистема хранения и (или) оборудование, которое поддерживает и настраивается для возможностей FUA

Рекомендуемая конфигурация:

  1. Включите флаг трассировки 3979 в качестве параметра запуска.

  2. Используйте mssql-conf для настройки control.writethrough = 1 и control.alternatewritethrough = 0.

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

  1. Включите флаг трассировки 3982 в качестве параметра запуска (который используется по умолчанию для SQL Server в экосистеме Linux) и убедитесь, что флаг трассировки 3979 не включен в качестве параметра запуска.

  2. Используйте mssql-conf для настройки control.writethrough = 1 и control.alternatewritethrough = 1.

Поддержка FUA для контейнеров SQL Server, развернутых в Kubernetes

  1. SQL Server должен использовать сохраненное подключенное хранилище, а не overlayfs.

  2. Хранилище должно использовать файловую систему XFS или ext4 и поддерживать FUA (ext4 не поддерживает FUA в ядре Linux до версии 5.6). Перед включением этого параметра следует работать с поставщиком дистрибутива и хранилища Linux, чтобы убедиться, что подсистема ОС и хранилища поддерживает параметры FUA. В Kubernetes можно запросить тип файловой системы с помощью следующей команды, где <pvc-name> это ваш PersistentVolumeClaim:

    kubectl describe pv <pvc-name>
    

    В выходных данных найдите fstype, установленное на XFS.

  3. Рабочий узел, на котором размещены модули pod SQL Server, должен использовать дистрибутив Linux и версию, которая поддерживает возможности FUA (начиная с Red Hat Enterprise Linux 8.0, SUSE Linux Enterprise Server 12 SP5 или Ubuntu 18.04).

Если выполнены указанные выше условия, можно использовать следующие рекомендуемые параметры FUA.

  1. Включите флаг трассировки 3979 в качестве параметра запуска.

  2. Используйте mssql-conf для настройки control.writethrough = 1 и control.alternatewritethrough = 0.

Параметры ядра и ЦП для высокой производительности

В этом разделе приводятся рекомендованные параметры ОС Linux для обеспечения высокой производительности и пропускной способности системы SQL Server. Сведения о настройке этих параметров см. в документации по дистрибутиву Linux. Вы можете использовать TuneD , как описано, для настройки множества ЦП и конфигураций ядра, описанных в следующем разделе.

Настройка параметров ядра с помощью TuneD

Для пользователей Red Hat Enterprise Linux (RHEL) профиль пропускной способности TuneD автоматически настраивает некоторые параметры ядра и ЦП (за исключением C-States). Начиная с RHEL 8.0, профиль TuneD с именем mssql был совместно разработан с Red Hat и предлагает более точную настройку производительности Linux для повышения производительности рабочих нагрузок SQL Server. Этот профиль включает профиль производительности пропускной способности RHEL, и мы представляем его определения в этой статье для проверки с другими дистрибутивами Linux и выпусками RHEL без этого профиля.

Для SUSE Linux Enterprise Server 12 SP5, Ubuntu 18.04 и Red Hat Enterprise Linux 7.x можно вручную установить пакет tuned. Используйте его для создания и настройки mssql профиля, как описано в следующем разделе.

Предлагаемые параметры Linux с использованием профиля TuneD mssql

В следующем примере представлена конфигурация TuneD для SQL Server на Linux.

[main]
summary=Optimize for Microsoft SQL Server
include=throughput-performance

[cpu]
force_latency=5

[sysctl]
vm.swappiness = 1
vm.dirty_background_ratio = 3
vm.dirty_ratio = 80
vm.dirty_expire_centisecs = 500
vm.dirty_writeback_centisecs = 100
vm.transparent_hugepages=always
# For multi-instance SQL deployments, use
# vm.transparent_hugepages=madvise
vm.max_map_count=1600000
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
kernel.numa_balancing=0

Если вы используете дистрибутивы Linux с версиями ядра больше 4.18, закомментируйте следующие параметры, как показано ниже; в противном случае раскомментируйте следующие параметры, если вы используете дистрибутивы с версиями ядра до версии 4.18.

# kernel.sched_latency_ns = 60000000
# kernel.sched_migration_cost_ns = 500000
# kernel.sched_min_granularity_ns = 15000000
# kernel.sched_wakeup_granularity_ns = 2000000

Чтобы включить этот профиль TuneD, сохраните эти определения в файле в tuned.conf папке /usr/lib/tuned/mssql и включите профиль с помощью следующих команд:

chmod +x /usr/lib/tuned/mssql/tuned.conf
tuned-adm profile mssql

Убедитесь, что профиль активен, выполнив следующую команду:

tuned-adm active

Или сделайте так:

tuned-adm list

Рекомендации в отношении параметров ЦП

В приведенной ниже таблице представлены рекомендации по параметрам ЦП.

Настройка Значение Дополнительные сведения
Регулятор частоты ЦП производительность См. описание команды cpupower
ENERGY_PERF_BIAS производительность См. описание команды x86_energy_perf_policy
min_perf_pct 100 Посмотрите документацию по Intel P-state
C-States Только C1 См. документацию по Linux или вашей системе, чтобы узнать, как установить C-States только на C1.

При использовании TuneD, как описано, он автоматически настраивает регулятор ENERGY_PERF_BIASчастоты ЦП и min_perf_pct параметры. Он использует профиль пропускная способность-производительность в качестве основы для mssql профиля. Необходимо вручную настроить параметр C-States в соответствии с документацией, предоставленной Linux или распространителем системы.

Рекомендации в отношении параметров дисков

В приведенной ниже таблице представлены рекомендации по параметрам дисков.

Настройка Значение Дополнительные сведения
Диск readahead 4096 См. blockdev команду
Параметры sysctl kernel.sched_min_granularity_ns = 15000000
kernel.sched_wakeup_granularity_ns = 2000000
vm.dirty_ratio = 80
vm.dirty_background_ratio = 3
vm.swappiness = 1
См. описание команды sysctl

Описание

  • vm.swappiness: Этот параметр управляет относительным весом, отводимым для выгрузки памяти процесса выполнения по сравнению с кэшем файловой системы. Значение по умолчанию для этого параметра равно 60, которое указывает на переключение страниц памяти процесса выполнения по сравнению с удалением страниц кэша файловой системы в соотношении от 60:140. Если установить значение 1, это будет означать сильное предпочтение хранения памяти процесса выполнения в физической памяти, уменьшая кэш файловой системы. Поскольку SQL Server использует буферный пул данных в качестве кэша страниц данных и настоятельно предпочитает записывать данные непосредственно в физическое оборудование, обходя кэш файловой системы для надежного восстановления, агрессивная конфигурация параметра swappiness может быть полезна для высокопроизводительных и выделенных SQL Server.

    Дополнительные сведения см. в документации для /proc/sys/vm/—#swappiness.

  • vm.dirty_*: Записи файлов SQL Server выполняются без кеширования, что удовлетворяет требованиям к целостности данных. Эти параметры позволяют обеспечивать эффективную асинхронную запись и снижать влияние операций ввода-вывода на кэширование в Linux, обеспечивая достаточно большой объем кэширования при ограничении очистки.

  • kernel.sched_*: эти значения параметров представляют текущую рекомендацию по настройке алгоритма полностью справедливого планирования (CFS) в ядре Linux. Они улучшают пропускную способность сетевых и хранилищных ввода-вывода с учетом предостановки и возобновления потоков межпроцессного взаимодействия.

Использование профиля TuneD настраивает mssql параметры, vm.swappiness параметры и vm.dirty_* параметры. Необходимо вручную настроить параметр диска readahead с помощью blockdev команды для каждого устройства.

Настройка параметров ядра для автоматической балансировки NUMA в многосегментных системах NUMA

При установке SQL Server в системе NUMA с несколькими узлами по умолчанию включен следующий kernel.numa_balancing параметр ядра. Чтобы разрешить SQL Server работать с максимальной эффективностью в системе NUMA, отключите автоматическую балансировку NUMA в системе NUMA с несколькими узлами:

sysctl -w kernel.numa_balancing=0

mssql Использование профиля TuneD настраивает kernel.numa_balancing этот параметр.

Параметры ядра для виртуального адресного пространства

Параметр vm.max_map_count по умолчанию (65536) может быть недостаточно высоким для установки SQL Server. По этой причине измените значение параметра vm.max_map_count по крайней мере до 262144 для развертывания SQL Server и ознакомьтесь с разделом предлагаемых параметров Linux с помощью профиля TuneD mssql для дополнительной настройки этих параметров ядра. Максимальное значение для vm.max_map_count 2147483647.

sysctl -w vm.max_map_count=1600000

mssql Использование профиля TuneD настраивает vm.max_map_count этот параметр.

Сохранение параметра Transparent Huge Pages (THP) во включенном состоянии

Большинство установок Linux имеют этот параметр по умолчанию. Для наиболее стабильного опыта производительности оставьте этот параметр конфигурации включенным. Однако если в развертываниях SQL Server имеется высокая активность пагинации памяти с несколькими экземплярами или запуск SQL Server вместе с другими приложениями, требующими большой объем памяти на сервере, проверьте производительность приложения после выполнения следующей команды:

echo madvise > /sys/kernel/mm/transparent_hugepage/enabled

Или измените профиль TuneD, добавив строку: mssql

vm.transparent_hugepages=madvise

Убедитесь, что mssql профиль активен после изменения.

tuned-adm off
tuned-adm profile mssql

mssql Использование профиля TuneD настраивает transparent_hugepage этот параметр.

Рекомендации по настройке сети

Наряду с рекомендациями по хранилищу и ЦП у вас также есть рекомендации по сети. Для получения справки перечислены следующие рекомендации. Не все параметры в следующих примерах доступны в разных сетевых адаптерах. Обратитесь к поставщикам сетевых карт для консультации и получения указаний по каждому из этих вариантов. Протестируйте эти настройки в среде разработки перед их применением в рабочей среде. Ниже приведены примеры, а используемые команды относятся к типу сетевого адаптера и поставщику.

  1. Настройка размера буфера сетевого порта. В примере сетевой адаптер называется eth0, который является сетевой картой на основе Intel. Для сетевого адаптера на основе Intel рекомендуемый размер буфера составляет 4 КБ (4096). Проверьте предустановленные максимумы и настройте его с помощью следующего примера:

    Проверьте предустановленные максимумы с помощью следующей команды. Замените eth0 на имя вашего NIC.

    ethtool -g eth0
    

    Задайте для буфера rx (получения) и tx (передачи) значение 4 КБ:

    ethtool -G eth0 rx 4096 tx 4096
    

    Убедитесь, что значение настроено правильно:

    ethtool -g eth0
    
  2. Включите джамбо-фреймы. Прежде чем включать большие кадры, убедитесь, что все сетевые коммутаторы, маршрутизаторы и другие важные элементы в сетевом пути передачи пакетов между клиентами и SQL Server поддерживают большие кадры. Только после этого включение кадров увеличенного размера может повысить производительность. После включения кадров jumbo подключитесь к SQL Server и измените размер сетевого пакета на 8060, sp_configureкак показано в следующем примере:

    # command to set jumbo frame to 9014 for a Intel NIC named eth0 is
    ifconfig eth0 mtu 9014
    # verify the setting using the command:
    ip addr | grep 9014
    
    EXECUTE sp_configure 'network packet size', '8060';
    GO
    
    RECONFIGURE WITH OVERRIDE;
    GO
    
  3. По умолчанию задайте порт для адаптивного объединения RX/TX IRQ, что означает, что доставка прерываний корректируется, чтобы повысить задержку при низкой скорости пакетов и повысить пропускную способность при высокой скорости пакетов. Этот параметр может быть недоступен в сетевой инфраструктуре, поэтому просмотрите существующую сетевую инфраструктуру и убедитесь, что этот параметр поддерживается. Пример — для сетевого адаптера с именем eth0, который является адаптером на основе Intel.

    1. Задайте порт для адаптивного объединения RX/TX IRQ:

      ethtool -C eth0 adaptive-rx on
      ethtool -C eth0 adaptive-tx on
      
    2. Подтвердите параметр:

      ethtool -c eth0
      

    Примечание.

    Для предсказуемого поведения в высокопроизводительных средах, таких как среды для тестирования производительности, отключите адаптивную агрегацию прерываний RX/TX IRQ, а затем задайте агрегацию прерываний RX/TX вручную. Чтобы отключить объединение запросов на прерывание RX/TX, воспользуйтесь примером команд, а затем установите конкретные значения.

    Отключите адаптивное объединение RX/TX IRQ:

    ethtool -C eth0 adaptive-rx off
    ethtool -C eth0 adaptive-tx off
    

    Подтвердите изменение:

    ethtool -c eth0
    

    Установите параметры rx-usecs и irq. rx-usecs указывает, сколько микросекунд должно пройти после получения хотя бы одного пакета, прежде чем сгенерировать прерывание. Параметр irq указывает соответствующие задержки при обновлении состояния при отключении прерывания. Для сетевых карт компании Intel можно использовать следующие параметры.

    ethtool -C eth0 rx-usecs 100 tx-frames-irq 512
    

    Подтвердите изменение:

    ethtool -c eth0
    
  4. Включите масштабирование на стороне получения (RSS) и по умолчанию объедините RX и TX-сторону очередей RSS. Существуют определенные сценарии, при работе с поддержкой Майкрософт, где отключение RSS также повышает производительность. Протестируйте этот параметр в тестовой среде перед его применением в рабочих средах. В следующем примере используется сетевые адаптеры Intel.

    Получение предустановленных максимальных значений:

    ethtool -l eth0
    

    Объедините очереди с максимальным значением, указанным в предустановке "Объединенный". В этом примере значение установлено на 8:

    ethtool -L eth0 combined 8
    

    Проверьте настройки:

    ethtool -l eth0
    
  5. Обратитесь к сопоставлению портов IRQ с сетевым адаптером. Чтобы добиться ожидаемой производительности, путем корректировки привязки IRQ, рассмотрите несколько важных параметров, таких как обработка топологии сервера с помощью Linux, стек драйверов сетевого адаптера, параметры по умолчанию и параметр irqbalance. Оптимизация настроек привязки IRQ портов NIC выполняется с учетом топологии сервера, отключением irqbalance, и использованием специальных параметров от производителя сетевых карт.

    Следующий пример конкретной сетевой инфраструктуры Mellanox помогает объяснить конфигурацию. Дополнительные сведения о том, как скачать средства Mellanox для сетевых адаптеров Mellanox, см. в разделе "Средства настройки производительности". Команды изменяются в зависимости от среды. Обратитесь к поставщику сетевого адаптера, чтобы получить дополнительные рекомендации.

    Отключите irqbalanceили получите моментальный снимок параметров IRQ и принудительно завершите работу управляющей программы:

    systemctl disable irqbalance.service
    

    Или сделайте так:

    irqbalance --oneshot
    

    Убедитесь, что common_irq_affinity.sh это исполняемый файл:

    chmod +x common_irq_affinity.sh
    

    Отображение привязки IRQ для порта сетевого адаптера Mellanox (например, eth0):

    ./show_irq_affinity.sh eth0
    

    Оптимизируйте оптимальную производительность пропускной способности с помощью средства Mellanox:

    ./mlnx_tune -p HIGH_THROUGHPUT
    

    Установите привязку оборудования к узлу NUMA, на котором физически размещен сетевой адаптер и его порт.

    ./set_irq_affinity_bynode.sh `\cat /sys/class/net/eth0/device/numa_node` eth0
    

    Проверьте привязку IRQ:

    ./show_irq_affinity.sh eth0
    

    Улучшение оптимизаций объединения IRQ

    ethtool -C eth0 adaptive-rx off
    ethtool -C eth0 adaptive-tx off
    ethtool -C eth0  rx-usecs 750 tx-frames-irq 2048
    

    Проверьте параметры:

    ethtool -c eth0
    
  6. После внесения предыдущих изменений проверьте скорость сетевого адаптера, чтобы убедиться, что она соответствует вашим ожиданиям с помощью следующей команды:

    ethtool eth0 | grep -i Speed
    

Расширенная конфигурация ядра и ОС

  • Для оптимальной производительности операций ввода-вывода хранилища используйте многоканальное планирование Linux для блочных устройств. Этот метод планирования позволяет производительности блочного слоя масштабироваться хорошо с быстрыми твердотельными дисками (SSD) и многоядерными системами. Проверьте документацию, чтобы узнать, включено ли это в вашем дистрибутиве Linux по умолчанию. В большинстве других случаев можно загрузить ядро scsi_mod.use_blk_mq=y, чтобы активировать его. Документация по дистрибутиву Linux может иметь дополнительные рекомендации по этому параметру. Этот параметр соответствует вышестоящему ядру Linux.

  • Поскольку для развертываний SQL Server часто используется многопутевое I/O, настройте целевой объект многозадачности сопоставления устройств (DM), чтобы использовать blk-mq инфраструктуру, включив dm_mod.use_blk_mq=y параметр загрузки ядра. Значение по умолчанию — n (отключено). Этот параметр снижает издержки блокировки на уровне диспетчера устройств (DM), когда используются базовые устройства SCSI с blk-mq. Дополнительные сведения о настройке многопатокового ввода-вывода см. в документации по дистрибутиву Linux.

Настройка файла подкачки

Во избежание проблем с нехваткой памяти правильно настройте файл подкачки. Сведения о создании файла подкачки и его правильном размере см. в документации по вашей системе Linux.

Виртуальные машины и динамическая память

Если SQL Server на Linux выполняется в виртуальной машине, настройте фиксированный размер памяти, резервируемой для виртуальной машины. Не используйте такие функции, как динамическая память Hyper-V.

Конфигурация SQL Server

Выполните следующие задачи конфигурации после установки SQL Server на Linux, чтобы обеспечить оптимальную производительность приложения.

Лучшие практики

Использование PROCESS AFFINITY для узлов и ЦП

Используйте ALTER SERVER CONFIGURATION для установки PROCESS AFFINITY всех узлов и ЦПУ, которые вы используете для SQL Server (обычно для всех узлов и ЦПУ) в ОС Linux. Соответствие процессоров помогает эффективно планировать работу Linux и SQL. NUMANODE Использование параметра является самым простым методом. Используйте PROCESS AFFINITY даже если на компьютере есть только один узел NUMA. Дополнительные сведения о настройке PROCESS AFFINITYсм. в статье ALTER SERVER CONFIGURATION .

Настройка нескольких tempdb файлов данных

Так как установка SQL Server на Linux не предоставляет возможность настройки нескольких tempdb файлов, рекомендуется создать несколько tempdb файлов данных после установки. Дополнительные сведения см. в статье Рекомендации по сокращению состязания за выделяемые ресурсы в базе данных tempdb SQL Server.

Расширенная конфигурация

Следующие рекомендации являются необязательными параметрами конфигурации, которые можно выполнить после установки SQL Server на Linux. Их выбор зависит от требований рабочей нагрузки и конфигурации ОС Linux.

Настройка предельного объема памяти с помощью mssql-conf

Чтобы обеспечить достаточную физическую память для операционной системы Linux, процесс SQL Server использует только 80% физической ОЗУ по умолчанию. Для некоторых систем с большим объемом физической ОЗУ 20% может быть значительным числом.

Например, в системе с 1 ТБ ОЗУ при настройке по умолчанию неиспользуемыми остаются приблизительно 200 ГБ ОЗУ. В таком случае может быть желательно установить более высокий предел памяти. Это значение можно изменить с помощью средства mssql-conf . Дополнительные сведения см. в параметре memory.memorylimitmb , который управляет памятью, видимой для SQL Server (в единицах МБ).

Примечание.

Можно также настроить ограничение памяти с помощью переменной MSSQL_MEMORY_LIMIT_MB среды. Этот метод часто используется при развертывании контейнеров или автоматизации контейнеров SQL Server или развертываний на основе пакетов. Переменная MSSQL_MEMORY_LIMIT_MB среды имеет приоритет над параметром memory.memorylimitmb .

При изменении этого параметра будьте осторожны. Не задавайте слишком большое значение. Если памяти будет недостаточно, могут возникнуть проблемы в работе ОС Linux и других приложений Linux.

Настройка ограничений памяти с помощью группы управления (cgroup) версии 2

Начиная с SQL Server 2025 (17.x) и SQL Server 2022 (16.x) CU 20, SQL Server обнаруживает ограничения группы управления (cgroup) версии 2, улучшает стабильность производительности и изоляцию ресурсов в средах Docker, Kubernetes и OpenShift. Группы управления позволяют точно контролировать ядро Linux над системными ресурсами, такими как ЦП и память.

При поддержке cgroup версии 2 SQL Server устраняет ошибки, ранее наблюдавшиеся в контейнерных развертываниях, особенно в кластерах Kubernetes (например, AKS версии 1.25+), где ограничения памяти, определенные в спецификациях контейнеров, не были применены.

Проверьте версию cgroup

stat -fc %T /sys/fs/cgroup

Результаты приведены следующим образом:

Result Описание
cgroup2fs Вы используете cgroup версии 2
cgroup Вы используете cgroup версии 1

Переключение на cgroup версии 2

Самый простой путь — выбор дистрибутива, который поддерживает cgroup версии 2 из коробки.

Если вам нужно переключиться вручную, добавьте следующую строку в конфигурацию GRUB:

systemd.unified_cgroup_hierarchy=1

Затем выполните следующую команду, чтобы обновить GRUB:

sudo update-grub

Дополнительные сведения см. в следующих ресурсах:

Рекомендации по настройке ограничений памяти

При настройке ограничений памяти для SQL Server в Linux рассмотрите следующие рекомендации.

  • Используется cgroup для ограничения общей памяти, доступной контейнеру. Этот параметр устанавливает верхнюю границу для всех процессов внутри контейнера.

  • Ограничение памяти (независимо от того, установлено ли оно с помощью memorylimitmb или задано переменной среды MSSQL_MEMORY_LIMIT_MB) контролирует общий объем памяти, который SQL Server на Linux может выделять для всех своих компонентов, таких как буферный пул, SQLPAL, агент SQL Server, LibOS, PolyBase, Full-Text Search, и любые другие процессы, использующиеся в SQL Server на Linux.

  • Переменная MSSQL_MEMORY_LIMIT_MB среды имеет приоритет над memorylimitmb определенным в mssql.conf.

  • memorylimitmb не может превышать фактическую физическую память хост-системы.

  • Установите memorylimitmb меньше, чем узловая память системы и ограничение cgroup (если оно установлено), чтобы обеспечить достаточно свободной физической памяти для операционной системы Linux. Если вы явно не задали memorylimitmb, SQL Server использует 80% меньшего значения между общей системной памятью и ограничением cgroup (при наличии).

  • Параметр конфигурации сервера max_server_memory ограничивает только размер буферного пула SQL Server и не управляет общим использованием памяти для SQL Server в Linux. Всегда устанавливайте это значение ниже, чем memorylimitmb для обеспечения достаточного объема памяти для других компонентов, таких как SQLPAL, агент SQL Server, LibOS, PolyBase, Full-Text Search и любой другой процесс, загруженный в SQL Server в Linux.