Рекомендации по производительности и конфигурации для SQL Server на LinuxPerformance best practices and configuration guidelines for SQL Server on Linux

Применимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions)  — LinuxПрименимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) - Linux

В этой статье приводятся рекомендации по повышению производительности приложений баз данных, подключающихся к SQL Server на Linux.This article provides best practices and recommendations to maximize performance for database applications that connect to SQL Server on Linux. Эти рекомендации относятся именно к платформе Linux.These recommendations are specific to running on the Linux platform. При этом действуют все стандартные рекомендации в отношении SQL Server, например касающиеся проектирования индекса.All normal SQL Server recommendations, such as index design, still apply.

Ниже приводятся рекомендации по настройке SQL Server и операционной системы (ОС) Linux.The following guidelines contain recommendations for configuring both SQL Server and the Linux Operating System (OS).

Конфигурация ОС LinuxLinux OS Configuration

Чтобы обеспечить максимальную производительность системы SQL Server, рекомендуется использовать приведенные ниже параметры конфигурации ОС Linux.Consider using the following Linux OS configuration settings to experience the best performance for a SQL Server Installation.

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

Использование подсистемы хранения с соответствующей скоростью ввода-вывода, пропускной способностью и избыточностьюUse storage subsystem with appropriate IOPS, throughput, and redundancy

Подсистема хранения, в которой размещаются данные, журналы транзакций и другие связанные файлы (например, файлы контрольных точек для выполняющейся в памяти OLTP), должна легко справляться со средней и пиковой рабочей нагрузкой.The storage subsystem hosting data, transaction logs, and other associated files (such as checkpoint files for in-memory OLTP) should be capable of managing both average and peak workload gracefully. Как правило, в локальных средах поставщик хранилища поддерживает соответствующую аппаратную конфигурацию RAID с чередованием нескольких дисков для обеспечения надлежащей скорости ввода-вывода, пропускной способности и избыточности.Normally, in on-premise environments, the storage vendor support appropriate hardware RAID configuration with striping across multiple disks to ensure appropriate IOPS, throughput, and redundancy. Однако эта поддержка зависит от конкретного поставщика хранилища и конкретной архитектуры системы хранения.Though, this can differ across different storage vendors and different storage offerings with varying architectures.

Для сервера SQL Server на Linux, развернутого на Виртуальных машинах Azure, рекомендуется использовать программную реализацию RAID, чтобы обеспечить выполнение требований к скорости ввода-вывода и пропускной способности.For SQL Server on Linux deployed on Azure Virtual Machines, consider using software RAID to ensure appropriate IOPS and throughput requirements are achieved. Сведения о различных аспектах, связанных с системой хранения при настройке SQL Server на виртуальных машинах Azure, см. в следующей статье: Настройка хранилища для виртуальных машин SQL ServerRefer to following article when configuring SQL Server on Azure virtual machines for similar storage considerations: Storage configuration for SQL Server VMs

Ниже приведен пример создания программного RAID-массива в Linux на Виртуальных машинах Azure.The following is an example of how to create software raid in Linux on Azure Virtual Machines. Однако вам следует использовать надлежащее количество дисков данных для достижения требуемой пропускной способности и скорости ввода-вывода с учетом объема данных, размера журнала транзакций и базы данных tempdb.An example is provided below, but you should use the appropriate number of data disks for the required throughput and IOPS for volumes based on the data, transaction log, and tempdb IO requirements. В этом примере к виртуальной машине Azure подключены восемь дисков данных: 4 для размещения файлов данных, 2 — для журналов транзакций и 2 — для рабочей нагрузки tempdb.In this example, eight data disks were attached to the Azure Virtual Machine; 4 to host data files, 2 for transaction logs, and 2 for tempdb workload.

# To locate the devices (for example /dev/sdc) for RAID creation, use the lsblk command
# 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

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

Для SQL Server рекомендуется использовать конфигурации RAID.For SQL Server, it is recommended to use RAID configurations. Размер полосы (sunit) и ширина полосы развернутой файловой системы должны соответствовать геометрии RAID.The deployed filesystem stripe unit (sunit) and stripe width should match the RAID geometry. Ниже приведен пример для тома журнала в файловой системе XFS.Here is an XFS filesystem-based example for a log volume.

# 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/sda1 -f -L log 
meta-data=/dev/sda1              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 КБ.The log array is a 6-drive RAID-10 with a 64k stripe. Вы можете видеть следующее.As you can see:

  • Значение sunit=16 * bsize=4096 равно 64 КБ, что соответствует размеру полосы.The "sunit=16 blks", 16*4096 blk size= 64k, matches the stripe size.
  • Значение swidth = 48 blks, деленное на sunit, равно 3, что соответствует количеству дисков в массиве за вычетом дисков четности.The "swidth = 48 blks", swidth/sunit = 3, which is the number of data drives in the array, excluding parity drives.

