Bewährte Methoden zur Leistung: SQL Server Arbeitsspeicher unter Linux

Gilt für:SQL Server unter Linux

In diesem Artikel werden Speicherkonfigurationen für SQL Server für Linux behandelt, einschließlich mssql-conf Speicherbeschränkungen, Steuerelementgruppeneinstellungen (cgroup), Docker-Containerspeicherbeispiele und Überlegungen zum Austausch von Speicherplatz.

Note

Empfehlungen zu Speicher, Kernel, CPU und Netzwerk finden Sie unter bewährte Methoden zur Leistung: Speicher, Kernel, CPU und Netzwerk für SQL Server für Linux.

Festlegen eines Speicherlimits mithilfe von mssql-conf

Um sicherzustellen, dass genügend freier physischer Arbeitsspeicher für das Linux-Betriebssystem vorhanden ist, verwendet der SQL Server-Prozess standardmäßig nur 80 Prozent des physischen RAM. Bei einigen Systemen mit großen Mengen physischem RAM kann es sich bei 20 Prozent um eine signifikante Zahl handeln. Bei einem System mit 1 TB RAM lässt die Standardeinstellung beispielsweise 200 GB RAM nicht verwendet. In diesem Fall sollten Sie das Arbeitsspeicherlimit auf einen höheren Wert festlegen.

Sie können diesen Wert mithilfe des mssql-conf Tools oder der MSSQL_MEMORY_LIMIT_MB Umgebungsvariablen anpassen. Weitere Informationen finden Sie in der Einstellung "memory.memorylimitmb ", die den für SQL Server sichtbaren Speicher steuert (in Einheiten von MB). Ausführliche Anleitungen zur Größenanpassung finden Sie unter Richtlinien zum Festlegen von Speichergrenzwerten für Linux und in Containern.

Unterstützung von cgroup v2

SQL Server erkennt und berücksichtigt Kontrollgruppeneinschränkungen (cgroup) v2, beginnend mit SQL Server 2025 (17.x) und SQL Server 2022 (16.x) Kumulatives Update (CU) 20. Diese Einschränkungen bieten eine differenzierte Kontrolle im Linux-Kernel über CPU- und Speicherressourcen und verbessern die Ressourcenisolation in Docker-, Kubernetes- und OpenShift-Umgebungen.

In früheren Versionen können containerisierte Bereitstellungen auf Kubernetes-Clustern (z. B. Azure Kubernetes Service v1.25+) fehler im Arbeitsspeicher (OOM) auftreten, da SQL Server in Containerspezifikationen definierte Speichergrenzwerte nicht erzwungen haben. Die Unterstützung für cgroup v2 behebt dieses Problem.

Cgroup-Version überprüfen

stat -fc %T /sys/fs/cgroup

Die Ergebnisse sind wie folgt:

Result Description
cgroup2fs Sie verwenden cgroup v2
cgroup Sie verwenden cgroup v1

Wechseln zu cgroup v2

Der einfachste Weg ist die Auswahl einer Distribution, die cgroup v2 von Haus aus unterstützt.

Wenn Sie manuell wechseln müssen, fügen Sie der GRUB-Konfiguration den folgenden Parameter hinzu:

systemd.unified_cgroup_hierarchy=1

Aktualisieren Sie dann GRUB. Führen Sie beispielsweise unter Ubuntu Folgendes aus:

sudo update-grub

Führen Sie auf Red Hat Enterprise Linux (RHEL) Folgendes aus:

sudo grub2-mkconfig -o /boot/grub2/grub.cfg

CPU-Grenzwertberichterstattung mit cgroup v2

Wenn Sie CPU-Grenzwerte mit cgroup v2 konfigurieren, zeigt SQL Server nicht die konfigurierte CPU-Kernanzahl im Fehlerprotokoll an. Stattdessen wird weiterhin die Gesamtanzahl der Host-CPUs angezeigt.

Wenden Sie die folgende Konfiguration an, um SQL Server Zeitplan- und Abfragepläne (z. B. Parallelitätsentscheidungen) mit der beabsichtigten CPU-Anzahl auszurichten, die in cgroup v2 definiert ist.

Konfigurieren der Prozessoraffinität

