Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server Linux rendszeren
Ez a cikk a SQL Server on Linux memóriakonfigurációját ismerteti, beleértve mssql-conf a memóriakorlátokat, a vezérlőcsoport (cgroup) beállításait, a Docker tárolómemória-példáit és a hely felcserélése szempontjait.
Note
A tárolási, kernel-, PROCESSZOR- és hálózati javaslatokért tekintse meg a teljesítményre vonatkozó ajánlott eljárásokat: Tárolás, kernel, PROCESSZOR és hálózat SQL Server on Linux.
Memóriakorlát beállítása az mssql-conf használatával
Annak érdekében, hogy elegendő szabad fizikai memória legyen a Linux operációs rendszer számára, a SQL Server folyamat alapértelmezés szerint csak a fizikai RAM 80 százalékát használja. A nagy mennyiségű fizikai RAM-mal rendelkező rendszerek esetében a 20 százalék jelentős szám lehet. Egy 1 TB RAM-mal rendelkező rendszerben például az alapértelmezett beállítás körülbelül 200 GB RAM-ot hagy használaton kívül. Ebben az esetben érdemes lehet a memóriakorlátot magasabb értékre konfigurálni.
Ezt az értéket a mssql-conf eszközzel vagy a MSSQL_MEMORY_LIMIT_MB környezeti változóval módosíthatja. További információért tekintse meg a memory.memorylimitmb beállítást, amely az SQL Server számára látható memóriát vezérli (MB egységekben). Részletes méretezési útmutatásért tekintse meg a Linux és a tárolók memóriakorlátainak beállítására vonatkozó irányelveket.
A csoportvezérlő (cgroup) v2 támogatása
SQL Server a vezérlőcsoport (cgroup) v2 korlátozásait észleli és tiszteletben tartja a 2025-ös (17.x) verziótól kezdődően, valamint a 2022-es (16.x) SQL Server 20-as kumulatív frissítésétől (CU) kezdve. Ezek a korlátozások részletes vezérlést biztosítanak a Linux-kernelben a PROCESSZOR- és memóriaerőforrások felett, és javítják az erőforrások elkülönítését Docker-, Kubernetes- és OpenShift-környezetekben.
A korábbi verziókban a Kubernetes klasztereken végzett konténerizált üzembe helyezések (például Azure Kubernetes Service v1.25+) memóriahiány (OOM) hibákat tapasztalhattak, mert a SQL Server nem érvényesítette a konténer specifikációiban meghatározott memóriakorlátokat. A cgroup v2 támogatása elhárítja ezt a problémát.
A cgroup verziójának ellenőrzése
stat -fc %T /sys/fs/cgroup
Az eredmények a következők:
| Result | Description |
|---|---|
cgroup2fs |
A cgroup v2-t használja |
cgroup |
A cgroup 1-et használja |
Váltás cgroup v2-re
A legegyszerűbb út egy olyan disztribúció kiválasztása, amely a dobozon kívül támogatja a cgroup v2-t.
Ha manuálisan kell váltania, adja hozzá a következő paramétert a GRUB-konfigurációhoz:
systemd.unified_cgroup_hierarchy=1
Ezután frissítse a GRUB-t. Például futtassa az alábbit Ubuntu alatt:
sudo update-grub
Red Hat Enterprise Linuxon (RHEL) futtassa a következőt:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
CPU-korlát jelentése a cgroup v2 használatával
Ha a cgroup v2 használatával konfigurálja a CPU-korlátokat, SQL Server nem jeleníti meg a konfigurált processzormagok számát a hibanaplóban. Ehelyett továbbra is a gazdagép CPU-k teljes számát jelenti meg.
Ha SQL Server ütemezőt és lekérdezési terveket (például párhuzamossági döntéseket) a cgroup v2-ben meghatározott processzorszámhoz szeretné igazítani, alkalmazza az alábbi konfigurációt.
Processzor-affinitás konfigurálása
Explicit módon állítsa be SQL Server processzor-affinitást a csoport végrehajtási kvótájának megfelelőre. A következő példában a csoportkvóta négy processzor egy nyolcmagos gazdagépen:
ALTER SERVER CONFIGURATION
SET PROCESS AFFINITY CPU = 0 TO 3;
Ez a konfiguráció biztosítja, hogy SQL Server csak a kívánt processzorszámhoz hozza létre az ütemezőket. További információkért lásd: ALTER SERVER CONFIGURATION és a PROCESS AFFINITY használata csomópontokhoz és/vagy CPU-khoz.
8002-es nyomkövetési jelző engedélyezése (ajánlott)
Engedélyezze a 8002-es nyomkövetési jelzőt az SQLPAL-rétegen a puha affinitás használatához:
sudo /opt/mssql/bin/mssql-conf traceflag 8002 on
Alapértelmezés szerint az ütemezők az affinitási maszkban meghatározott meghatározott CPU-khoz vannak kötve. A nyomkövetési jelző 8002 lehetővé teszi az ütemezők számára, hogy inkább a cpu-k között mozogjanak, ami általában javítja a teljesítményt, miközben továbbra is tiszteletben tartja az affinitást és a csoportkorlátozásokat. További információ: DBCC TRACEON – Nyomkövetési jelzők.
A nyomkövetési jelző engedélyezése után indítsa újra SQL Server.
Várható viselkedés
Újraindítás után:
SQL Server csak az affinitási beállítás által meghatározott ütemezők számát hozza létre (például négy ütemezőt).
A Linux kernel továbbra is kikényszeríti a cgroup v2 cpu végrehajtási kvótát.
A lekérdezésoptimalizálási és párhuzamossági döntések a kívánt processzorszámon alapulnak, nem pedig a teljes gazdagép CPU-ján.
Note
Előfordulhat, hogy a SQL Server hibanapló továbbra is megjeleníti a gazdagép teljes CPU-számát. Ez a naplózási és megjelenítési viselkedés nem befolyásolja a processzor tényleges használatát, az ütemező létrehozását vagy a processzorfelügyeletet a cgroup v2 és a processzor-affinitás által.
További információt a következő források tartalmaznak:
- Rövid útmutató: SQL Server Linux-tároló üzembe helyezése a Kubernetesben Helm-diagramok használatával
- Control Group v2 (Linux Kernel-dokumentáció)
A memóriakorlátok Linuxon és tárolókban történő beállításának irányelvei
SQL Server on Linux több memóriavezérlőt is használ, amelyek különböző szinteken működnek. Az alábbi táblázat és diagram bemutatja, hogy az egyes szintek hogyan szűkítik a rendelkezésre álló memóriát a gazdagép RAM-jától a pufferkészletig.
| Level | Beállítás: | Description |
|---|---|---|
| Házigazda | Hardver- és virtuálisgép-konfiguráció | Fizikai RAM a kiszolgálón vagy virtuális gépen (VM). |
cgroup limit (docker run --memory, systemdvagy manuális) |
Tároló futtatókörnyezete, systemd szeletelése vagy manuális cgroup konfigurálása |
A kernel által kikényszerített felső korlát (memory.max) az összes folyamathoz a(z) cgroup elemben. Nem kötelező operációs rendszer nélküli Linux rendszeren. |
SQL Server folyamat (memorylimitmb / MSSQL_MEMORY_LIMIT_MB) |
mssql-conf vagy környezeti változó |
Teljes memória az összes SQL Server összetevőben. Kisebbnek kell lennie, mint a cgroup korlát (ha van ilyen) vagy a gazdagép memóriája. |
Pufferkészlet (max_server_memory) |
sp_configure |
A 8 KB-os adatoldalak gyorsítótára. Kisebbnek kell lennie, mint memorylimitmb. |
| Belmagasság | Számított (korlátok közötti különbség) | A cgroup korlát (vagy a gazdagép memóriája) és a memorylimitmb, az operációs rendszer többletterhelése és a kiegészítő folyamatok számára fenntartva, közötti rés. |
A Linuxon futó SQL Server memóriakorlátainak beállításakor vegye figyelembe az alábbi irányelveket:
Tárolótelepítésekben a tároló számára elérhető teljes memória korlátozására használható
cgroup. Ez a beállítás létrehozza a tárolón belüli összes folyamat felső határát.A memóriakorlát (akár a beállított
memorylimitmb, akár aMSSQL_MEMORY_LIMIT_MBkörnyezeti változó) vezérli azt a teljes memóriát, amelyet a Linuxon futó SQL Server lefoglalhat az összes összetevőjén, például a pufferkészleten, az SQLPAL-on, az SQL Server-ügynökön, a LibOS-en, a PolyBase-en, a Full-Text Search-en és a Linuxon futó SQL Serverben betöltött bármely más folyamaton.A
MSSQL_MEMORY_LIMIT_MBkörnyezeti változó elsőbbséget élvez amemorylimitmbmssql.conf-ban/ben definiáltakkal szemben.memorylimitmbnem haladhatja meg a gazdarendszer tényleges fizikai memóriáját.Állítsa alacsonyabbra
memorylimitmba gazdarendszer memóriáját és acgroupkorlátot (ha van ilyen), hogy elegendő szabad fizikai memória legyen a Linux operációs rendszer számára. Ha nem állítja bememorylimitmbexplicit módon, SQL Server a rendszer teljes memóriája és acgroupkorlát (ha van) közötti kisebb érték 80 százalékát használja.A max_server_memory kiszolgáló konfigurációs beállítása csak az SQL Server pufferkészlet méretét korlátozza, és nem szabályozza a Linuxon futó SQL Server általános memóriahasználatát. Ezt az értéket mindig állítsa alacsonyabbra, mint
memorylimitmbannak érdekében, hogy elegendő memória maradjon az előző felsorolásban leírt többi összetevő számára.
Átjáró a SQL Server és a tároló memóriakorlátja között
Ha a SQL Servert beállított memóriakorláttal rendelkező tárolóban futtatja (például a cgroup beállítással memory.max), hagyjon szabad tartalékot a memory.memorylimitmb és a tároló memóriakorlátja között. Ez a fejtér az operációs rendszer terhelését és a tárolón belüli kiegészítő folyamatokat biztosítja.
A legtöbb telepítés esetében a tároló memóriájának 10 és 20 százaléka között foglaljon le az operációs rendszer és a nem SQL Server-folyamatok számára, és a(z)
memory.memorylimitmbértékét állítsa a fennmaradó kapacitás alá.Nagy memóriakonfigurációk esetén a százalékalapú pufferek a szükségesnél több memóriát foglalhatnak le. Például egy 256 GB-os tároló 10 százaléka körülbelül 25 GB, ami ésszerű az operációs rendszer többletterheléséhez. Az 512 GB-os tárolók 10 százaléka azonban körülbelül 51 GB, ami valószínűleg több, mint amennyit az operációs rendszer igényel. Ezekben az esetekben inkább használjon rögzített puffert, amely a számítási feladatok és az operációs rendszer terhelésének megfelelően van méretezve, és a többit a SQL Server foglalja le.
Módosítsa a puffert a számítási feladatok jellemzői, a tárolóban futó egyéb szolgáltatások és a gazdagép konfigurációja alapján.
Note
Nincs egyetlen olyan ajánlott tartalékérték sem, amely minden környezetre érvényes. Ellenőrizze a memóriabeállításokat teszteléssel a rendszer stabilitásának biztosítása érdekében a maximális terhelés alatt.
Ne konfigurálja a rendelkezésre álló memórianél magasabb memóriakorlátokat
Ne állítsa a(z) memory.memorylimitmb értékét a gazdagépen elérhető fizikai memória vagy a tároló által érvényesített memóriakorlát fölé. Ha így tesz, SQL Server agresszíven használhatja fel a memóriát, így nincs elegendő kapacitás az operációs rendszerhez és a támogató folyamatokhoz. Ez a konfiguráció a következőt eredményezheti:
- Megnövekedett memóriaterhelés.
- Csökkentett rendszerstabilitás és váratlan szolgáltatáskimaradások.
- Az operációs rendszer memóriahiány (OOM) miatt megszakítja a
sqlservrfolyamatot.
Konfigurálja SQL Server memóriakorlátokat a gazdagép vagy tároló számára elérhető tényleges memória alatt, és hagyja meg a megfelelő pufferterületet az operációs rendszer és a futtatókörnyezeti szolgáltatások számára.
Példák a Docker memóriakonfigurációs beállításaira
A docker run --memory beállítás beállítja a cgroup tároló memóriakorlátját. Ez a korlát a tárolóban lévő összes folyamat kernel által kikényszerített kemény felső határa.
MSSQL_MEMORY_LIMIT_MB (vagy memory.memorylimitmb) szabályozza, hogy a SQL Server mennyi memóriát használhat. A korábbi irányelvekben leírtak szerint mindig állítsa a MSSQL_MEMORY_LIMIT_MB értékét a konténer memóriakorlátja alá, hogy maradjon némi tartalék az operációs rendszer és a kiegészítő folyamatok számára.
Az alábbi példák egy 16 GB RAM-mal rendelkező gazdagépet használnak. Módosítsa a környezet értékeit.
Nem ajánlott: nincs tárolómemória-korlát
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
--memory nélkül a konténernek nincs cgroup felső határa.
MSSQL_MEMORY_LIMIT_MB korlátozza az SQL Servert, de a konténeren belüli egyéb folyamatok továbbra is korlátlan mennyiségű gazdagépmemóriát használhatnak.
Nem ajánlott: a memóriakorlát megegyezik az SQL Server memóriakorlátjával
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
Mindkét korlát értéke 12 GB (--memory 12g = 12 288 MB). Nem marad tartalék az operációs rendszer többletterhelésére és a kiegészítő folyamatokra, ami OOM miatti leállításokhoz vezethet.
Nem ajánlott: SQL Server memóriakorlát meghaladja a tárolókorlátot
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) meghaladja a tárolókorlátot (12 GB). Ez a helyzet a Kerülje a rendelkezésre álló memóriánál magasabb memóriakorlátok beállítását című részben ismertetett OOM-állapotokhoz vezet.
Ajánlott: konténerkorlát ráhagyással az operációs rendszer számára
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
A tároló legfeljebb 12 GB (--memory 12g), és a SQL Server legfeljebb 10 GB (MSSQL_MEMORY_LIMIT_MB=10240) használatára van konfigurálva. A fennmaradó 2 GB (körülbelül 17 százalék) az operációs rendszer és más folyamatok számára biztosít fejteret.
A lapozóterületre vonatkozó szempontok
Ha a SQL Servert konténerben futtatja, engedélyezze a cserehelyet a gazdagép szintjén, hogy ezáltal megvédje az operációs rendszert és a nem SQL Server-folyamatokat. Konfigurálja azonban a SQL Server úgy, hogy a konfigurált memóriakorláton belül működjön, és a normál működés során ne támaszkodjon a felcserélésre.
Kövesse a memóriakorlátra vonatkozó irányelveket annak biztosításához, hogy SQL Server a fizikai memóriában vagy a vonatkozó
cgroupmemóriakorláton belül működjön.Ha a swap engedélyezve van, azt a gazdagépen jelentkező átmeneti memórianyomás biztonsági tartalékaként kezelje, ne pedig az állandósult SQL Server-munkaterhelések kapacitásaként.
Important
SQL Server teljesítmény jelentősen csökkenhet, ha a memóriaterhelés felcserélést okoz. A memóriahasználati hibák megelőzésének elsődleges mechanizmusa a megfelelő memóriaméretezés.