Рекомендации по конфигурации файловой системыFile System Configuration recommendation

SQL Server поддерживает файловые системы EXT4 и XFS для размещения базы данных, журналов транзакций и дополнительных файлов, таких как файлы контрольных точек для выполняющейся в памяти OLTP.SQL Server supports both EXT4 and XFS file systems to host the database, transaction logs, and additional files such as checkpoint files for in-memory OLTP in SQL Server. Корпорация Майкрософт рекомендует использовать файловую систему XFS для размещения файлов данных и журнала транзакций SQL Server.Microsoft recommends using XFS file system for hosting the SQL Server data and transaction log files.

# Formatting the volume with XFS filesystem
mkfs.xfs /dev/md0 -f -L datavolume
mkfs.xfs /dev/md1 -f -L logvolume
mkfs.xfs /dev/md2 -f -L tempdb

Примечание

При создании и форматировании тома XFS можно настроить файловую систему XFS так, чтобы она не учитывала регистр.It's possible to configure the XFS file system to be case insensitive when creating and formatting the XFS volume. В экосистеме Linux такая конфигурация применяется нечасто, но может потребоваться в целях совместимости.It is not the frequently used configuration in Linux ecosystem but can be used for compatibility reasons.

Пример: mkfs.xfs /dev/md0 -f -n version=ci -L datavolumeExample: mkfs.xfs /dev/md0 -f -n version=ci -L datavolume

В этом примере параметры -n version=ci служат для настройки файловой системы XFS как не учитывающей регистр.In the example, parameters -n version=ci are used to configure the XFS filesystem to be case insensitive.

Рекомендация в отношении файловой системы PMEMPersistent Memory filesystem recommendation

Для базовой файловой системы на устройствах PMEM следует настроить выделение блоков по 2 МБ.For the filesystem configuration on Persistent Memory devices, the block allocation for the underlying filesystem should be 2 MB. Дополнительные сведения на эту тему см. в разделе Технические вопросы.For more information on this topic, review the article Technical considerations.

Отключение даты и времени последнего доступа к файлам данных и журналов SQL Server в файловых системахDisable last accessed date/time on file systems for SQL Server data and log files

Чтобы обеспечить автоматическое повторное подключение дисков, подключенных к системе, после перезагрузки, их необходимо добавить в файл /etc/fstab.To ensure that the drive(s) attached to the system are remounted automatically after a reboot, they must be added to the /etc/fstab file. Также для ссылки на диск настоятельно рекомендуется использовать в файле /etc/fstab идентификатор UUID (глобальный уникальный идентификатор), а не просто имя устройства (например, /dev/sdc1).It's also highly recommended that the UUID (Universally Unique Identifier) is used in /etc/fstab to refer to the drive rather than just the device name (such as /dev/sdc1).

Настоятельно рекомендуется применять атрибут noatime с любой файловой системой, которая используется для хранения файлов данных и журналов SQL Server.Use of noatime attribute with any file system that is used to store SQL Server data and log files is highly recommended. Сведения о задании этого атрибута см. в документации по Linux.Refer to your Linux documentation on how to set this attribute. Ниже приведен пример включения параметра noatime для тома, подключенного к виртуальной машине Azure.An example of how to enable noatime option for a volume mounted in Azure Virtual Machine is below.

Запись точки подключения в /etc/fstabThe mount point entry in /etc/fstab

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

В приведенном выше примере UUID представляет устройство, которое можно найти с помощью команды blkid.In the example above, UUID represents the device that you can find using the blkid command.

SQL Server и возможность принудительного доступа к модулям (FUA) в подсистеме ввода-выводаSQL Server and Forced Unit Access (FUA) I/O subsystem capability

В некоторых версиях поддерживаемых дистрибутивов Linux поддерживается возможность FUA подсистемы ввода-вывода, которая обеспечивает устойчивость данных.There are certain versions of supported Linux distributions that provide support for FUA I/O subsystem capability to provide data durability. SQL Server использует возможность FUA для обеспечения эффективного и надежного ввода-вывода при выполнении рабочей нагрузки.SQL Server uses FUA capability to provide highly efficient and reliable I/O for SQL server workload. Дополнительные сведения о поддержке возможности FUA в различных дистрибутивах Linux и ее влиянии на SQL Server см. в следующем блоге: SQL Server в Linux: внутренние методы принудительного доступа к модулям (FUA).For additional information on FUA support by Linux distribution and its impact for SQL Server, read following blog: SQL Server On Linux: Forced Unit Access (FUA) Internals

