Konfigurieren von persistentem Speicher (PMEM) für SQL Server für Linux

Gilt für:SQL Server unter Linux

Dieser Artikel beschreibt, wie man persistenten Speicher (PMEM) für SQL Server 2019 (15.x) und spätere Versionen unter Linux konfiguriert.

Overview

SQL Server 2019 (15.x) fügt Unterstützung für persistenten Speicher hinzu, um mehrere speicherintensive Operationen zu beschleunigen.

Mit einem PMEM-kompatiblen Dateisystem ermöglicht die Speicherzuordnung (mmap()) Benutzeranwendungen direkten Zugriff auf Dateidaten. Wenn eine Speicherkarte für eine Datei erstellt wird, kann die Anwendung Lade-/Speicherbefehle ausgeben, die die Speicherschicht umgehen.

Note

Dieser direkte Zugriff wird aus Sicht der Host-Erweiterungsanwendung als Enlightened File Access-Methode bezeichnet, wobei SQL Server mit dem Host-Betriebssystem interagiert, indem er die SQL Platform Abstraction Layer (SQLPAL) verwendet.

Dieser Artikel zeigt Ihnen, wie Sie persistenten Speicher für SQL Server für Linux konfigurieren.

Namespaces erstellen für PMEM-Geräte

Konfigurieren der Geräte

Verwenden Sie in Linux das Hilfsprogramm ndctl.

  • Installieren Sie ndctl, um PMEM-Geräte über „NDCTL installieren“ zu konfigurieren.
  • Erstellen Sie einen Namespace mit ndctl. Namespaces sind PMEM-NVDIMM-übergreifend verschachtelt und können unterschiedliche Typen von Benutzerbereichszugriffen auf Speicherbereiche auf dem Gerät bereitstellen. fsdax ist der standardmäßige und der empfohlene Modus für SQL Server.
ndctl create-namespace -f -e namespace0.0 --mode=fsdax --map=dev

Der Modus fsdax speichert die metaDaten pro Seite im Systemspeicher. Die --map=dev Option wird empfohlen, weil sie die Metadaten direkt im Namensraum speichert. Das Speichern von Metadaten im Speicher ist --map=mem experimentell.

Verwenden Sie ndctl, um den Namespace zu überprüfen.

Die Beispielausgabe sieht wie folgt aus:

# ndctl list -N
{
  "dev":"namespace0.0",
  "mode":"fsdax",
  "map":"dev",
  "size":4294967296,
  "sector_size":512,
  "blockdev":"pmem0",
  "numa_node":0
}

Erstellen Sie ein PMEM-Gerät, und binden Sie es ein (mounten Sie es).

Beispiel: mit XFS:

mkfs.xfs -f /dev/pmem0
mount -o dax,noatime /dev/pmem0 /mnt/dax
xfs_io -c "extsize 2m" /mnt/dax

Beispiel: mit ext4:

mkfs.ext4 -b 4096 -E stride=512 -F /dev/pmem0
mount -o dax,noatime /dev/pmem0 /mnt/dax

Technische Überlegungen

  • Blockzuordnung von 2 MB für XFS oder Ext4, wie zuvor beschrieben
  • Abweichungen zwischen Blockzuweisung und mmap führen zu einem automatischen Fallback auf 4 KB
  • Dateigrößen müssen ein Vielfaches von 2 MB sein (Modulo: 2 MB)
  • Deaktivieren Sie „Transparent Huge Pages“ (THP) nicht, da sie in den meisten Distributionen standardmäßig aktiviert sind.

Nachdem du ndctl das Gerät konfiguriert, erstellt und gemountet hast, kannst du Datenbankdateien hineinlegen oder eine neue Datenbank erstellen.

Sie können die SQL Server-Datendateien (.mdf, ) und tempdb Dateien auf einem PMEM-Gerät im Modus fsdax mit folgendem .ndfBefehl speichern. Verwenden Sie diesen Modus nicht, um die SQL Server-Logdateien (.ldf) zu speichern, da das Transaktionsprotokoll Speicher benötigt, der sektoratomare Garantien bietet:

