关于sqlserver on linux推荐的性能配置,官方文档中给出了配置建议,但部分参数没有给设置方法,可参考以下文档设置。原文很长,大部分为linux基础,下面只摘了一些性能相关设置,完整版参考
https://masayukiozawa.github.io/sol-skillupdate/#sql-server-%E3%81%AE%E8%A8%AD%E5%AE%9A%E5%A4%89%E6%9B%B4
Performance best practices and configuration guidelines for SQL Server 2017 on Linux
PROCESS AFFINITY の指定
ALTER SERVER CONFIGURATION
SET PROCESS AFFINITY NUMANODE = 0 TO
tempdb のデータファイルの分割
SQL Server on Linux は、インストール時の tempdb 分割が行われないため、インストール後に分割する。
mssql-conf ツールを使用したメモリ設定
$ sudo /opt/mssql/bin/mssql-conf set memory.memorylimitmb 4096
$ sud systemctl restart mssql-server
デフォルトでは SQL Server が使用するメモリは 80% に制限されているため、大容量のメモリを搭載している場合、残りの 20% のサイズによっては、上限緩和を検討する。
(本設定は SQL Server の max server memroy とは別の設定)
設定の解除
sudo /opt/mssql/bin/mssql-conf unset memory.memorylimitmb
systemctl restart mssql-server
CPU
CPU の電力制御のユーティリティ
# apt install -y cpufrequtils
# cpufreq-info
CPU クロックのガバナー
$ sudo cpupower frequency-info
$ sudo cpupower frequency-set -g performance
パフォーマンスと電源消費効率のバランス
# x86_energy_perf_policy -v 'performance'
CPU クロックの下限
tuned を使用して設定を実施
min_perf_pct=100
C-State
C1 のみにする
$ sudo vi /etc/default/grub
====
GRUB_CMDLINE_LINUX_DEFAULT="intel_idle.max_cstate=1"
====
$ sudo update-grub
$ reboot
ディスク
Read-Ahead のブロックサイズ
# blockdev --report
# blockdev -v --setra 4096 /dev/sda
sysctl によるカーネルパラメーターの変更
$ cat /proc/sys/kernel/sched_min_granularity_ns
$ sudo sysctl -a
$ sudo sysctl -w kernel.sched_min_granularity_ns=10000000
$ sudo sysctl -w kernel.sched_wakeup_granularity_ns=15000000
$ sudo sysctl -w vm.dirty_ratio=40
$ sudo sysctl -w vm.dirty_background_ratio=10
$ sudo sysctl -w vm.swappiness=10
$ sudo sysctl -p
NUMA
複数 NUMA ノード環境での自動 NUMA バランシングの無効化
$ sudo sysctl -w kernel.numa_balancing=0
$ sudo sysctl -p
仮想アドレス空間
メモリマップ数の上限の変更 (65536 (64KB) -> 262144 (256KB))
$ sudo sysctl -w vm.max_map_count=262144
$ sudo sysctl -p
マウントオプション
SQL Server のデータ/ログファイルのファイルシステムのマウントオプションの設定 (relatime -> noatime)
# mount
または、
# cat /proc/mounts
# vi /etc/fstab
====
該当のボリュームに「noatime」オプションを追加する
====
Huge Page
透過的な Huge Page の有効化
ほとんどの Linux 環境では有効になっている。
# cat /sys/kernel/mm/transparent_hugepage/enabled
# cat /proc/meminfo
Swap ファイル
swap ファイルの適切な設定
# swapon
または、
# cat /proc/swaps
# swapon /dev/dm-1
【 swapon 】スワップ領域を有効にする
swapoff /dev/dm-1
「swapoff failed: Cannot allocate memory 」のメッセージが表示された場合は、スワップファイルの内容をメモリに移動させることができない状態となっている
仮想マシンでの実行
動的メモリ割り当て (Dynamic Memory) を使用しない
仮想マシンのメモリ割り当てとして、動的メモリ割り当てによる可変的なメモリ割り当てを実行しない
OOM Killer
OOM (Out of Memory) Killer という動作が存在していることの認識
メモリ/スワップの枯渇の可能性が出た場合に、メモリを消費しているプロセスを停止させる動作
# echo "-17" > /proc/[pid]/oom_adj
# ps -e | grep "sqlservr" | awk '{system("echo -17 > /proc/"$1"/oom_adj")}'
cron による設定
# sudo echo '*/1 * * * * root ps -e | grep "sqlservr" | awk '\''{system("echo -1000 > /proc/"$1"/oom_score_adj")}'\'' > /dev/null 2>&1' > /etc/cron.d/sqlservr_oom
または、
# sudo echo '*/1 * * * * root ps -e | grep "sqlservr" | awk '\''{system("echo -17 > /proc/"$1"/oom_adj")}'\'' > /dev/null 2>&1' > /etc/cron.d/sqlservr_oom
$ sudo syscat /var/log/syslog | grep Killedctl -r | grep "oom"
# cat /var/log/syslog | grep -i Killed