SUSE Linux Enterprise Server 12 с пакетом обновления 5 (SP5) и Red Hat Enterprise Linux 8.0 и более поздних версий поддерживают возможность FUA в подсистеме ввода-вывода.SUSE Linux Enterprise Server 12 SP5 and Red Hat Enterprise Linux 8.0 onwards support FUA capability in the I/O subsystem. Если вы используете SQL Server 2017 с накопительным пакетом обновления 6 (CU6) или выше либо SQL Server 2019, следует использовать указанную ниже конфигурацию для высокопроизводительной, эффективной реализации ввода-вывода с функцией FUA.If you're using SQL Server 2017 CU6 and above or SQL Server 2019, you should use following configuration for high performing and efficient I/O implementation with FUA by SQL Server.

Используйте приведенную ниже рекомендуемую конфигурацию, если выполняются указанные ниже условия.Use the recommended configuration listed below if the following conditions are met.

  • Используется SQL Server 2017 с накопительным пакетом обновления 6 (CU6) или выше либо SQL Server 2019.Using SQL Server 2017 CU6 or newer, or SQL Server 2019
  • Используется дистрибутив и версия Linux, поддерживающие возможность FUA (Red Hat Enterprise Linux 8.0 или более поздней версии либо SUSE Linux Enterprise Server 12 с пакетом обновления 5 (SP5))Using a Linux distribution and version that supports FUA capability (Red Hat Enterprise Linux 8.0 or higher, or SUSE Linux Enterprise Server 12 SP5)
  • Подсистема хранения и (или) оборудование поддерживают возможность FUA и настроены для ее использования.On storage subsystem and/or hardware that supports and is configured for FUA capability

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

  1. Включите флаг трассировки 3979 в качестве параметра запуска.Enable trace flag 3979 as a startup parameter
  2. Используйте mssql-conf для настройки control.writethrough = 1 и control.alternatewritethrough = 0.Use mssql-conf to configure control.writethrough = 1 and control.alternatewritethrough = 0

Для почти всех остальных конфигураций, которые не соответствуют указанным выше условиям, рекомендуется приведенная ниже конфигурация.For almost all other configuration that doesn't meet the previous conditions, the recommended configuration is as follows:

  1. Включите флаг трассировки 3982 в качестве параметра запуска (используется по умолчанию для SQL Server в экосистеме Linux) и убедитесь в том, что флаг трассировки 3979 не включен в качестве параметра запуска.Enable trace flag 3982 as a startup parameter (which is default for SQL Server in the Linux ecosystem), while ensuring trace flag 3979 isn't enabled as a startup parameter
  2. Используйте mssql-conf для настройки control.writethrough = 1 и control.alternatewritethrough = 1.Use mssql-conf to configure control.writethrough = 1 and control.alternatewritethrough = 1

Параметры ядра и ЦП для высокой производительностиKernel and CPU settings for high performance

В этом разделе приводятся рекомендованные параметры ОС Linux для обеспечения высокой производительности и пропускной способности системы SQL Server.The following section describes the recommended Linux OS settings related to high performance and throughput for a SQL Server installation. Сведения о настройке этих параметров см. в документации по ОС Linux.See your Linux OS documentation for the process to configure these settings. С помощью службы Tuned можно настроить многие из описанных ниже конфигураций ЦП и ядра.Using Tuned as described helps configure many CPUs and kernel configurations described below.

Настройка параметров ядра с помощью службы TunedUsing Tuned to configure Kernel settings

В Red Hat Enterprise Linux (RHEL) при использовании профиля пропускной способности Tuned некоторые параметры ядра и ЦП задаются автоматически (за исключением режима C-States).For Red Hat Enterprise Linux (RHEL) users, the Tuned throughput-performance profile configures some kernel and CPU settings automatically (except for C-States). Начиная с RHEL 8.0 используется профиль *Tuned _ под названием _ *mssql**, разработанный совместно с Red Hat и предоставляющий возможность более детальной настройки производительности для рабочих нагрузок SQL Server.Starting with RHEL 8.0, a Tuned _ profile named _ mssql was codeveloped with Red Hat and offers finer Linux performance-related tunings for SQL Server workloads. Этот профиль включает профиль пропускной способности RHEL. Определения этого профиля представлены ниже для сравнения с другими дистрибутивами Linux и выпусками RHEL, не содержащими этого профиля.This profile includes the RHEL throughput-performance profile and we present its definitions below for your review with other Linux distros and RHEL releases without this profile.

В SUSE Linux Enterprise Server 12 с пакетом обновления 5 (SP5), Ubuntu 18.04 и Red Hat Enterprise Linux 7.x пакет *Tuned _ можно установить вручную.For SUSE Linux Enterprise Server 12 SP5, Ubuntu 18.04, and Red Hat Enterprise Linux 7.x, the *Tuned _ package can be installed manually. Его можно использовать для создания и настройки профиля _ *mssql**, как описано ниже.It can be used to create and configure the _ mssql* profile as described below.

Рекомендуемые параметры Linux при использовании профиля Tuned mssqlProposed Linux settings using a Tuned mssql profile
#
# A Tuned configuration for SQL Server on 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
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 и включите профиль, выполнив следующие команды:To enable this Tuned profile, save these definitions in a tuned.conf file under a /usr/lib/tuned/mssql folder, and enable the profile using the following commands:

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

