Linux 上的 SQL Server 的性能最佳做法和配置指南
后知后觉 暂无评论

本文提供了最佳做法和建议,以最大程度地提高连接到 Linux 上的 SQL Server 的数据库应用程序的性能。 这些建议特定在 Linux 平台上运行。 所有正常 SQL Server 建议(例如索引设计)仍适用。

以下指南包含配置 SQL Server 和 Linux 操作系统 (OS) 的建议。

Linux OS 配置

请考虑使用以下 Linux OS 配置设置,以体验 SQL Server 安装的最佳性能。

存储配置建议

使用具有适当 IOPS、吞吐量和冗余的存储子系统

托管数据、事务日志和其他关联文件(如内存中 OLTP 的检查点文件)的存储子系统应能够正常管理平均和峰值工作负载。 通常情况下,在本地环境中,存储供应商支持在多个磁盘之间进行条带化的适当硬件 RAID 配置,以确保适当的 IOPS、吞吐量和冗余。 不过,在不同存储供应商和具有不同体系结构的不同存储产品之间,这可能有所不同。

对于在 Azure 虚拟机上部署的 Linux 上的 SQL Server,请考虑使用软件 RAID 来确保满足相应的 IOPS 和吞吐量要求。 在 Azure 虚拟机上配置具有类似存储注意事项的 SQL Server 时,请参阅 SQL Server VM 的存储配置

以下示例介绍如何在 Azure 虚拟机上的 Linux 中创建软件 raid。 下面提供了一个示例,但你应该根据数据、事务日志和 tempdb IO 要求,使用适当数量的数据磁盘,为卷提供所需的吞吐量和 IOPS。 在此示例中,已向 Azure 虚拟机附加 8 个数据磁盘;4 个用于托管数据文件,2 个用于事务日志,2 个用于 tempdb 工作负载。

## 使用 `lsblk` 命令定位用于创建 RAID 阵列的设备(例如 `/dev/sdc`)
## 对于数据卷,使用 4 个磁盘,创建 RAID 5 阵列,配置 8KB 数据块粒度
mdadm --create --verbose /dev/md0 --level=raid5 --chunk=8K --raid-devices=4 /dev/sdc /dev/sdd /dev/sde /dev/sdf

## 对于日志卷,使用 2 个磁盘,创建 RAID 10 阵列,配置 64KB 数据块粒度
mdadm --create --verbose /dev/md1 --level=raid10 --chunk=64K --raid-devices=2 /dev/sdg /dev/sdh

## 对于临时数据卷,使用 2 个磁盘,创建 RAID 0 阵列,配置 64KB 数据库粒度
mdadm --create --verbose /dev/md2 --level=raid0 --chunk=64K --raid-devices=2 /dev/sdi /dev/sdj

磁盘分区和配置建议

对于 SQL Server,建议使用 RAID 配置。 部署的文件系统条带单元 (sunit) 和条带宽度应与 RAID 几何匹配。 下面是一个针对日志卷的基于 XFS 文件系统的示例。

## 创建一个日志卷,使用 6 个磁盘,创建 RAID 10 阵列,配置 64KB 数据库粒度
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

日志阵列是具有 64 KB 条带、6 个驱动器的 RAID-10。 正如你所见:

文件系统配置建议

SQL Server 支持使用 EXT4 和 XFS 文件系统承载数据库、事务日志和其他文件,例如 SQL Server 中的内存中 OLTP 的检查点文件。 Microsoft 建议使用 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 生态系统中经常使用的配置,但可出于兼容性原因而使用。

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

在此示例中,使用参数 -n version=ci 将 XFS 文件系统配置为不区分大小写。

PMEM 文件系统建议

对于 PMEM 设备上的文件系统配置,基础文件系统的块分配应为 2 MB。 有关本主题的详细信息,请参阅 技术注意事项 一文。

打开文件限制

默认打开文件限制通常设置为 1024。 生产环境可能需要比默认限制更多的连接。 建议将软限制设置为 16000,将硬限制设置为 32727。 例如,在 RHEL 中,编辑 /etc/security/limits.d/99-mssql-server.conf 文件以具有以下值:

mssql hard nofile 32727
mssql soft nofile 16000

在文件系统上禁用 SQL Server 数据和日志文件的上次访问日期/时间

为确保在重启后自动重新装载附加到系统的驱动器,必须将其添加到 /etc/fstab 文件。 此外,强烈建议在 /etc/fstab 中使用 UUID(全局唯一标识符)来引用驱动器,而不是只使用设备名称(例如 /dev/sdc1)。

对用于存储 SQL Server 数据和日志文件的任何文件系统,强烈建议使用 noatime 属性。 有关如何设置此属性的说明,请参阅 Linux 文档。 以下示例介绍如何为 Azure 虚拟机中装载的卷启用 noatime 选项。

/etc/fstab 中的装入点条目:

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

在上面的示例中,UUID 表示可使用 blkid 命令找到的设备。

SQL Server 和强制单元访问 (FUA) I/O 子系统功能