Legen Sie explizit SQL Server Prozessoraffinität so fest, dass sie dem Cgroup-Ausführungskontingent entspricht. Im folgenden Beispiel ist das cgroup-Kontingent vier CPUs auf einem achtkernigen Host:

ALTER SERVER CONFIGURATION
SET PROCESS AFFINITY CPU = 0 TO 3;

Diese Konfiguration stellt sicher, dass SQL Server Scheduler nur für die beabsichtigte Anzahl von CPUs erstellt. Weitere Informationen finden Sie unter ALTER SERVER CONFIGURATION"PROCESS AFFINITY" für Node und/oder CPUs.

Aktivieren Sie die Ablaufverfolgungskennzeichnung 8002, um weiche Affinität auf der SQLPAL-Ebene zu verwenden:

sudo /opt/mssql/bin/mssql-conf traceflag 8002 on

Standardmäßig sind Scheduler an bestimmte CPUs gebunden, die in der Affinitätsmaske definiert sind. Das Trace-Flag 8002 ermöglicht es Schedulern stattdessen, zwischen CPUs zu wechseln, wodurch die Leistung im Allgemeinen verbessert wird, während die Affinität und cgroup-Einschränkungen eingehalten werden. Weitere Informationen finden Sie unter DBCC TRACEON – Ablaufverfolgungsflags.

Starten Sie SQL Server neu, nachdem Sie das Ablaufverfolgungskennzeichen aktiviert haben.

Erwartetes Verhalten

Nach dem Neustart:

  • SQL Server erstellt nur die Anzahl der Planer, die durch die Affinitätseinstellung definiert sind (z. B. vier Planer).

  • Der Linux-Kernel erzwingt weiterhin das Cgroup v2 CPU-Ausführungskontingent.

  • Abfrageoptimierungs- und Parallelitätsentscheidungen basieren auf der vorgesehenen CPU-Anzahl und nicht auf den Gesamthost-CPUs.

Note

Das SQL Server Fehlerprotokoll zeigt möglicherweise weiterhin die Gesamtanzahl der Host-CPU an. Dieses Protokollierungs- und Anzeigeverhalten wirkt sich nicht auf die tatsächliche CPU-Auslastung, die Erstellung des Zeitplans oder die CPU-Erzwingung durch cgroup v2 oder Prozessoraffinität aus.

Weitere Informationen finden Sie in den folgenden Ressourcen:

Richtlinien zum Festlegen von Speicherbeschränkungen für Linux und in Containern

SQL Server für Linux verfügt über mehrere Speichersteuerelemente, die auf unterschiedlichen Ebenen ausgeführt werden. Die folgende Tabelle und das folgende Diagramm zeigen, wie jede Ebene den verfügbaren Arbeitsspeicher von Host-RAM auf den Pufferpool einschränkt.

Grad Festgelegt durch Description
Host Hardware-/VM-Konfiguration Physischer RAM auf dem Server oder virtuellen Computer (VM).
cgroup limit (docker run --memory, systemd, or manual) Containerlaufzeit, systemd Segment oder manuelle cgroup Konfiguration Kernel-erzwungene Obergrenze (memory.max) für alle Prozesse in der cgroup. Optional auf Bare-Metal Linux.
SQL Server Prozess (memorylimitmb / MSSQL_MEMORY_LIMIT_MB) mssql-conf oder Umgebungsvariable Gesamtspeicher für alle SQL Server Komponenten. Muss niedriger als der cgroup Grenzwert (sofern vorhanden) oder Hostspeicher sein.
Pufferpool (max_server_memory) sp_configure Der Cache von 8-KB-Datenseiten. Muss niedriger sein als memorylimitmb.
Headroom Berechnet (Abstand zwischen Grenzwerten) Die Lücke zwischen dem cgroup Grenzwert (oder Hostspeicher) und memorylimitmb, reserviert für BS-Overhead- und Hilfsprozesse.

Diagramm mit geschachtelten Speichersteuerungsebenen.