Проверьте, включен ли профиль, с помощью следующей команды:Verify it's enabled with the following command:

tuned-adm active

илиor

tuned-adm list

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

В приведенной ниже таблице представлены рекомендации по параметрам ЦП.The following table provides recommendations for CPU settings:

ПараметрSetting ЗначениеValue Дополнительные сведенияMore information
Регулятор частоты ЦПCPU frequency governor производительностьperformance См. описание команды cpupowerSee the cpupower command
ENERGY_PERF_BIASENERGY_PERF_BIAS производительностьperformance См. описание команды x86_energy_perf_policySee the x86_energy_perf_policy command
min_perf_pctmin_perf_pct 100100 См. документацию по режиму Intel p-stateSee your documentation on intel p-state
C-StatesC-States Только C1C1 only Сведения о том, как включить только режим C1 C-States, см. в документации по Linux или вашей системеSee your Linux or system documentation on how to ensure C-States is set to C1 only

При использовании службы *Tuned _ описанным выше образом параметры регулятора частоты ЦП, ENERGY_PERF_BIAS и min_perf_pct настраиваются автоматически, так как профиль пропускной способности используется как основа для профиля _ *mssql**.Using Tuned _ as described earlier automatically configures CPU frequency governor, ENERGY_PERF_BIAS, and min_perf_pct settings appropriately due to the throughput-performance profile being used as base for the _ mssql profile. Параметр C-States необходимо настроить вручную в соответствии с документацией, предоставляемой сообществом Linux или распространителем системы.C-States parameter must be configured manually according to the documentation provided by Linux or the system distributor.

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

В приведенной ниже таблице представлены рекомендации по параметрам дисков.The following table provides recommendations for disk settings:

ПараметрSetting ЗначениеValue Дополнительные сведенияMore information
disk readaheaddisk readahead 40964096 См. описание команды blockdevSee the blockdev command
Параметры sysctlsysctl settings kernel.sched_min_granularity_ns = 15000000kernel.sched_min_granularity_ns = 15000000
kernel.sched_wakeup_granularity_ns = 2000000kernel.sched_wakeup_granularity_ns = 2000000
vm.dirty_ratio = 80vm.dirty_ratio = 80
vm.dirty_background_ratio = 3vm.dirty_background_ratio = 3
vm.swappiness = 1vm.swappiness = 1
См. описание команды sysctlSee the sysctl command

Описание.Description:

  • vm.swappiness: Этот параметр управляет относительным весовым коэффициентом, присвоенным выгрузке из памяти процесса среды выполнения по сравнению с кэшем файловой системы.vm.swappiness: This parameter controls relative weight given to swapping out runtime process memory as compared to filesystem cache. Значение этого параметра по умолчанию — 60, то есть страницы выгружаются из памяти процесса среды выполнения и удаляются из кэша файловой системы в соотношении 60:140.The default value for this parameter is 60, which indicates swapping runtime process memory pages as compared to removing filesystem cache pages at ratio of 60:140. Значение 1 указывает на то, что в физической памяти предпочтительнее сохранять процесс среды выполнения, а не кэш файловой системы.Setting the value 1 indicates strong preference for keeping runtime process memory in physical memory at expense of filesystem cache. Так как SQL Server использует буферный пул в качестве кэша страниц данных и преимущественно выполняет запись в физическую память в обход кэша файловой системы для надежного восстановления, конфигурация с агрессивной подкачкой может быть выгодна для высокопроизводительных и выделенных серверов SQL Server.Since SQL Server uses buffer pool as a data page cache and strongly prefers to write through to physical hardware bypassing filesystem cache for reliable recovery, aggressive swappiness configuration can be beneficial for high performing and dedicated SQL Server. Дополнительные сведения см. в документации по параметру /proc/sys/vm/ — #swappiness.You can find additional information at Documentation for /proc/sys/vm/ - #swappiness

  • vm.dirty_* : операции доступа SQL Server для записи файлов не кэшируются для выполнения требований к целостности данных.vm.dirty_*: SQL Server file write accesses are uncached, satisfying its data integrity requirements. Эти параметры обеспечивают высокую производительность асинхронной записи и снижают влияние операций записи с кэшированием в Linux на подсистему ввода-вывода хранилища, разрешая кэширование достаточного объема содержимого, при этом ограничивая запись на диск.These parameters allow efficient asynchronous write performance and lower the storage IO impact of Linux caching writes by allowing large enough caching while throttling flushing.

  • kernel.sched_* : эти значения параметров представляют текущую рекомендацию по настройке алгоритма абсолютно справедливого планирования (CFS) в ядре Linux для повышения пропускной способности сети и подсистемы ввода-вывода хранилища с точки зрения межпроцессного вытеснения и возобновления потоков.kernel.sched_*: These parameter values represent the current recommendation for tweaking the Completely Fair Scheduling (CFS) algorithm in the Linux Kernel, to improve throughput of network and storage IO calls with respect to inter-process preemption and resumption of threads.