某些版本的受支持 Linux 分发版支持 FUA I/O 子系统功能,以提供数据持久性。 SQL Server 使用 FUA 功能为 SQL Server 工作负载提供高效且可靠的 I/O。 有关 Linux 分发版的 FUA 支持的更多信息及其对 SQL Server 的影响,请参阅 Linux 上的 SQL Server:强制单元访问 (FUA) 内部结构

SUSE Linux Enterprise Server 12 SP5 和 Red Hat Enterprise Linux 8.0 以上的版本支持 I/O 子系统中的 FUA 功能。 如果使用 SQL Server 2017 (14.x) CU6 及更高版本,则应使用以下配置,以便通过 SQL Server 使用 FUA 进行高性能、高效的 I/O 实现。

如果满足以下条件,请使用下面列出的推荐配置。

推荐配置:

  1. 启用跟踪标志 3979 作为启动参数
  2. 使用 mssql-conf 配置 control.writethrough = 1control.alternatewritethrough = 0

对于不符合上述条件的几乎所有其他配置,建议的配置如下所示:

  1. 启用跟踪标志 3982 作为启动参数(这是 Linux 生态系统中 SQL Server 的默认值),同时确保未启用跟踪标志 3979 作为启动参数
  2. 使用 mssql-conf 配置 control.writethrough = 1 和 control.alternatewritethrough = 1`

高性能内核和 CPU 设置

下一部分介绍是与 SQL Server 安装的高性能和吞吐量相关的推荐 Linux OS 设置。 请参阅 Linux OS 文档,以了解如何配置这些设置。 根据说明,使用 TuneD 帮助配置以下所述的许多 CPU 和内核配置。

使用 TuneD 来配置内核设置

对于 Red Hat Enterprise Linux (RHEL) 用户,TuneD 吞吐量-性能配置文件将自动配置某些内核和 CPU 设置(C 状态除外)。 自 RHEL 8.0 起,与 Red Hat 共同开发了名为 mssql 的 TuneD 配置文件,它可为 SQL Server 工作负载提供更精细的 Linux 性能相关优化。 此配置文件包含 RHEL 吞吐量-性能配置文件,我们在下面提供了它的定义,供你查看其他 Linux 发行版和不带此配置文件的 RHEL 版本。

对于 SUSE Linux Enterprise Server 12 SP5、Ubuntu 18.04 和 Red Hat Enterprise Linux 7.x,可以手动安装 tuned 包。 它可用于创建和配置 mssql 配置文件,如下所述。

建议的 Linux 设置,使用 TuneD mssql 配置文件
#
# 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
#Note: If you are using Linux distributions with kernel versions greater than 4.18, please comment the following options as shown; otherwise, uncomment the following options if you are using distributions with kernel versions less than 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 配置文件,请将这些定义保存在 /usr/lib/tuned/mssql 文件夹下的 tuned.conf 文件中,并使用以下命令启用配置文件:

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

通过以下命令验证是否已启用它:

sudo tuned-adm active

sudo tuned-adm list

CPU 设置建议

下表提供了 CPU 设置的建议:

设置详细信息
CPU 频率调控器性能请参阅 cpupower 命令
ENERGY_PERF_BIAS性能请参阅 x86_energy_perf_policy 命令
min_perf_pct100查看有关 intel p 状态的文档
C 状态仅限 C1请参阅 Linux 或系统文档,了解如何确保将 C 状态设置为仅限 C1

如上文所述,使用 TuneD 将相应地配置 CPU 频率调控器、ENERGY_PERF_BIASmin_perf_pct 设置,因为使用吞吐量-性能配置文件作为 mssql 配置文件的基础。 必须根据 Linux 或系统分销商提供的文档手动配置 C 状态参数。

磁盘设置建议

下表提供了磁盘设置的建议:

设置详细信息
磁盘 readahead4096请参阅 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 命令

描述:

使用 mssql TuneD 配置文件配置 vm.swappinessvm.dirty_*kernel.sched_* 设置。 使用 blockdev 命令的磁盘 readahead 配置以单个设备为基础,必须手动执行。

多节点 NUMA 系统的内核设置自动 NUMA 平衡

如果在多节点 NUMA 系统上安装 SQL Server,则默认会启用以下 kernel.numa_balancing 内核设置。 若要使 SQL Server 在 NUMA 系统上以最高效率运行,请在多节点 NUMA 系统上禁用自动 NUMA 平衡:

sudo sysctl -w kernel.numa_balancing=0

使用 mssql TuneD 配置文件配置 kernel.numa_balancing 选项。

虚拟地址空间的内核设置

vm.max_map_count 的默认设置 (65536) 对 SQL Server 安装来说可能不够高。 出于此原因,请在 SQL Server 部署中,将 vm.max_map_count 值更改为至少 262144,并参阅使用 TuneD mssql 配置文件的建议 Linux 设置部分,了解如何进一步优化这些内核参数。 vm.max_map_count 的最大值为 2147483647。

sysctl -w vm.max_map_count=1600000

使用 mssql TuneD 配置文件配置 vm.max_map_count 选项。

启用透明大页 (THP)

大多数 Linux 安装应在默认情况下启用此选项。 建议将此配置选项设置为启用,以获得最一致的性能体验。 但是,如果在具有多个实例的 SQL Server 部署中发生大量内存分页活动,或者在服务器上与其他内存需求较高的应用程序一起执行 SQL Server 的情况下,建议在执行以下命令后测试应用程序的性能:

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

或使用以下行修改 mssql TuneD 配置文件:

vm.transparent_hugepages=madvise

并在修改后使 mssql 配置文件处于活动状态:

sudo tuned-adm off
sudo tuned-adm profile mssql

使用 mssql TuneD 配置文件配置 transparent_hugepage 选项。

网络设置建议

与存储和 CPU 建议一样,下面也列出了特定于网络的建议,以供参考。 并非下面提到的所有设置都可在不同的 NIC 上使用。 有关每个选项的指导,请参阅文档并咨询 NIC 供应商。 在开发环境中对它们进行测试和配置,然后将其应用于生产环境。 下面所述的选项使用示例说明,所用的命令特定于 NIC 类型和供应商。

  1. 配置网络端口缓冲区大小:在下面的示例中,NIC 的名称为“eth0”,它是基于 Intel 的 NIC。 对于基于 Intel 的 NIC,推荐的缓冲区大小为 4 KB (4096)。 验证预先设置的最大值,然后使用下面所示的示例命令进行配置:

    #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 (receive) 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 之间的所有网络交换机、路由器以及网络数据包路径所需的任何其他内容是否都支持 jumbo 帧。 只有这样,启用 jumbo 帧才可以提高性能。 启用 jumbo 帧后,连接到 SQL Server 并使用 sp_configure 将网络数据包大小更改为 8060,如下所示:

    #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
    EXEC sp_configure 'network packet size', '8060';
    GO
    RECONFIGURE WITH OVERRIDE;
    GO
  3. 默认情况下,我们建议设置端口以进行自适应 RX/TX IRQ 合并,这意味着将会调整中断传递,以在数据包速率较低时降低延迟,在数据包速率较高时提高吞吐量。 此设置可能不适用于所有不同的网络基础结构,因此请查看现有的网络基础结构并确认此设置受支持。 下面的示例针对名为“eth0”的 NIC,它是基于 Intel 的 NIC:

    #command to set the port for adaptive RX/TX IRQ coalescing
    ethtool -C eth0 adaptive-rx on
    ethtool -C eth0 adaptive-tx on
    #confirm the setting using the command:
    ethtool -c eth0
    备注:为实现高性能环境(如用于基准测试的环境)的可预测行为,请禁用自适应 RX/TX IRQ 合并,然后专门设置 RX/TX 中断合并。 请参阅示例命令以禁用 RX/TX IRQ 合并,然后专门设置以下值:
    #commands to disable adaptive RX/TX IRQ coalescing
    ethtool -C eth0 adaptive-rx off
    ethtool -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 队列的 RX 和 TX 端组合在一起。 在某些特定情况下,与 Microsoft 支持部门合作时,禁用 RSS 还会提高性能。 在生产环境中应用此设置之前,请先在测试环境中进行测试。 下面显示的示例命令适用于 Intel NIC。

    #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. 使用 NIC 端口 IRQ 关联。 若要通过调整 IRQ 关联来实现预期的性能,请考虑几个重要参数,如 Linux 对服务器拓扑的处理、NIC 驱动程序堆栈、默认设置和 irqbalance 设置。 NIC 端口 IRQ 关联设置的优化是通过了解服务器拓扑,禁用 irqbalance,以及使用特定于 NIC 供应商的设置来实现的。

    以下是特定于 Mellanox 的网络基础结构示例,用于帮助解释该配置。 有关详细信息,请参阅 Mellanox 网络适配器的性能优化工具。 这些命令将根据环境而改变。 请联系 NIC 供应商以获取进一步指导:

    #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 tools -- see https://support.mellanox.com/s/article/MLNX2-117-2523kn
    
    #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 with a Mellanox tool
    ./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. 完成上述更改后,请使用以下命令验证 NIC 的速度,以确保其符合预期:

    ethtool eth0 | grep -i Speed

其他高级内核/OS 配置

配置交换文件

请确保已正确配置交换文件,以免出现内存不足的问题。 有关如何创建交换文件并正确调整其大小的详细说明,请参阅 Linux 文档。

虚拟机和动态内存

如果在虚拟机中运行 Linux 上的 SQL Server,请确保选择选项来修复为虚拟机预留的内存量。 请勿使用 Hyper-V 动态内存等功能。

SQL Server 配置

建议在安装 Linux 上的 SQL Server 后执行以下配置任务,以实现应用程序的最佳性能。

最佳做法

高级配置

以下建议是可选的配置设置,你可以选择在安装 Linux 上的 SQL Server 之后执行这些设置。 这些选项取决于你的工作负载和 Linux OS 配置的要求。


附录

参考链接

本文撰写于一年前,如出现图片失效或有任何问题,请在下方留言。博主看到后将及时修正,谢谢!
禁用 / 当前已拒绝评论,仅可查看「历史评论」。