Beachten Sie beim Festlegen von Speichergrenzwerten für SQL Server unter Linux die folgenden Richtlinien:

  • Verwenden Sie cgroup in Containerbereitstellungen, um den für den Container verfügbaren Gesamtspeicher zu begrenzen. Diese Einstellung richtet die obere Grenze für alle Prozesse innerhalb des Containers ein.

  • Die Speichergrenze (ob festgelegt durch memorylimitmb oder die MSSQL_MEMORY_LIMIT_MB Umgebungsvariable) steuert den Gesamtspeicher, den SQL Server unter Linux über alle komponenten hinweg zuordnen kann, z. B. pufferpool, SQLPAL, SQL Server-Agent, LibOS, PolyBase, Full-Text Search und alle anderen prozesse, die in SQL Server unter Linux geladen wurden.

  • Die MSSQL_MEMORY_LIMIT_MB Umgebungsvariable hat Vorrang vor memorylimitmb der Definition in mssql.conf.

  • memorylimitmb kann den tatsächlichen physischen Speicher des Hostsystems nicht überschreiten.

  • Legen Sie memorylimitmb niedriger als der Hostsystemspeicher und den cgroup Grenzwert (sofern vorhanden) fest, um sicherzustellen, dass genügend freier physischer Arbeitsspeicher für das Linux-Betriebssystem vorhanden ist. Wenn Sie nicht explizit festlegenmemorylimitmb, verwendet SQL Server 80 Prozent des niedrigeren Werts zwischen dem Gesamtspeicher des Systems und dem cgroup Grenzwert (sofern vorhanden).

  • Die max_server_memory Serverkonfigurationsoption beschränkt nur die Größe des SQL Server-Pufferpools und steuert nicht die allgemeine Speicherauslastung für SQL Server unter Linux. Legen Sie diesen Wert immer niedriger als memorylimitmb fest, um sicherzustellen, dass genügend Arbeitsspeicher für die anderen Komponenten bleibt, die im vorherigen Aufzählungszeichen beschrieben sind.

Kopfraum zwischen SQL Server- und Containerspeicherbeschränkungen

Wenn Sie SQL Server in einem Container mit einem konfigurierten Speicherlimit (z. B. der cgroup Einstellungmemory.max) ausführen, behalten Sie den Kopfraum zwischen memory.memorylimitmb und dem Containerspeicherlimit bei. Dieser Kopfraum bietet Betriebssystem-Overhead- und Hilfsprozesse innerhalb des Containers.

  • Reservieren Sie für die meisten Bereitstellungen zwischen 10 und 20 Prozent des Containerspeichers für das Betriebssystem und nicht SQL Server Prozesse, und legen Sie unter die verbleibende Kapazität festmemory.memorylimitmb.

  • Bei großen Speicherkonfigurationen kann ein prozentbasierter Puffer mehr Arbeitsspeicher reservieren als erforderlich. Beispielsweise beträgt 10 Prozent eines 256-GB-Containers etwa 25 GB, was für den Betriebssystemaufwand angemessen ist. Allerdings beträgt 10 Prozent eines 512-GB-Containers etwa 51 GB, was wahrscheinlich mehr ist als das Betriebssystem erfordert. Verwenden Sie in diesen Fällen stattdessen einen festen Puffer, ordnen Sie ihren Arbeitslast- und Betriebssystemaufwand entsprechend zu, und weisen Sie den Rest SQL Server zu.

  • Passen Sie den Puffer basierend auf Workloadmerkmalen, anderen Im Container ausgeführten Diensten und der Hostkonfiguration an.

Note

Kein einzelner empfohlener Kopfraumwert gilt für alle Umgebungen. Überprüfen Sie die Speichereinstellungen durch Tests, um die Systemstabilität unter Spitzenlast sicherzustellen.

Vermeiden der Konfiguration von Speicherlimits, die höher als verfügbarer Arbeitsspeicher sind

Konfigurieren memory.memorylimitmb Sie nicht höher als der verfügbare physische Arbeitsspeicher auf dem Host oder höher als die vom Container erzwungene Speichergrenze. Wenn Sie dies tun, verbrauchen SQL Server möglicherweise aggressiven Arbeitsspeicher, sodass nicht genügend Kapazität für das Betriebssystem und unterstützende Prozesse erhalten bleibt. Diese Konfiguration kann zu folgendem Ergebnis führen:

  • Erhöhter Arbeitsspeicherdruck.
  • Reduzierte Systemstabilität und unerwartete Dienstunterbrechungen.
  • Das Betriebssystem, das den sqlservr Prozess aufgrund von OOM-Bedingungen (Out-of-Memory) beendet.