При использовании профиля mssql Tuned _ настраиваются параметры _ vm.swappiness, vm.dirty_* _ и _ kernel.sched_* .Using the mssql Tuned_ profile configures the * vm.swappiness**, **vm.dirty*_ and _ kernel.sched_** settings. Настройка readahead для диска с помощью команды blockdev производится на уровне устройства и должна выполняться вручную.The disk readahead configuration using blockdev command is per device and must be performed manually.

Автоматическая балансировка между узлами NUMA в системах с несколькими узлами NUMAKernel setting auto numa balancing for multi-node NUMA systems

Если сервер SQL Server устанавливается в системе с несколькими узлами NUMA, указанный ниже параметр ядра kernel.numa_balancing включается по умолчанию.If you install SQL Server on a multi-node NUMA system, the following kernel.numa_balancing kernel setting is enabled by default. Чтобы обеспечить максимально эффективную работу SQL Server в системе NUMA, отключите автоматическую балансировку NUMA в системе с несколькими узлами NUMA.To allow SQL Server to operate at maximum efficiency on a NUMA system, disable auto numa balancing on a multi-node NUMA system:

sysctl -w kernel.numa_balancing=0

При использовании профиля Tuned _ mssql настраивается параметр _ kernel.numa_balancing.Using the mssql **Tuned_ profile configures the _* kernel.numa_balancing* option.

Параметры ядра для виртуального адресного пространстваKernel settings for Virtual Address Space

Значение параметра vm.max_map_count по умолчанию (65 536) может быть недостаточно большим для системы SQL Server.The default setting of vm.max_map_count (which is 65536) may not be high enough for a SQL Server installation. Поэтому измените значение vm.max_map_count минимум на 262144 для развертывания SQL Server и ознакомьтесь с разделом Рекомендуемые параметры Linux при использовании профиля Tuned mssql для дальнейшей настройки этих параметров ядра.For this reason, change the vm.max_map_count value to at least 262144 for a SQL Server deployment, and refer to the Proposed Linux settings using a Tuned mssql profile section for further tunings of these kernel parameters. Максимальное значение для vm.max_map_count равно 2147483647.The max value for vm.max_map_count is 2147483647.

sysctl -w vm.max_map_count=1600000

При использовании профиля Tuned _ mssql настраивается параметр _ vm.max_map_count.Using the mssql **Tuned_ profile configures the _* vm.max_map_count* option.

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

В большинстве систем Linux этот параметр конфигурации включен по умолчанию.Most Linux installations should have this option on by default. Чтобы обеспечить максимально единообразную производительность, мы рекомендуем не отключать его.We recommend for the most consistent performance experience to leave this configuration option enabled. Однако в случае высокой активности страничной памяти в развертываниях SQL Server с несколькими экземплярами или при выполнении SQL Server с другими ресурсоемкими приложениями на сервере рекомендуется проверить производительность приложений после выполнения следующей команды:However, if there is high memory paging activity in SQL Server deployments with multiple instances, for example, or SQL Server execution with other memory demanding applications on the server, we suggest testing your applications performance after executing the following command:

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

Либо изменить профиль mssql Tuned, используя следующую строку:Or modify the mssql Tuned profile with the line:

vm.transparent_hugepages=madvise

После изменения следует активировать профиль mssql:And make the mssql profile is active after the modification:

tuned-adm off
tuned-adm profile mssql

При использовании профиля Tuned _ mssql настраивается параметр _ transparent_hugepage.Using the mssql **Tuned_ profile configures the _* transparent_hugepage* option.

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

