Konfigurieren von persistentem Speicher (PMEM) für SQL Server für Linux
Gilt für: SQL Server – Linux
In diesem Artikel wird beschrieben, wie PMEM (Persistent Memory, persistenter Arbeitsspeicher) für SQL Server 2019 (15.x) und höher unter Linux konfiguriert wird.
Überblick
In SQL Server 2019 (15.x) wurden zahlreiche In-Memory-Features eingeführt, die PMEM verwenden. Dieser Artikel behandelt die Konfiguration von PMEM für SQL Server für Linux.
Hinweis
Der Begriff Aufklärung wurde eingeführt, um das Konzept eines Dateisystems auszudrücken, das persistenten Speicher unterstützt. Der direkte Zugriff auf das Dateisystem von Anwendungen des Benutzerbereichs aus erfolgt mithilfe einer Speicherzuordnung (mmap()
). Wenn eine Speicherzuordnung für eine Datei erstellt wird, kann die Anwendung Lade-/Speicheranweisungen ausgeben und den E/A-Stapel dabei vollständig umgehen. Dies gilt aus der Perspektive der Hosterweiterungsanwendung (dem Code, über den SQLPAL mit Windows- oder Linux-Betriebssystemen interagieren kann) als „aufgeklärte“ Dateizugriffsmethode.
Erstellen von Namespaces für PMEM-Geräte
Konfigurieren der Geräte
Verwenden Sie in Linux das Hilfsprogramm ndctl
.
- Installieren Sie
ndctl
, um das PMEM-Gerät zu konfigurieren. Sie finden das Hilfsprogramm hier. - 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
Hier wurde der fsdax
-Modus ausgewählt, und seitenbezogene Metadaten werden im Systemspeicher gespeichert. Es wird empfohlen, --map=dev
zu verwenden. Mit dieser Option werden die Metadaten direkt im Namespace gespeichert. Das Speichern von Metadaten im Arbeitsspeicher mithilfe von --map=mem
ist zurzeit 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).
Beispielsweise mit XFS
mkfs.xfs -f /dev/pmem0
mount -o dax,noatime /dev/pmem0 /mnt/dax
xfs_io -c "extsize 2m" /mnt/dax
Beispielsweise mit EXT4
mkfs.ext4 -b 4096 -E stride=512 -F /dev/pmem0
mount -o dax,noatime /dev/pmem0 /mnt/dax
Technische Überlegungen
- Nehmen Sie Blockzuweisung von 2 MB für XFS- oder EXT4-Systeme vor, 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 keine Transparent Huge Pages (THP), standardmäßig in den meisten Distributionen aktiviert.
Wenn das Gerät mit ndctl
konfiguriert, erstellt und eingebunden wird, können Sie Datenbankdateien darin ablegen oder eine neue Datenbank erstellen.
Sie können die SQL Server-Datendateien (MDFS, NDFS) und tempdb
-Dateien auf einem PMEM-Gerät speichern, wenn Sie den Modus fsdax
mithilfe des folgenden Befehls konfigurieren. Verwenden Sie diese Konfiguration nicht zum Speichern des SQL Server-Protokolls (LDFS), da sich das Transaktionsprotokoll in einem Speicher befinden muss, der Unteilbarkeit für den Sektor garantiert:
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 optimale Leistung beim Zugriff und bei der Aktualisierung dieser NVDIMM-Seiteneinträge ist die Verwendung von
-map=mem
vorzuziehen. - Wenn die Kapazität des NVDIMM zu groß ist (mehr als 512 GB), legen Sie
–map=dev
fest, was sich auf den E/A-Durchsatz auswirken und die Leistung beeinträchtigen würde.
Bei SQL Server-Protokolldateien auf PMEM-Geräten konfigurieren Sie die PMEM-Geräte für die Verwendung der Sektor-/Blockübersetzungstabelle. Dies bietet die erforderliche Sektorunteilbarkeit für SQL Server-Protokolldateien für diese Technologie von Speichergeräten. Es wird auch empfohlen, Workloadleistungsüberprüfungen durchzuführen. Sie können die SQL Server-Protokollleistung für Ihre Workload zwischen dieser Lösung und branchenführenden NVMe-SSDs vergleichen. Wählen Sie dann die Lösung aus, die Ihren Anforderungen am besten entspricht und eine bessere Leistung bietet.
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.
Hinweis
Ein Speichersystem kann sicherstellen, dass alle zwischengespeicherten oder mehrstufigen Schreibvorgänge als sicher und dauerhaft gelten, indem es garantiert, dass die an das Gerät ausgegebenen Schreibvorgänge auf einem hardwareredundanten Medium gespeichert werden, das Systemabstürze, Schnittstellenrücksetzungen und Stromausfälle überdauert.
Datenbankdateien (
.mdf
und.ndf
) und Transaktionsprotokolldateien (.ldf
) verwendenwritethrough
undalternatewritethrough
nicht standardmäßig in SQL Server 2017 (14.x) CU 6 und höher, da sie das Verhalten der erzwungenen Leerung verwenden. Ablaufverfolgungsflag 3979 deaktiviert das Verhalten der erzwungenen Leerung für Datenbank- und Transaktionsprotokolldateien und verwendet diewritethrough
- undalternatewritethrough
-Logik.Andere Dateien, die mithilfe von
FILE_FLAG_WRITE_THROUGH
in SQL Server geöffnet werden, z. B. Datenbankmomentaufnahmen, interne Momentaufnahmen für Datenbankkonsistenzprüfungen (DBCC CHECKDB
), Profiler-Ablaufverfolgungsdateien und erweiterte Ereignis-Ablaufverfolgungsdateien, verwenden die Optimierungenwritethrough
undalternatewritethrough
.
Weitere Informationen zu den Änderungen, die in SQL Server 2017 (14.x) CU 6 eingeführt wurden, finden Sie unter KB 4131496. Weitere Informationen zum erzwungenen Zugriff auf Einheiten (Forced Unit Access, FUA) finden Sie unter Informationen zu FUA.
FUA-EA-Subsystemfunktion (Forced Unit Access) in SQL Server
Bestimmte Versionen unterstützter Linux-Distributionen bieten Unterstützung für die FUA-E/A-Subsystemfunktion, um für Dauerhaftigkeit der Daten zu sorgen. SQL Server verwendet die FUA-Funktion, um für hocheffiziente und zuverlässige E/A für SQL Server-Workloads zu sorgen. Weitere Informationen zur Unterstützung für FUA durch Linux-Distributionen und zu den Auswirkungen auf SQL Server finden Sie unter SQL Server On Linux: Forced Unit Access (FUA) Internals (SQL Server für Linux: Informationen zu FUA (Forced Unit Access)).
Ab SUSE Linux Enterprise Server 12 SP5, Red Hat Enterprise Linux 8.0 und Ubuntu 18.04 wird die FUA-Funktion im E/A-Subsystem unterstützt. Wenn Sie SQL Server 2017 (14.x) CU 6 und höher verwenden, sollten Sie die folgende Konfiguration für eine leistungsstarke und effiziente E/A-Implementierung mit FUA von SQL Server verwenden.
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)
XFS-Dateisystem für SQL Server-Speicher
Speichersubsystem und/oder Hardware, die die FUA-Funktion unterstützt und entsprechend konfiguriert ist
Empfohlene Konfiguration:
Aktivieren Sie das Ablaufverfolgungsflag 3979 als Startparameter.
Verwenden Sie mssql-conf zum Konfigurieren von
control.writethrough = 1
undcontrol.alternatewritethrough = 0
.
Für beinahe alle anderen Konfigurationen, die die vorherigen Bedingungen nicht erfüllen, lautet die empfohlene Konfiguration wie folgt:
Aktivieren Sie das Ablaufverfolgungsflag 3982 als Startparameter (dies ist der Standardwert für SQL Server im Linux-Ökosystem), und stellen Sie sicher, dass das Ablaufverfolgungsflag 3979 nicht als Startparameter aktiviert ist.
Verwenden Sie mssql-conf zum Konfigurieren von
control.writethrough = 1
undcontrol.alternatewritethrough = 1
.
FUA-Unterstützung für SQL Server-Container, die in Kubernetes bereitgestellt werden
Der SQL Server muss den persistent bereitgestellten Speicher verwenden und nicht
overlayfs
.Der Speicher muss das XFS-Dateisystem verwenden und sollte FUA unterstützen. Bevor Sie diese Einstellung aktivieren, sollten Sie mit Ihrem Linux-Distributions- und Speicheranbieter zusammenarbeiten, um sicherzustellen, dass das Betriebssystem und das Speichersubsystem FUA-Optionen unterstützt. In Kubernetes können Sie den Dateisystemtyp mithilfe des folgenden Befehls abfragen, wobei
<pvc-name>
IhrPersistentVolumeClaim
ist:kubectl describe pv <pvc-name>
Suchen Sie in der Ausgabe nach dem
fstype
, der auf XFS festgelegt ist.Der die SQL Server-Pods hostende Workerknoten sollte eine Linux-Distribution und -Version verwenden, die die FUA-Funktion unterstützt (ab Red Hat Enterprise Linux 8.0, SUSE Linux Enterprise Server 12 SP5 oder Ubuntu 18.04).
Wenn die oben genannten Bedingungen erfüllt sind, können Sie die folgenden empfohlenen FUA-Einstellungen verwenden.
Aktivieren Sie das Ablaufverfolgungsflag 3979 als Startparameter.
Verwenden Sie mssql-conf zum Konfigurieren von
control.writethrough = 1
undcontrol.alternatewritethrough = 0
.