Konfigurieren Sie SQL Server Speichergrenzen unter dem effektiven Arbeitsspeicher, der für den Host oder Container verfügbar ist, und lassen Sie ausreichend Pufferplatz für das Betriebssystem und die Laufzeitdienste.

Docker-Speicherkonfigurationsbeispiele

Die docker run --memory Option legt den cgroup Speichergrenzwert für den Container fest. Dieser Grenzwert ist die vom Kernel erzwungene harte Obergrenze für alle Prozesse im Container. MSSQL_MEMORY_LIMIT_MB(oder memory.memorylimitmb) steuert, wie viel speicher SQL Server verwenden kann. Wie in den vorherigen Richtlinien beschrieben, legen Sie MSSQL_MEMORY_LIMIT_MB immer niedriger als die Containerspeichergrenze fest, um den Kopfraum für das Betriebssystem und Hilfsprozesse zu verlassen.

In den folgenden Beispielen wird ein Host mit 16 GB RAM verwendet. Passen Sie Werte für Ihre Umgebung an.

docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" \
   -e "MSSQL_MEMORY_LIMIT_MB=14336" \
   -p 1433:1433 \
   -d mcr.microsoft.com/mssql/server:2022-latest

Ohne --memory, hat der Behälter keine cgroup Decke. MSSQL_MEMORY_LIMIT_MBschränkt SQL Server ein, aber andere Prozesse innerhalb des Containers können weiterhin ungebundene Hostspeicher verbrauchen.

docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" \
   -e "MSSQL_MEMORY_LIMIT_MB=12288" \
   --memory 12g \
   -p 1433:1433 \
   -d mcr.microsoft.com/mssql/server:2022-latest

Beide Grenzwerte werden auf 12 GB (--memory 12g = 12.288 MB) festgelegt. Kein Kopfraum bleibt für Betriebssystem-Overhead- oder Hilfsprozesse, die zu OOM-Kills führen können.

docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" \
   -e "MSSQL_MEMORY_LIMIT_MB=14336" \
   --memory 12g \
   -p 1433:1433 \
   -d mcr.microsoft.com/mssql/server:2022-latest

MSSQL_MEMORY_LIMIT_MB (14 GB) überschreitet den Containergrenzwert (12 GB). Dieses Szenario führt zu den OOM-Bedingungen, die unter " Vermeiden der Konfiguration von Speichergrenzwerten höher als verfügbarer Arbeitsspeicher" beschrieben werden.

docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" \
   -e "MSSQL_MEMORY_LIMIT_MB=10240" \
   --memory 12g \
   -p 1433:1433 \
   -d mcr.microsoft.com/mssql/server:2022-latest

Der Container ist auf 12 GB (--memory 12g) beschränkt, und SQL Server ist für die Verwendung von bis zu 10 GB (MSSQL_MEMORY_LIMIT_MB=10240) konfiguriert. Die verbleibenden 2 GB (ca. 17 Prozent) bieten Kopfraum für das Betriebssystem und andere Prozesse.

Überlegungen zum Austauschen von Speicherplatz

Wenn Sie SQL Server in einem Container ausführen, aktivieren Sie swap space auf Hostebene, um das Betriebssystem und nicht SQL Server Prozesse zu schützen. Konfigurieren Sie jedoch SQL Server für den Betrieb innerhalb der konfigurierten Speichergrenzen, und verlassen Sie sich nicht auf den Austausch während des normalen Vorgangs.

  • Befolgen Sie die Richtlinien für speicherlimits, um sicherzustellen, dass SQL Server innerhalb des physischen Speichers oder des anwendbaren cgroup Speicherlimits arbeitet.

  • Wenn swap aktiviert ist, behandeln Sie es als Sicherheitsnetz für vorübergehenden Speicherdruck auf dem Host, nicht als Kapazität für beständigen Zustand SQL Server Workloads.

Important

SQL Server Leistung kann erheblich beeinträchtigt werden, wenn der Speicherdruck zu einer Auslagerung führt. Die richtige Größe des Arbeitsspeichers ist der primäre Mechanismus zum Verhindern von Speicherfehlern.