Как и в случае с хранилищем и ЦП, существуют рекомендации в отношении сети. Они приведены ниже для справки.Like there are storage and CPU recommendations, there are Network specific recommendations as well listed below for reference. Указанные ниже параметры доступны не для всех сетевых карт.Not all settings mentioned below are available across different NICs. За указаниями обратитесь к поставщику конкретной сетевой карты.Refer and consult with NIC vendors for guidance for each of these options. Протестируйте эти настройки в среде разработки перед их применением в рабочей среде.Test and configure this on development environments before applying them on production environments. Параметры сопровождаются примерами, а используемые команды относятся к конкретному типу и поставщику сетевой карты.The options mentioned below are explained with examples, and the commands used are specific to NIC type and vendor.

  1. Настройка размера буфера для сетевого порта. В приведенном ниже примере сетевая карта называется eth0. Это сетевая карта Intel.Configuring network port buffer size: In the example below, the NIC is named 'eth0', which is an Intel-based NIC. Для таких сетевых карт рекомендуется размер буфера 4 КБ (4096).For Intel based NIC, the recommended buffer size is 4KB (4096). Проверьте предварительно установленные максимальные значения и выполните настройку с помощью приведенных ниже примеров команд.Verify the pre-set maximums and then configure it using the sample commands shown below:

             #To check the pre-set maximums please run the command, example NIC name used here is:"eth0"
             ethtool -g eth0
             #command to set both the rx(recieve) and tx (transmit) buffer size to 4 KB. 
             ethtool -G eth0 rx 4096 tx 4096
             #command to check the value is properly configured is:
             ethtool -g eth0
    
  2. Включение jumbo-кадров. Перед включением jumbo-кадров убедитесь в том, что они поддерживаются всеми сетевыми коммутаторами, маршрутизаторами и другими важными компонентами на пути передачи пакетов между клиентами и сервером SQL Server.Enable jumbo frames: Before enabling jumbo frames, verify that all the network switch(es), routers, and anything else essential in the network packet path between the clients and the SQL server support Jumbo Frames. Только в этом случае включение jumbo-кадров может повысить производительность.Only then, enabling jumbo frames can improve performance. После включения jumbo-кадров подключитесь к SQL Server и измените размер сетевого пакета на 8060 с помощью sp_configure, как показано ниже.After jumbo frames are enabled, connect to SQL Server and change the network packet size to 8060 using sp_configure as shown below:

             #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
    
             sp_configure 'network packet size' , '8060'
             go
             reconfigure with override
             go
    
  3. По умолчанию рекомендуется задать порт для объединения запросов на прерывание RX/TX. В результате доставка прерываний будет корректироваться в направлении оптимизации задержки при низкой скорости передачи пакетов или повышения пропускной способности при высокой скорости их передачи.By default, we recommend setting the port for adaptive RX/TX IRQ coalescing, meaning interrupt delivery will be adjusted to improve latency when packet rate is low and improve throughput when packet rate is high. Имейте в виду, что этот параметр может быть доступен не во всех сетевых инфраструктурах. Необходимо убедиться в том, что он поддерживается.Note that this setting might not be available across all the different network infrastructure, so review the existing network infrastructure and confirm that this is supported. В приведенном ниже примере сетевая карта называется eth0. Это сетевая карта Intel.The example below is for the NIC named 'eth0', which is an intel-based NIC:

             #command to set the port for adaptive RX/TX IRQ coalescing
             echtool -C eth0 adaptive-rx on
             echtool -C eth0 adaptive-tx on
             #confirm the setting using the command:
             ethtool -c eth0
    

    Примечание

    Для предсказуемого поведения в высокопроизводительных средах, таких как среды для тестирования производительности, отключите адаптивное объединение запросов на прерывание RX/TX, а затем задайте его вручную.For a predictable behavior for high-performance environments, like environments for benchmarking, disable the adaptive RX/TX IRQ coalescing and then set specifically the RX/TX interrupt coalescing. Для заданий значений воспользуйтесь примерами команд для отключения объединения запросов на прерывание RX/TX.See the example commands to disable the RX/TX IRQ coalescing and then specifically set the values:

             #commands to disable adaptive RX/TX IRQ coalescing
             echtool -C eth0 adaptive-rx off
             echtool -C eth0 adaptive-tx off
             #confirm the setting using the command:
             ethtool -c eth0
             #Let us set the rx-usecs parameter which specify how many microseconds after at least 1 packet is received before generating an interrupt, and the [irq] parameters are the corresponding delays in updating the #status when the interrupt is disabled. For Intel bases NICs below are good values to start with:
             ethtool -C eth0 rx-usecs 100 tx-frames-irq 512
             #confirm the setting using the command:
             ethtool -c eth0
    
  4. Кроме того, рекомендуется включить RSS (масштабирование на стороне приема) и по умолчанию объединить очереди RSS на стороне приема и передачи.We also recommend RSS (Receive-Side Scaling) enabled and by default, combining the rx and tx side of RSS queues. В некоторых случаях обращений в службу поддержки Майкрософт отключение RSS также приводило к повышению производительности.There have been specific scenarios where when working with Microsoft Support, disabling RSS has improved the performance as well. Протестируйте этот параметр в тестовой среде перед его применением в рабочих средах.Test this setting in test environments before applying it on production environments. Ниже приведен пример команды для сетевых карт Intel.The example command shown below is for Intel NICs.

             #command to get pre-set maximums
             ethtool -l eth0 
             #note the pre-set "Combined" maximum value. let's consider for this example, it is 8.
             #command to combine the queues with the value reported in the pre-set "Combined" maximum value:
             ethtool -L eth0 combined 8
             #you can verify the setting using the command below
             ethtool -l eth0
    
  5. Сходство запросов на прерывание для портов сетевой картыWorking with NIC port IRQ affinity. Чтобы добиться ожидаемой производительности путем настройки сходства запросов на прерывание, можно воспользоваться рядом важных параметров, в том числе относящихся к серверной топологии в Linux и стеку драйверов сетевой карты, а также параметрами по умолчанию и параметром irqbalance.To achieve expected performance by tweaking the IRQ affinity, consider few important parameters like Linux handling of the server topology, NIC driver stack, default settings, and irqbalance setting. Оптимизация параметров сходства запросов на прерывание для портов сетевой карты выполняется с учетом топологии сервера, предусматривает отключение параметра irqbalance и использование параметров конкретного поставщика сетевой карты.Optimizations of the NIC port IRQ affinities settings are done with the knowledge of server topology, disabling the irqbalance, and using the NIC vendor-specific settings. Ниже приведен пример для сетевой инфраструктуры Mellanox.Below is an example of Mellanox specific network infrastructure to help explain the configuration. Обратите внимание, что команды зависят от среды.Note that the commands will change based on the environment. За дополнительными инструкциями обратитесь к поставщику сетевой карты.Contact the NIC vendor for further guidance:

             #disable irqbalance or get a snapshot of the IRQ settings and force the daemon to exit
             systemctl disable irqbalance.service
             #or
             irqbalance --oneshot
    
             #download the Mellanox mlnx_tuning_scripts tarball, https://www.mellanox.com/sites/default/files/downloads/tools/mlnx_tuning_scripts.tar.gz and extract it
             tar -xvf mlnx_tuning_scripts.tar.gz
             # be sure, common_irq_affinity.sh is executable. if not, 
             # chmod +x common_irq_affinity.sh       
    
             #display IRQ affinity for Mellanox NIC port; e.g eth0
             ./show_irq_affinity.sh eth0
    
             #optimize for best throughput performance
             ./mlnx_tune -p HIGH_THROUGHPUT
    
             #set hardware affinity to the NUMA node hosting physically the NIC and its port
             ./set_irq_affinity_bynode.sh `\cat /sys/class/net/eth0/device/numa_node` eth0
    
             #verify IRQ affinity
             ./show_irq_affinity.sh eth0
    
             #add IRQ coalescing optimizations
             ethtool -C eth0 adaptive-rx off
             ethtool -C eth0 adaptive-tx off
             ethtool -C eth0  rx-usecs 750 tx-frames-irq 2048
    
             #verify the settings
             ethtool -c eth0
    
  6. После внесения указанных выше изменений проверьте скорость работы сетевой карты с помощью следующей команды:After the above changes are done, verify the speed of the NIC to ensure it matches the expectation using the following command:

             ethtool eth0 | grep -i Speed
    