ndctl create-namespace -f -e namespace0.0 --mode=fsdax --map=dev

Beachten Sie folgende Punkte, bevor Sie die Option „-map“ im vorherigen Befehl festlegen:

  • Für die beste Leistung beim Zugriff auf und Aktualisieren dieser NVDIMM-Seiteneinträge für dieses Gerät verwenden Sie bitte -map=mem
  • Wenn die Kapazität des NVDIMM zu groß ist (größer als 512 GB), setze -map=dev, was den I/O-Durchsatz beeinflusst und die Leistung verringert

Für SQL Server-Logdateien auf PMEM-Geräten konfigurieren Sie die PMEM-Geräte so, dass sie die Sektor-/Block-Übersetzungstabelle (BTT) verwenden. Diese Konfiguration bietet die Sektor-Atomizität, die SQL Server-Protokolldateien für diese Speichertechnologie benötigen. Führen Sie Leistungsvalidierungen für die Arbeitsbelastung durch. Vergleiche die SQL Server-Log-Leistung für deine Arbeitslast zwischen dieser Lösung und erstklassigen NVMe-SSDs und wähle dann die aus, die am besten zu deinen Anforderungen passt.

ndctl create-namespace -f -e namespace0.0 --mode= sector

Deaktivieren des Verhaltens der erzwungenen Leerung

Da PMEM-Geräte im Hinblick auf O_DIRECT (direkte E/A) sicher sind, können Sie das Verhalten der erzwungenen Leerung deaktivieren.

Note

Ein Speichersystem kann sicherstellen, dass alle zwischengespeicherten oder gestuften Schreibvorgänge sicher und langlebig sind, indem es sicherstellt, dass Schreibvorgänge auf das Gerät auf einem Medium liegen, das über Systemabstürze, Schnittstellen-Neustarts und Stromausfälle hinweg besteht, und dass das Medium selbst hardwareredundant ist.

  • Datenbankdateien (.mdf und .ndf) und Transaktionsprotokolldateien (.ldf) verwenden writethrough und alternatewritethrough nicht standardmäßig in SQL Server 2017 (14.x) CU 6 und höher, da sie das Verhalten der erzwungenen Leerung verwenden. Trace-Flag 3979 deaktiviert das erzwungene Flush-Verhalten für Datenbank- und Transaktionsprotokolldateien und verwendet die writethrough und-Logik alternatewritethrough .

  • Andere Dateien, mit denen SQL Server geöffnet FILE_FLAG_WRITE_THROUGHwird, wie Datenbank-Snapshots, interne Snapshots für Konsistenzprüfungen der Datenbank (DBCC CHECKDB), Profiler-Trace-Dateien und erweiterte Ereignis-Trace-Dateien verwenden die writethrough und alternatewritethrough Optimierungen.

Weitere Informationen zu den Änderungen, die in SQL Server 2017 (14.x) CU 6 eingeführt wurden, finden Sie unter KB 4131496. Weitere Informationen zu den internen Vorgängen des erzwungenen Zugriffs auf Einheiten (Forced Unit Access, FUA) finden Sie unter FUA-Interna.

Forced Unit Access (FUA)-I/O-Subsystemfunktion in SQL Server

Einige unterstützte Linux-Distributionen implementieren erzwungenen Einheitenzugriff (Forced Unit Access, FUA) auf I/O-Subsystemebene, um die Datenbeständigkeit sicherzustellen. SQL Server nutzt diese Funktion, um eine effiziente und zuverlässige E/A-Leistung für Linux-Workloads bereitzustellen. Weitere Informationen zur FUA-Unterstützung für linux-Verteilungen und deren Auswirkungen auf SQL Server finden Sie unter SQL Server auf Linux: Forced Unit Access (FUA) Internals.

