共用方式為


Linux 上 SQL Server 的效能最佳作法和設定方針

適用於:SQL Server - Linux

此文章提供最佳作法和建議,以最大化連線至 Linux 上的 SQL Server 之資料庫應用程式的效能。 這些建議僅適用於在 Linux 平台上執行。 所有一般 SQL Server 建議 (例如索引設計) 仍然適用。

下列指引包含設定 SQL Server 與 Linux 作業系統 (OS) 的建議。 請考慮使用下列設定,以在安裝 SQL Server 時獲得最佳效能體驗。

儲存體組態建議

裝載資料、交易記錄以及其他相關檔案 (例如記憶體內部 OLTP 的檢查點檔案) 的儲存體子系統,必須能夠妥善管理平均及尖峰工作負載。

使用具有適當 IOPS、輸送量以及備援的儲存體子系統

在本地環境中,儲存廠商通常支援合適的硬體 RAID 配置,並透過多顆磁碟的條帶化來確保恰當的 IOPS、吞吐量和冗餘性。 然而,這種支援會因不同儲存廠商及不同架構的儲存服務而有所不同。

對於部署在 Azure 虛擬機上的 SQL Server on Linux,請考慮使用軟體 RAID 以確保適當的 IOPS 與吞吐量需求。 使用類似的記憶體考慮在 Azure 虛擬機上設定 SQL Server 時,請參閱 在 Azure VM 上設定 SQL Server 的記憶體。

以下範例展示了如何在 Azure 虛擬機上以 Linux 建立軟體 RAID。 請記住,您應該根據資料、交易記錄以及 tempdb IO 需求,使用適當的資料磁碟數目來取得磁碟區所需輸送量與 IOPS。 以下範例中,虛擬機連接了八個資料磁碟;四個用於儲存資料檔案,兩個用於交易日誌,另外兩個用於 tempdb 工作負載。

若要找出用於建立 RAID 的裝置 (例如 /dev/sdc),請使用 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 KB。 如您所見:

  • 針對 sunit=16 blks,16 * 4096 區塊大小 = 64 KB,符合等量大小。
  • 針對 swidth=48 blksswidth / sunit = 3,這是陣列中的資料磁碟機數目,不包括同位磁碟機。

SQL Server 支援 ext4 與 XFS 檔案系統,以承載資料庫、交易日誌及其他檔案,如 SQL Server 中記憶體內 OLTP 的檢查點檔案。 使用 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 MB。 欲了解更多資訊,請參閱 技術考量

開啟檔案限制

您的實際執行環境可能需要比預設開啟檔案限制 1024 更多的連線。 你可以設定軟上限和硬上限為1,048,576。 例如,在 RHEL 中,編輯 /etc/security/limits.d/99-mssql-server.conf 檔案具有下列值:

mssql - nofile 1048576

注意

此設定不適用於 啟動的 systemdSQL Server 服務。 如需詳細資訊,請參閱 如何在 RHEL 和 systemd 中設定服務的限制。

在檔案系統中停用 SQL Server 資料與日誌檔案的最後存取日期與時間

為了確保連接到系統的硬碟在重新啟動後自動重新掛載,請將它們加入檔案中 /etc/fstab 。 在 中 /etc/fstab 使用 UUID(通用唯一識別碼)來指代硬碟,而非僅使用裝置名稱(例如 /dev/sdc1)。

noatime 屬性與用來儲存 SQL Server 資料和記錄檔的任何檔案系統搭配使用。 請參閱您的 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 與 Ubuntu 18.04 開始支援 I/O 子系統中的 FUA 功能。 如果正在使用 SQL Server 2017 (14.x) CU 6 與更新版本,您應該使用下列設定,透過 SQL Server 使用 FUA 獲得高效能且有效率的 I/O 實作。