Дополнительная настройка ядра и ОСAdditional advanced Kernel/OS configuration

  • Для обеспечения максимальной производительности ввода-вывода хранилища в Linux рекомендуется использовать планирование на основе нескольких очередей для блочных устройств.For best storage IO performance, the use of Linux multiqueue scheduling for block devices is recommended. Это позволяет эффективно масштабировать производительность на блочном уровне при использовании быстрых твердотельных накопителей (SSD) и многоядерных систем.This enables the block layer performance to scale well with fast solid-state drives (SSDs) and multi-core systems. Чтобы узнать, включена ли эта функция по умолчанию в вашем дистрибутиве Linux, обратитесь к документации.Check the documentation if it is enabled by default in your Linux distributions. В большинстве случаев включить ее можно с помощью параметра scsi_mod.use_blk_mq=y при загрузке ядра, хотя в документации к дистрибутиву Linux могут быть дополнительные указания.In most other cases, booting the kernel with scsi_mod.use_blk_mq=y enables it, though documentation of the Linux distribution in use may have additional guidance on it. Это согласуется с основным ядром Linux.This is consistent to the upstream Linux kernel.

  • Так как для развертываний SQL Server часто используется многомаршрутная подсистема ввода-вывода, многомаршрутный целевой объект модуля отображения устройств (DM) необходимо также настроить для использования инфраструктуры blk-mq. Для этого следует включить параметр загрузки ядра dm_mod.use_blk_mq=y.As multipath IO is often used for SQL Server deployments, the device mapper (DM) multipath target should also be configured to use the blk-mq infrastructure by enabling the dm_mod.use_blk_mq=y kernel boot option. Значение по умолчанию — n (отключено).The default value is n (disabled). Когда базовые устройства SCSI используют blk-mq, этот параметр сокращает затраты на блокировку на уровне DM.This setting, when the underlying SCSI devices are using blk-mq, reduces locking overhead at the DM layer. Дополнительные рекомендации по настройке см. в документации по используемому дистрибутиву Linux.Refer to the documentation of the Linux distribution in use for additional guidance on how to configure it.

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

Во избежание проблем с нехваткой памяти правильно настройте файл подкачки.Ensure you have a properly configured swapfile to avoid any out of memory issues. Сведения о создании файла подкачки и его правильном размере см. в документации по вашей системе Linux.Consult your Linux documentation for how to create and properly size a swapfile.