Unterstützung für FUA im E/A-Subsystem wurde in SUSE Linux Enterprise Server 12 SP5, Red Hat Enterprise Linux 8.0 und Ubuntu 18.04 eingeführt. Verwenden Sie in SQL Server 2017 (14.x) CU 6 und höher die folgende Konfiguration, um leistungsstarke und effiziente E/A mit FUA in SQL Server zu ermöglichen.

Verwenden Sie diese empfohlene Konfiguration, wenn die folgenden Bedingungen erfüllt sind:

  • SQL Server 2017 (14.x) CU 6 und höhere Versionen

  • Linux-Distribution und -Version, die die FUA-Funktion unterstützt (ab Red Hat Enterprise Linux 8.0, SUSE Linux Enterprise Server 12 SP5 oder Ubuntu 18.04)

    Note

    Ab SQL Server 2025 (17.x) wird SUSE Linux Enterprise Server (SLES) nicht unterstützt.

  • XFS-Dateisystem für SQL Server-Speicher unter Linux Kernel 4.18 oder höher.

  • ext4 Dateisystem für SQL Server-Speicher auf Linux-Kernel 5.6 oder späteren Versionen.

    Note

    Verwenden Sie das XFS-Dateisystem zum Hosten von SQL Server-Daten und Transaktionsprotokolldateien, wenn die Linux-Kernelversion niedriger als 5.6 ist. Ab kernel Version 5.6 können Sie basierend auf Ihren spezifischen Anforderungen zwischen XFS und Ext4 wählen.

  • Speichersubsystem und Hardware, die FUA-Funktionalität unterstützen und dafür konfiguriert sind

Empfohlene Konfiguration:

  1. Aktivieren Sie das Trace-Flag 3979 als Startparameter.

  2. Verwenden Sie mssql-conf, um control.writethrough = 1 und control.alternatewritethrough = 0 zu konfigurieren.

Verwenden Sie für fast alle anderen Konfigurationen, die die vorherigen Bedingungen nicht erfüllen, die folgende empfohlene Konfiguration:

  1. Aktivieren Sie den Trace Flag 3982 als Startparameter (das ist der Standard für SQL Server im Linux-Ökosystem), und stellen Sie sicher, dass der Trace Flag 3979 nicht als Startparameter aktiviert wird.

  2. Verwenden Sie mssql-conf, um control.writethrough = 1 und control.alternatewritethrough = 1 zu konfigurieren.

FUA-Unterstützung für SQL Server-Container, die in Kubernetes bereitgestellt werden

  1. Der SQL Server muss den persistent bereitgestellten Speicher verwenden und nicht overlayfs.

  2. Der Speicher muss die XFS - oder Ext4-Dateisysteme verwenden und FUA unterstützen (ext4 unterstützt FUA nicht im Linux-Kernel vor Version 5.6). Bevor Sie diese Einstellung aktivieren, arbeiten Sie mit Ihrem Linux-Verteilungs- und Speicheranbieter zusammen, um sicherzustellen, dass das Betriebssystem und das Speichersubsystem FUA-Optionen unterstützen. In Kubernetes können Sie den Dateisystemtyp mithilfe des folgenden Befehls abfragen, wobei <pvc-name> Ihr PersistentVolumeClaim ist:

    kubectl describe pv <pvc-name>
    

    Suchen Sie in der Ausgabe nach dem fstype, das auf XFS festgelegt ist.

  3. Der Workerknoten, der die SQL Server-Pods hostet, sollte eine Linux-Verteilung und -Version verwenden, die FUA-Funktion unterstützt (beginnend mit Red Hat Enterprise Linux Linux 8.0, SUSE Linux Enterprise Server 12 SP5 oder Ubuntu 18.04).

Wenn die vorstehenden Bedingungen erfüllt sind, verwenden Sie die folgenden empfohlenen FUA-Einstellungen:

  1. Aktivieren Sie das Trace-Flag 3979 als Startparameter.

  2. Verwenden Sie mssql-conf, um control.writethrough = 1 und control.alternatewritethrough = 0 zu konfigurieren.