问君能有几多愁,恰似不懂Linux SQL如何调优——聊聊SQL Server on Linux最佳实践

问君能有几多愁,恰似不懂Linux SQL如何调优——聊聊SQL Server on Linux最佳实践

自从微软开始拥抱Linux, SQL Server 很快就推出了 Linux版本, linux的SQL 与windows 在运行环境截然不同,SQL自己的配置和优化几乎想通,但是涉及到操作系统层的优化,还是有所区别。 官方给了一些最佳实践。

SQL Server 配置

1、Use PROCESS AFFINITY for Node and/or CPUs,建议将服务器的所有CPU和NUMA节点进行关联,处理器关联可帮助维护高效的 Linux 和 SQL 计划行为。


/*下面显示如何设置与 CPU 和 NUMA 节点的进程关联。 该示例假定服务器包含 256 个 CPU,这些 CPU 分为四组,每组各有 16 个 NUMA 节点。 线程未分配给任何 NUMA 节点或 CPU。 
组 0:NUMA 节点 0 到 3,CPU 0 到 63 
组 1:NUMA 节点 4 到 7,CPU 64 到 127 
组 2:NUMA 节点 8 到 12,CPU 128 到 191 
组 3:NUMA 节点 13 到 16,CPU 192 到 255 */

--设置与 0 和 2 组中所有 CPU 的关联。
ALTER SERVER CONFIGURATION   
SET PROCESS AFFINITY CPU=0 TO 63, 128 TO 191;  

--设置与 NUMA 节点 0 和 7 中所有 CPU 的关联

ALTER SERVER CONFIGURATION   
SET PROCESS AFFINITY NUMANODE=0, 7;  

--设置与 AUTO 的关联
ALTER SERVER CONFIGURATION  
SET PROCESS AFFINITY CPU=AUTO;  

一般建议将所有的CPU进行关联。

2、配置多个 tempdb 数据文件


/*Linux 系统下,在安装SQL Server的过程,没有进行tempdb的配置,因此为了平衡tempdb的负载,应该要对tempdb进行分配,建议添加数据文件,数量为CPU核心数目相同,将文件放在最快的磁盘,如果有多个磁盘,可以平均放在不同的磁盘上。添加文件代码如下类似*/

USE [master]
GO
ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev01', FILENAME = N'/var/opt/mssql/data/tempdev01.ndf' , SIZE = 8192KB , FILEGROWTH = 65536KB )
GO

3、 mssql-conf 设置内存限制

SQL Server 为了确保Linux操作系统有足够的可用内存,因此在默认情况下只使用物理内存的80%,但是对于大内存的服务器20%内存对Linux太大,例如,在使用 1 TB 系统的 RAM 中,默认设置将使大约 200 GB 的 RAM 未使用。所以我们需要进行设置,可以通过mssql-conf进行设置。

--下面代码是将内存改为64000M
sudo /opt/mssql/bin/mssql-conf set memory.memorylimitmb 64000
--完成后重启服务
sudo systemctl restart mssql-server

注意此处配置的内存,并不是指SQL Server种的最大内存,sp_configure 中可以设置 max server memory (MB),这里指的是相当于windows版本下的操作系统内存的概念。如图

而  max server memory (MB) 指的是

操作系统配置

Linux 上SQL Server要获得最好的性能,有以下建议

##CPU配置

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

设置 参考信息
CPU frequency governor performance See the cpupower command
ENERGY_PERF_BIAS performance See the x86_energy_perf_policy command
min_perf_pct 100 See your documentation on intel p-state
C-States C1 only See your Linux or system documentation on how to ensure C-States is set to C1 only

磁盘配置

设置 参考信息
disk readahead 4096 See the blockdev command
sysctl settings kernel.sched_min_granularity_ns = 10000000 kernel.sched_wakeup_granularity_ns = 15000000 vm.dirty_ratio = 40 vm.dirty_background_ratio = 10 vm.swappiness=10 See the sysctl command

多节点的NUMA系统中设置自动NUMA

如果在多节点上安装 SQL Server NUMA系统、 以下kernel.numa_balancing默认启用内核设置。 若要允许 SQL Server 上运行最大效率NUMA系统,禁用自动 numa 平衡的多节点 NUMA 系统上:


sysctl -w kernel.numa_balancing=0

内核虚拟地址空间设置

默认设置vm.max_map_count (默认 65536) 对于 SQL Server这值太小。 将此值 (这是一个上限) 更改为 256k。


sysctl -w vm.max_map_count=262144

SQL Server 数据和日志文件禁用  last accessed date/time

存储 SQL Server 数据和日志文件使用noatime属性

Leave Transparent Huge Pages (THP) enabled

默认情况下,大多数 Linux 安装应该对具有此选项。 我们建议用于最一致的性能体验,要启用此配置选项。

swapfile

确保已正确配置的交换文件,以避免任何内存不足问题。

Virtual Machines and Dynamic Memory

如果正在虚拟机在 Linux 上运行 SQL Server,请确保您选择选项来修复虚拟机保留的内存量。 不要使用 HYPER-V 动态内存等功能。

总结

以上是官方的最佳实践和安装配置选项。 性能问题的调优和一些实践。改天再来写一些。


猜你喜欢

转载自blog.csdn.net/capsicum29/article/details/80708926
今日推荐