Виртуальные машины и динамическая памятьVirtual Machines and Dynamic Memory

Если SQL Server на Linux выполняется в виртуальной машине, настройте фиксированный размер памяти, резервируемой для виртуальной машины.If you're running SQL Server on Linux in a virtual machine, make sure you select options to fix the amount of memory reserved for the virtual machine. Не используйте такие функции, как динамическая память Hyper-V.Don't use features like Hyper-V Dynamic Memory.

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

Чтобы обеспечить максимальную производительность, рекомендуется выполнить описанные ниже задачи по настройке после установки SQL Server на Linux.It is recommended to perform the following configuration tasks after you install SQL Server on Linux to achieve best performance for your application.

РекомендацииBest practices

  • Использование PROCESS AFFINITY для узла и ЦПUse PROCESS AFFINITY for Node and/or CPUs

    Рекомендуется использовать инструкцию ALTER SERVER CONFIGURATION, чтобы задать PROCESS AFFINITY для всех узлов NUMANODE или ЦП, используемых для SQL Server в ОС Linux (то есть обычно для всех узлов и ЦП).It's recommended to use ALTER SERVER CONFIGURATION to set PROCESS AFFINITY for all the NUMANODEs and/or CPUs you're using for SQL Server (which is typically for all NODEs and CPUs) on a Linux OS. Соответствие процессоров помогает эффективно планировать работу Linux и SQL.Processor affinity helps maintain efficient Linux and SQL Scheduling behavior. Использование параметра NUMANODE — простейший метод.Using the NUMANODE option is the simplest method. PROCESS AFFINITY следует использовать, даже если на вашем компьютере всего один узел NUMA.Use PROCESS AFFINITY even if you have only a single NUMA Node on your computer. Дополнительные сведения о задании PROCESS AFFINITY см. в статье об ALTER SERVER CONFIGURATION.For more information on how to set PROCESS AFFINITY, see the ALTER SERVER CONFIGURATION article.

  • Настройка нескольких файлов данных tempdbConfigure multiple tempdb data files

    Так как установленный экземпляр SQL Server на Linux не дает возможности настроить несколько файлов tempdb, мы рекомендуем создать несколько файлов данных tempdb после установки.Because a SQL Server on Linux installation does not offer an option to configure multiple tempdb files, we recommend that you consider creating multiple tempdb data files after installation. Дополнительные сведения см. в статье Рекомендации по сокращению состязания за выделяемые ресурсы в базе данных tempdb SQL Server.For more information, see the guidance in the article, Recommendations to reduce allocation contention in SQL Server tempdb database.

Расширенная настройкаAdvanced Configuration

Ниже приведены рекомендации по дополнительным параметрам конфигурации, которые можно настроить после установки SQL Server на Linux.The following recommendations are optional configuration settings that you may choose to perform after installation of SQL Server on Linux. Их выбор зависит от требований рабочей нагрузки и конфигурации ОС Linux.These choices are based on the requirements of your workload and configuration of your Linux OS.

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

    Чтобы обеспечить достаточный объем свободной физической памяти для ОС Linux, процесс SQL Server по умолчанию использует только 80 % физического ОЗУ.In order to ensure There's enough free physical memory for the Linux OS, the SQL Server process uses only 80% of the physical RAM by default. В некоторых системах с большим размером ОЗУ 20 % может быть очень много.For some systems with large amount of physical RAM, 20% might be a significant number. Например, в системе с 1 ТБ ОЗУ при настройке по умолчанию неиспользуемыми остаются приблизительно 200 ГБ ОЗУ.For example, on a system with 1 TB of RAM, the default setting would leave around 200 GB of RAM unused. В таком случае может быть желательно установить более высокий предел памяти.In this situation, you might want to configure the memory limit to a higher value. См. документацию по средству mssql-conf и параметру memory.memorylimitmb, который определяет объем памяти, доступный SQL Server (в МБ).See the documentation on the mssql-conf tool and the memory.memorylimitmb setting that controls the memory visible to SQL Server (in units of MB).

    При изменении этого параметра будьте осторожны. Не задавайте слишком большое значение.When changing this setting, be careful not to set this value too high. Если памяти будет недостаточно, могут возникнуть проблемы в работе ОС Linux и других приложений Linux.If you don't leave enough memory, you could experience problems with the Linux OS and other Linux applications.

Дальнейшие действияNext steps

Дополнительные сведения о функциях SQL Server, повышающих производительность, см. в статье о начале работы с функциями производительности.To learn more about SQL Server features that improve performance, see Get started with Performance features.

Дополнительные сведения об SQL Server на Linux см. в статье Обзор SQL Server на Linux.For more information about SQL Server on Linux, see Overview of SQL Server on Linux.