如果符合下列條件,請使用這個建議的設定。

  • SQL Server 2017 (14.x) CU 6 與更新版本

  • 支援 FUA 功能的 Linux 發行版本與版本 (從 Red Hat Enterprise Linux 8.0、SUSE Linux Enterprise Server 12 SP5 或 Ubuntu 18.04 開始)

  • 對於 SQL Server 儲存的 XFS 文件系統,適用於 Linux 核心 4.18 或更新版本。

  • Linux 核心 5.6 或更新版本上 SQL Server 記憶體的 ext4 文件系統。

    注意

    當 Linux 核心版本低於 5.6 時,您應該使用 XFS 檔案系統來裝載 SQL Server 數據和事務歷史記錄檔。 從核心 5.6 版開始,您可以根據您的特定需求在 XFSext4 之間選擇。

  • 儲存子系統和/或支援 FUA 功能並已針對其加以設定的硬體

建議的設定:

  1. 啟用追蹤旗標 3979 作為啟動參數。

  2. 使用 mssql-conf 來設定 control.writethrough = 1control.alternatewritethrough = 0

針對大部分不符合上述條件的其他組態,建議的組態如下:

  1. 啟用追蹤旗標 3982 作為啟動參數 (這是 Linux 生態系統中 SQL Server 的預設值),並確定追蹤旗標 3979 未啟用為啟動參數。

  2. 使用 mssql-conf 來設定 control.writethrough = 1control.alternatewritethrough = 1

在 Kubernetes 中部署之 SQL Server 容器的 FUA 支援

  1. SQL Server 必須使用永續性掛接儲存體,而不是 overlayfs

  2. 記憶體必須使用 XFSext4 文件系統,而且應該支援 FUA (ext4 不支援 5.6 版之前的 Linux 核心 FUA)。 啟用此設定之前,您應該與 Linux 散發和儲存體廠商合作,以確保 OS 和儲存子系統支援 FUA 選項。 在 Kubernetes 上,您可以使用下列命令來查詢檔案系統類型,其中 <pvc-name> 是您的 PersistentVolumeClaim

    kubectl describe pv <pvc-name>
    

    在輸出中,尋找設定為 XFS 的 fstype

  3. 裝載 SQL Server Pod 的背景工作角色節點,應使用支援 FUA 功能的 Linux 發行版本與版本 (從 Red Hat Enterprise Linux 8.0、SUSE Linux Enterprise Server 12 SP5 或 Ubuntu 18.04 開始)。

如果符合上述條件,則您可以使用下列建議的 FUA 設定。

  1. 啟用追蹤旗標 3979 作為啟動參數。

  2. 使用 mssql-conf 來設定 control.writethrough = 1control.alternatewritethrough = 0

高效能的核心及 CPU 設定

下列章節會描述建議的 Linux OS 設定,以在安裝 SQL Server 時獲得高效能和輸送量。 如需設定這些設定的程序,請參閱 Linux 發行版本文件。 您可以使用 TuneD,如下一節所述設定許多 CPU 和核心組態。

使用 TuneD 來進行核心設定

對於 Red Hat Enterprise Linux(RHEL)使用者, TuneD 的吞吐量效能設定檔會自動配置部分核心與 CPU 設定(C-States 除外)。 從 RHEL 8.0 開始,名為 mssql 的 TuneD 設定檔即與 Red Hat 共同開發,並針對 SQL Server 工作負載提供更佳的 Linux 效能調整。 此設定檔包含 RHEL 輸送量-效能設定檔,我們會此文章中提供其定義,以供您檢閱其他 Linux 發行版本與 RHEL 版本,而不需要此設定檔。

對於 SUSE Linux Enterprise Server 12 SP5、Ubuntu 18.04 和 Red Hat Enterprise Linux 7.x,你可以手動安裝這個 tuned 套件。 請依照以下章節所述,使用它來建立並設定 mssql 設定檔。

使用 TuneD mssql 設定檔的 Linux 建議設定

下列範例提供 Linux 上的 SQL Server 的 TuneD 設定。

[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

CPU 設定建議

下表提供 CPU 設定的建議:

設定 詳細資訊
CPU 頻率管理員 效能 請參閱 cpupower 命令
能源效能偏好 效能 請參閱 x86_energy_perf_policy 命令
min_perf_pct 100 請參閱 Intel p-state 相關文件
C-狀態 僅限 C1 請參閱您的 Linux 或系統文件,以了解如何確保 C-States 設定為 [僅限 C1]

使用上述 TuneD 時,它會自動設定 CPU 頻率調變器和ENERGY_PERF_BIASmin_perf_pct設定。 它以吞吐效能配置檔作為 mssql 檔的基礎。 您必須依照 Linux 或系統發行商提供的文件手動設定 C-States 參數。

磁碟設定建議

下表提供磁碟設定的建議:

設定 詳細資訊
磁碟 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 將緩衝池作為資料頁快取,且強烈偏好透過寫入至物理硬體而繞過檔案系統快取以達成可靠復原,因此積極的交換配置對於高效能且專用的 SQL Server 非常有利。

    您可以在 /proc/sys/vm/ 的文件 - #swappiness 找到其他資訊

  • vm.dirty_*:未快取 SQL Server 檔案寫入存取,其滿足其資料完整性需求。 這些參數能夠實現高度的非同步寫入效能,並在節流排清時允許足夠大的快取,以降低儲存體 IO 對 Linux 快取寫入的影響。

  • kernel.sched_*: 這些參數值代表目前對 Linux 核心中完全公平排程(CFS)演算法調整的建議。 它們提升網路與儲存 I/O 呼叫的吞吐量,特別是在處理程序間搶占與執行緒恢復方面。

使用 mssql TuneD 設定檔會配置 vm.swappinessvm.dirty_*kernel.sched_* 設定。 你必須手動使用blockdev 指令來設定每個設備的readahead 磁碟設定。

核心設置自動 NUMA 平衡以適應多節點 NUMA 系統

如果你在多節點的 NUMA 系統上安裝 SQL Server,以下 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。 基於這個理由,請將 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 部署中發生頻繁的記憶體分頁活動,或伺服器上與其他需大量記憶體的應用程式共同執行時,請在執行以下指令後測試您的應用程式效能:

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

或使用此行來修改 mssql TuneD 設定檔:

vm.transparent_hugepages=madvise

請確保在修改後 mssql 設定檔已啟用。

tuned-adm off
tuned-adm profile mssql

使用 mssql TuneD 設定檔設定 transparent_hugepage 選項。

網路設定建議

除了儲存空間和 CPU 建議外,你還有網路特定的建議。 以下建議列出供參考。 下列範例中的所有設定並非都可在不同的 NIC 適用。 如需這些選項的指引,請參閱並洽詢 NIC 廠商。 在開發環境上測試並設定,再將其套用到實際執行環境。 下列選項會以範例說明,而使用的命令是 NIC 類型和廠商特有的。

  1. 設定網路連接埠緩衝區大小。 在範例中,網卡名為 eth0,是基於 Intel 的網卡。 針對以 Intel 為基礎的 NIC,建議的緩衝區大小為 4 KB (4096)。 確認預先設定的最大值,然後使用下列範例進行設定:

    請用以下指令檢查預設的最大值。 以您的 NIC 名稱取代 eth0

    ethtool -g eth0
    

    rx (接收) 和 tx (傳輸) 緩衝區大小都設定為 4 KB:

    ethtool -G eth0 rx 4096 tx 4096
    

    檢查值是否已正確設定:

    ethtool -g eth0
    
  2. 啟用 Jumbo 框架。 啟用 Jumbo 框架之前,請確認用戶端與 SQL Server 之間網路封包路徑中的所有網路交換器、路由器和任何其他基本項目都支援 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
    
    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 IRQ 聯合,然後特別設定值:

    停用自適性 RX/TX IRQ 聯合:

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

    確認變更:

    ethtool -c eth0
    

    設定 rx-usecsirq 參數。 rx-usecs 指定在收到至少一個封包後幾微秒才會產生中斷。 參數 irq 會指定停用中斷時處於更新狀態的對應延遲。 針對以 Intel 為基礎的 NIC,您可以使用下列設定:

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

    確認變更:

    ethtool -c eth0
    
  4. 啟用接收端縮放(RSS),並預設整合 RSS 佇列的接收(RX)與傳送(TX)端。 在使用 Microsoft 支援時,有些特定情境關閉 RSS 也能提升效能。 先在測試環境中測試此設定,再將其套用到實際執行環境。 下列範例適用於 Intel NIC。

    取得預設最大值:

    ethtool -l eth0
    

    將佇列與預設「已合併」最大值中所報告的值合併。 在此範例中,值會設定為 8

    ethtool -L eth0 combined 8
    

    確認設定:

    ethtool -l eth0
    
  5. 使用 NIC 埠 IRQ Affinity。 為了透過調整 IRQ 親和性來達到預期效能,請考慮幾個重要參數,如 Linux 對伺服器拓撲的處理、網卡驅動程式堆疊、預設設定及 irqbalance 設定。 NIC 埠 IRQ 親和度設定的優化需在了解伺服器拓撲的前提下進行,並停用 irqbalance,並使用 NIC 廠商專屬設定。

    下列 Mellanox 特定網路基礎結構範例有助於說明組態。 如需詳細資訊,以及若要下載 Mellanox mlnx 工具,請參閱 Mellanox 網路介面卡的效能微調工具。 命令會根據環境而變更。 請連絡 NIC 廠商以取得進一步指引。

    停用 irqbalance 或取得 IRQ 設定的快照,並強制精靈結束:

    systemctl disable irqbalance.service
    

    或:

    irqbalance --oneshot
    

    請確定 common_irq_affinity.sh 是可執行檔:

    chmod +x common_irq_affinity.sh
    

    顯示 Mellanox NIC 連接埠的 IRQ 親和性 (例如 eth0):

    ./show_irq_affinity.sh eth0
    

    使用 Mellanox 工具優化以獲得最佳輸送量效能:

    ./mlnx_tune -p HIGH_THROUGHPUT
    

    將硬體親和性設定為實際載入 NIC 及其連接埠的 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
    

進階核心和 OS 組態

  • 為了獲得最佳的儲存 I/O 效能,建議使用 Linux 多排程來處理區塊裝置。 此排程方法使區塊層效能能在高速固態硬碟(SSD)及多核心系統中良好擴展。 請查看文件,看看你的 Linux 發行版是否預設啟用此功能。 在大多數其他情況下,你可以用 啟動核心 scsi_mod.use_blk_mq=y 來啟用它。 你的 Linux 發行版文件可能會有更多關於此設定的指引。 此設定與上游 Linux 核心一致。

  • 由於多路徑 I/O 常用於 SQL Server 部署,請設定裝置映射器(DM)多排隊目標使用 blk-mq 基礎架構,並啟用 dm_mod.use_blk_mq=y 核心開機選項。 預設值為 n (已停用)。 此設定可在裝置管理層減少設定鎖定負擔,當底層 SCSI 裝置使用 blk-mq 時。 如需如何設定多重路徑 I/O 的詳細資訊,請參閱 Linux 發行版本的文件。

設定交換檔

請確定您已正確設定交換檔,以避免發生記憶體不足的問題。 請參閱您的 Linux 文件,以了解如何建立和適當地調整交換檔大小。

虛擬機器和動態記憶體

如果正在虛擬機器的 Linux 上執行 SQL Server,請務必選取選項來修正保留給虛擬機器的記憶體數量。 請勿使用 Hyper-V 動態記憶體這類功能。

SQL Server 設定

在 Linux 安裝 SQL Server 後,請執行以下設定任務,以達到應用程式的最佳效能。

最佳做法

針對節點和/或 CPU 使用處理程序親和性

ALTER SERVER CONFIGURATION來設定PROCESS AFFINITY,以便設定你在 Linux 作業系統上的所有 SQL Server 節點和 CPU (通常是所有 NODE 和 CPU)。 處理程序親和性有助於維護有效率的 Linux 和 SQL 排程行為。 使用 NUMANODE 選項是最簡單的方法。 即使電腦上只有一個 NUMA 節點,仍應使用PROCESS AFFINITY。 如需如何設定 PROCESS AFFINITY 的詳細資訊,請參閱 ALTER SERVER CONFIGURATION 一文。

設定多個 tempdb 資料檔案

由於 Linux 上的 SQL Server 安裝未提供設定多個 tempdb 檔案的選項,因此建議您在安裝之後,考慮建立多個 tempdb 資料檔案。 如需詳細資訊,請參閱文章中的指導方針避免 SQL Server tempdb 資料庫中配置爭用的建議 \(機器翻譯\)。

進階組態

下列建議是選擇性的組態設定,您可以選擇在安裝 Linux 上的 SQL Server 之後執行。 這些選擇是根據工作負載和 Linux OS 設定的需求而定。

使用 mssql-conf 設定記憶體限制

為了確保 Linux 作業系統有足夠的實體記憶體,SQL Server 程序預設只使用 80% 的實體記憶體。 對於某些擁有大量實體記憶體的系統,20% 可能是一個相當大的數字。

例如,在具有 1 TB RAM 的系統上,預設設定會保留大約 200 GB 的 RAM (未使用)。 在此情況下,您可能會想要將記憶體限制設定為較高的值。 你可以用 mssql-conf 工具調整這個數值。 更多資訊請參閱 memory.memorylimitmb 設定,該設定控制 SQL Server 可見的記憶體(以 MB 為單位)。

注意

你也可以用 MSSQL_MEMORY_LIMIT_MB 環境變數設定記憶體限制。 此方法常用於部署容器,或自動化基於 SQL Server 容器或套件的部署。 MSSQL_MEMORY_LIMIT_MB環境變數優先於設定。memory.memorylimitmb

變更此設定時,請小心不要將這個值設得太高。 如果沒有保留足夠的記憶體,則可能會遇到 Linux OS 和其他 Linux 應用程式的問題。

使用控制組 (cgroup) v2 設定記憶體限制

從 SQL Server 2025(17.x)及 SQL Server 2022(16.x)CU 20 開始,SQL Server 偵測並執行控制群組(cgroup)v2 約束,提升 Docker、Kubernetes 及 OpenShift 環境下的效能穩定性與資源隔離。 控制組可在 Linux 核心中對 CPU 和記憶體等系統資源進行精細控制。

透過 cgroup v2 支援,SQL Server 可減輕先前在容器化部署中觀察到的記憶體不足 (OOM) 錯誤,特別是在 Kubernetes 叢集上 (例如 AKS v1.25+),其中未強制執行容器規格中定義的記憶體限制。

檢查 cgroup 版本

stat -fc %T /sys/fs/cgroup

結果如下:

Result 描述
cgroup2fs 您使用的是 cgroup v2
cgroup 您使用的是 cgroup v1

切換到 cgroup v2

最簡單的方法是選擇開箱即用的支援 cgroup v2 的發行版。

如果您需要手動切換,請將下列行新增至 GRUB 組態:

systemd.unified_cgroup_hierarchy=1

然後,執行下列命令來更新 GRUB:

sudo update-grub

如需詳細資訊,請參閱下列資源:

設定記憶體限制的指引

在設定 Linux SQL Server 記憶體限制時,請參考以下指引:

  • cgroup 來限制容器可用的整體記憶體。 此設定確立了容器內所有程序的上界。

  • 記憶體限制(無論是由 memorylimitmbMSSQL_MEMORY_LIMIT_MB Linux 或環境變數設定)控制 SQL Server 在所有元件間可分配的總記憶體,例如緩衝池、SQLPAL、SQL Server 代理程式、LibOS、PolyBase、Full-Text 搜尋,以及 Linux SQL Server 載入的其他程序。

  • MSSQL_MEMORY_LIMIT_MB 環境變數的優先級高於在 mssql.conf 中定義的 memorylimitmb

  • memorylimitmb 不能超過主機系統的實際實體記憶體。

  • 設定 memorylimitmb 低於主機系統記憶體和 cgroup 限制(如果有的話),以確保 Linux 作業系統有足夠的實體空間。 如果你沒有明確設定 memorylimitmb,SQL Server 會用 80% 的較小值來計算總系統記憶體和 cgroup 限制(如果有的話)。

  • max_server_memory伺服器設定選項僅限制 SQL Server 緩衝池的大小,並不管理 Linux 上 SQL Server 的整體記憶體使用量。 此值必須設定得低於以下 memorylimitmb ,以確保其他元件(如 SQLPAL、SQL Server 代理程式、LibOS、PolyBase、Full-Text 搜尋,以及 Linux 上載入的其他程序)有足夠的記憶體。