Sdílet prostřednictvím


Průvodce architekturou správy paměti

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytický platformní systém (PDW)

Windows Virtual Memory Manager

Potvrzené oblasti adresního prostoru jsou mapovány na dostupnou fyzickou paměť nástrojem Windows Virtual Memory Manager (VMM).

Další informace o množství fyzické paměti podporované různými operačními systémy naleznete v dokumentaci k systému Windows o omezení paměti pro vydání systému Windows.

Virtuální paměťové systémy umožňují přetěžování fyzické paměti, aby poměr virtuální paměti k fyzické paměti mohl překročit 1:1. V důsledku toho můžou větší programy běžet na počítačích s různými konfiguracemi fyzické paměti. Použití výrazně větší virtuální paměti než kombinované průměrné pracovní sady všech procesů však může způsobit nízký výkon.

Architektura paměti SQL Serveru

SQL Server dynamicky získává a podle potřeby uvolní paměť. Správce obvykle nemusí určovat, kolik paměti by mělo být přiděleno SQL Serveru, i když tato možnost stále existuje a je vyžadována v některých prostředích.

Jedním z primárních cílů návrhu veškerého databázového softwaru je minimalizace vstupně-výstupních operací disku, protože čtení a zápisy disků patří mezi nejvýraznější operace náročné na prostředky. SQL Server vytvoří vyrovnávací paměť v paměti pro ukládání stránek načtených z databáze. Většina kódu v SQL Serveru je vyhrazena pro minimalizaci počtu fyzických čtení a zápisů mezi diskem a fondem vyrovnávací paměti. SQL Server se snaží dosáhnout rovnováhy mezi dvěma cíli:

  • Zabraňte tomu, aby se fond vyrovnávací paměti zvětšil natolik, že by celý systém měl nedostatek paměti.
  • Minimalizujte fyzické vstupně-výstupní operace do databázových souborů maximalizací velikosti fondu vyrovnávací paměti.

V systému s velkým zatížením některé velké dotazy, které vyžadují velké množství paměti ke spuštění, nemůžou získat minimální množství požadované paměti a při čekání na paměťové prostředky obdrží chybu časového limitu. Pokud chcete tento problém vyřešit, zvyšte možnost čekání dotazu. U paralelního dotazu zvažte snížení maximálního stupně paralelismu.

V silně zatíženém systému pod zatížením paměti můžou dotazy s sloučením spojení, řazením a rastrovým obrázkem v plánu dotazu vyřadit rastrový obrázek, pokud dotazy nezískají minimální požadovanou paměť pro rastrový obrázek. To může ovlivnit výkon dotazů, a pokud se proces řazení nevejde do paměti, může zvýšit využívání pracovních tabulek v databázi tempdb, což způsobuje zvětšení tempdb. Pokud chcete tento problém vyřešit, přidejte fyzickou paměť nebo vylaďte dotazy tak, aby používaly jiný a rychlejší plán dotazů.

Konvenční (virtuální) paměť

Všechny edice SQL Serveru podporují konvenční paměť na 64bitové platformě. Proces SQL Serveru má přístup k virtuálnímu adresnímu prostoru až do maximální velikosti povolené operačním systémem na architektuře x64 (SQL Server Standard Edition podporuje až 128 GB). U architektury IA64 byl limit 7 TB (IA64 se nepodporuje v SQL Serveru 2012 (11.x) a novějších verzích. Další informace najdete v tématu Omezení paměti pro Windows .

Adresovat paměť rozšíření Windows (AWE)

Pomocí rozšíření adresního okna (Address Windowing Extensions, AWE) a privilegia Uzamknout stránky v paměti (LPIM), které AWE vyžaduje, můžete udržet většinu paměti procesu SQL Serveru uzamčenou ve fyzické paměti RAM při nízkých podmínkách virtuální paměti. K tomu dochází u 32bitové i 64bitové alokace AWE. K zamykání paměti dochází, protože paměť AWE neprochází nástrojem Virtual Memory Manager ve Windows, který řídí stránkování paměti. Rozhraní API pro přidělování paměti AWE vyžaduje oprávnění Uzamknout stránky v paměti (SeLockMemoryPrivilege). Viz Poznámky k funkci AllocateUserPhysicalPages. Hlavní výhodou použití rozhraní AWE API je proto zachovat většinu paměti v paměti RAM, pokud systém zatěžuje paměť. Pro informace o tom, jak umožnit SQL Serveru využívat AWE, viz téma Povolení možnosti uzamčení stránek v paměti (Windows).

Pokud je LPIM udělena, důrazně doporučujeme nastavit maximální paměť serveru (MB) na konkrétní hodnotu, a ne ponechat výchozí hodnotu 2 147 483 647 megabajtů (MB). Další informace naleznete v tématu Konfigurace serverového paměťového serveru: Nastavení možností ručně a Zamknout stránky v paměti (LPIM).

Pokud není protokol LPIM povolený, SQL Server přepne na používání konvenční paměti a v případě vyčerpání paměti operačního systému a v protokolu chyb může být hlášena chyba [MSSQLSERVER_17890] (errors-events/mssqlserver-17890-database-engine-error.md). Chyba se podobá následujícímu příkladu:

A significant part of SQL Server process memory has been paged out. This may result in a performance degradation. Duration: #### seconds. Working set (KB): ####, committed (KB): ####, memory utilization: ##%.

Změny správy paměti od SQL Serveru 2012

Ve starších verzích SQL Serveru bylo přidělení paměti provedeno pomocí pěti různých mechanismů:

  • Single-Page alokátoru (SPA), zahrnující pouze ty přidělení paměti, které byly menší nebo rovny 8 kB v procesu SQL Serveru. Možnosti konfigurace maximální paměti serveru (MB) a minimální paměti serveru (MB) určují limity fyzické paměti spotřebované spa. Fond vyrovnávacích pamětí byl současně mechanismem pro správu paměti typu SPA a největším spotřebitelem při přiřazování jednotlivých stránek.
  • Multi-Page Allocator (MPA) pro přidělení paměti, které požadují více než 8 kB.
  • CLR Allocator, včetně hald SQL CLR a jejich globálních přidělení, vytvořených během inicializace CLR.
  • Přidělení paměti pro zásobníky vláken v procesu SQL Serveru.
  • Přímé přidělení systému Windows (DWA) pro žádosti o přidělení paměti provedené přímo pro systém Windows. Patří sem využití haldy Windows a přímé virtuální alokace provedené moduly načtenými do procesu SQL Serveru. Mezi příklady takových požadavků na přidělení paměti patří přidělení z rozšířených uložených procedur knihoven DLL, objektů vytvořených pomocí procedur automatizace (sp_OA volání) a přidělení od poskytovatelů propojených serverů.

Počínaje SQL Serverem 2012 (11.x), přidělování Single-Page, přidělování více stránek a přidělování CLR jsou všechny sloučeny do alokátoru stránek "Jakákoli velikost" a jsou zahrnuty do omezení paměti, které jsou řízeny možnostmi konfigurace maximální paměť serveru (MB) a minimální paměť serveru (MB). Tato změna poskytuje přesnější možnost určení velikosti pro všechny požadavky na paměť, které procházejí správcem paměti SYSTÉMU SQL Server.

Důležité

Pečlivě zkontrolujte aktuální konfiguraci maximální paměti serveru (MB) a minimální paměti serveru (MB) po upgradu na SQL Server 2012 (11.x) a novější verze. Důvodem je to, že počínaje SQL Serverem 2012 (11.x) tyto konfigurace nyní zahrnují a zohledňují větší množství přidělené paměti v porovnání s dřívějšími verzemi. Tyto změny platí pro 32bitové i 64bitové verze SQL Serveru 2012 (11.x) a SQL Server 2014 (12.x) a 64bitové verze SQL Serveru 2016 (13.x) a novější.

Následující tabulka udává, jestli je určitý typ přidělení paměti řízen maximální velikostí paměti serveru (MB) a minimálními možnostmi konfigurace paměti serveru (MB ):

Typ přidělení paměti SQL Server 2005 (9.x), SQL Server 2008 (10.0.x) a SQL Server 2008 R2 (10.50.x) Počínaje SQL Serverem 2012 (11.x)
Přidělení jedné stránky Ano Ano, konsolidováno do přidělení stránek jakékoli velikosti
Přidělení více stránek Ne Ano, konsolidováno do přidělení stránek jakékoli velikosti
Alokace CLR Ne Ano
Zásobníky paměti vláken Ne Ne
Přímé přidělení z Windows Ne Ne

SQL Server může alokovat paměť více než je nastavená maximální paměť serveru.

Od verze SQL Server 2012 (11.x) může SQL Server přidělit více paměti, než je hodnota zadaná v nastavení maximální paměti serveru (MB). K tomuto chování může dojít, když hodnota Celková paměť serveru (KB) již dosáhla nastavení Paměť cílového serveru (KB), jak je určeno maximální pamětí serveru (MB). Pokud kvůli fragmentaci paměti není dostatek souvislé volné paměti pro splnění poptávky požadavků na vícestráňovou paměť (více než 8 kB), sql Server může místo odmítnutí požadavku na paměť provádět nadměrné závazky.

Jakmile se toto přidělení provede, úloha sledování prostředků na pozadí začne signalizovat všechny příjemce paměti k uvolnění přidělené paměti a pokusí se přenést hodnotu Total Server Memory (KB) pod specifikaci Paměti cílového serveru (KB). Proto může využití paměti SQL Serveru krátce překročit nastavení maximální paměti serveru (MB). V takovém případě čtení čítače výkonu celkové paměti serveru (KB) překračuje nastavení maximální paměti serveru (MB) a paměti cílového serveru (kB).

Toto chování se obvykle pozoruje během následujících operací:

  • Velké dotazy indexu columnstore
  • Velký dávkový režim u dotazů rowstore
  • Sestavování a přebudování indexů Columnstore, která k vykonávání operací hash a řazení používají velké objemy paměti.
  • Operace zálohování, které vyžadují velké vyrovnávací paměti
  • Trasovací operace, které musí ukládat velké vstupní parametry
  • Žádosti o velké přidělení paměti

Pokud toto chování sledujete často, zvažte použití trasovacího příznaku 8121 v SQL Serveru 2019 (15.x), abyste umožnili Monitoru prostředků rychleji se vyčistit. Počínaje SQL Serverem 2022 (16.x) je tato funkce ve výchozím nastavení povolená a příznak trasování nemá žádný vliv.

Změny v parametru memory_to_reserve počínaje verzí SQL Server 2012

Ve starších verzích SQL Serveru správce paměti SQL Serveru vyhradil část procesního virtuálního adresního prostoru (VAS) pro použití Multi-Page Alokátoru (MPA),CLR Allocator, přidělení paměti pro zásobníky vláken, v procesu SQL Serveru a přímé alokace Windows (DWA). Tato část virtuálního adresního prostoru se také označuje jako oblast Mem-To-Leave nebo "Non-Buffer Pool".

Virtuální adresní prostor vyhrazený pro tyto přidělení je určen možností konfigurace memory_to_reserve . Výchozí hodnota, kterou SQL Server používá, je 256 MB.

Vzhledem k tomu, že alokátor stránek pro "libovolnou velikost" zpracovává alokace větší než 8 kB, memory_to_reserve neobsahuje alokace pro více stránek. Kromě této změny zůstane všechno ostatní u této možnosti konfigurace stejné.

Následující tabulka udává, jestli konkrétní typ přidělení paměti spadá do memory_to_reserve oblasti virtuálního adresního prostoru pro proces SQL Serveru:

Typ přidělení paměti SQL Server 2005 (9.x), SQL Server 2008 (10.0.x) a SQL Server 2008 R2 (10.50.x) Počínaje SQL Serverem 2012 (11.x)
Přidělení jedné stránky Ne Ne, konsolidovaný do přidělení stránek libovolné velikosti
Přidělení více stránek Ano Ne, konsolidovaný do přidělení stránek libovolné velikosti
Alokace CLR Ano Ano
Zásobníky paměti vláken Ano Ano
Přímé přidělení z Windows Ano Ano

Dynamická správa paměti

Výchozí chování správy paměti databázového stroje SQL Serveru je získat tolik paměti, kolik potřebuje, aniž by v systému vznikl nedostatek paměti. Databázový stroj SQL Serveru to dělá pomocí rozhraní API pro oznámení paměti v systému Microsoft Windows.

Když SQL Server používá paměť dynamicky, pravidelně dotazuje systém, aby určil množství volné paměti. Udržování této volné paměti pomáhá zabránit stránkování operačního systému (OS). Pokud není paměť volná, SQL Server uvolní paměť do operačního systému. Pokud je volné více paměti, SQL Server může přidělit více paměti. SQL Server přidává paměť pouze v případech, kdy úloha vyžaduje více paměti; nečinný server nezvětší velikost virtuálního adresního prostoru. Pokud si všimnete, že Správce úloh a monitorování výkonu zobrazují stabilní pokles dostupné paměti, když SQL Server používá dynamickou správu paměti, jedná se o výchozí chování a nemělo by se považovat za nevrácenou paměť.

Možnosti konfigurace paměti serveru řídí přidělení paměti SQL Serveru, kompilační paměť, všechny mezipaměti (včetně fondu vyrovnávací paměti), udělení paměti spouštění dotazů, paměť správce zámků a paměť CLR1 (v podstatě všechny pracovníky paměti nalezené v sys.dm_os_memory_clerks).

1 paměť CLR se spravuje v rámci přidělení max_server_memory počínaje SQL Serverem 2012 (11.x).

Následující dotaz vrátí informace o aktuálně přidělené paměti:

SELECT physical_memory_in_use_kb / 1024 AS sql_physical_memory_in_use_MB,
       large_page_allocations_kb / 1024 AS sql_large_page_allocations_MB,
       locked_page_allocations_kb / 1024 AS sql_locked_page_allocations_MB,
       virtual_address_space_reserved_kb / 1024 AS sql_VAS_reserved_MB,
       virtual_address_space_committed_kb / 1024 AS sql_VAS_committed_MB,
       virtual_address_space_available_kb / 1024 AS sql_VAS_available_MB,
       page_fault_count AS sql_page_fault_count,
       memory_utilization_percentage AS sql_memory_utilization_percentage,
       process_physical_memory_low AS sql_process_physical_memory_low,
       process_virtual_memory_low AS sql_process_virtual_memory_low
FROM sys.dm_os_process_memory;

Velikosti zásobníků

Paměť pro zásobníky vláken 1, CLR 2, rozšířené procedury .dll soubory, zprostředkovatelé OLE DB odkazované distribuovanými dotazy, automatizační objekty odkazované v příkazech Transact-SQL a veškerá paměť přidělená knihovnou DLL jiného než SQL Serveru, nejsou řízeny maximální pamětí serveru (MB).

1 V článku o konfiguraci maximálního počtu pracovních vláken (možnost konfigurace serveru) najdete informace o počítaných výchozích pracovních vláknech pro daný počet spřažení procesorů v aktuálním hostiteli. Velikosti zásobníku SQL Serveru jsou následující:

Architektura SQL Serveru Architektura operačního systému Velikost zásobníku
x86 (32bitová verze) x86 (32bitová verze) 512 kB
x86 (32bitová verze) x64 (64bitová verze) 768 kB
x64 (64bitová verze) x64 (64bitová verze) 2 048 KB
IA64 (Itanium) IA64 (Itanium) 4 096 KB

2 Paměť CLR se spravuje v rámci přidělení max_server_memory počínaje SQL Serverem 2012 (11.x).

SQL Server používá rozhraní API pro oznámení paměti QueryMemoryResourceNotification k určení, kdy správce paměti SYSTÉMU SQL Server může přidělit paměť a uvolnit paměť.

Při spuštění SQL Serveru vypočítá velikost virtuálního adresního prostoru fondu vyrovnávací paměti na základě několika parametrů, jako je množství fyzické paměti v systému, počet vláken serveru a různé spouštěcí parametry. SQL Server si rezervuje vypočítané množství virtuálního adresního prostoru procesu pro fond vyrovnávací paměti, ale získá (potvrzení) pouze požadované množství fyzické paměti pro aktuální zatížení.

Instance pak bude dál získávat paměť podle potřeby, aby podporovala úlohu. S tím, jak se více uživatelů připojuje a spouští dotazy, SQL Server získává na vyžádání více fyzické paměti. Instance SQL Serveru nadále získává fyzickou paměť, dokud nedosáhne svého cílového limitu maximální paměti serveru (MB), nebo dokud operační systém nenaznačuje, že již není dostatek volné paměti; uvolňuje paměť, když přesahuje nastavení minimální paměti serveru, a operační systém indikuje, že je nedostatek volné paměti.

S tím, jak se na počítači, na kterém běží instance SQL Serveru, spouští jiné aplikace, spotřebovávají paměť a množství volné fyzické paměti klesne pod cíl SQL Serveru. Instance SQL Serveru upravuje spotřebu paměti. Pokud je zastavena jiná aplikace a bude k dispozici více paměti, instance SQL Serveru zvýší velikost přidělení paměti. SQL Server může každou sekundu uvolnit a získat několik megabajtů paměti, což mu umožní rychle upravit změny přidělení paměti.

Účinky minimální a maximální paměti serveru

Možnosti konfigurace minimální paměti serveru a maximální paměti serveru určují horní a dolní limity množství paměti používané vyrovnávací pamětí a dalšími mezipaměťmi databázového stroje. Fond vyrovnávací paměti okamžitě nezíská množství paměti zadané v minimální paměti serveru. Fond vyrovnávací paměti začíná pouze pamětí potřebnou k inicializaci. S rostoucím nárůstem úloh databázového stroje SQL Serveru stále získává paměť potřebnou k podpoře úlohy. Vyrovnávací paměť neuvolní žádnou ze získaných pamětí, dokud nedosáhne množství zadaného v minimální paměti serveru. Jakmile dosáhnete minimální paměti serveru, fond vyrovnávací paměti pak použije standardní algoritmus k získání a uvolnění paměti podle potřeby. Jediným rozdílem je, že fond vyrovnávací paměti nikdy neupadá pod úroveň uvedenou v minimální paměti serveru a nikdy nezíská více paměti než úroveň zadaná v maximální paměti serveru (MB).

Poznámka:

SQL Server jako proces získává více paměti, než určuje možnost maximální paměti serveru (MB). Interní i externí komponenty mohou přidělit paměť mimo fond vyrovnávací paměti, která spotřebovává další paměť, ale paměť přidělená fondu vyrovnávací paměti obvykle stále představuje největší část paměti spotřebovanou SQL Serverem.

Množství paměti získané databázovým strojem SQL Serveru je zcela závislé na úloze umístěné v instanci. Instance SQL Serveru, která nezpracovává mnoho požadavků, nemusí nikdy dosáhnout hodnoty určené minimální pamětí serveru.

Pokud je pro minimální paměť serveru i maximální paměť serveru zadaná stejná hodnota (MB), jakmile paměť přidělená databázovému stroji SQL Serveru dosáhne této hodnoty, databázový stroj SQL Serveru přestane dynamicky uvolnit a získat paměť pro fond vyrovnávací paměti.

Pokud je instance SQL Serveru spuštěná v počítači, kde jsou často zastaveny nebo spuštěny jiné aplikace, přidělení a uvolnění paměti instancí SQL Serveru může zpomalit dobu spouštění jiných aplikací. Pokud je SQL Server jednou z několika serverových aplikací spuštěných na jednom počítači, měli by správci systému řídit množství paměti přidělené SQL Serveru. V těchto případech můžete pomocí možností minimální paměti serveru a maximální paměti serveru (MB) řídit, kolik paměti může SQL Server používat. Minimální paměť serveru a maximální velikost paměti serveru jsou zadané v megabajtech. Další informace, včetně doporučení k nastavení těchto konfigurací paměti, naleznete v tématu Možnosti konfigurace paměti serveru.

Specifikace paměti používané specifikacemi objektů SQL Serveru

Následující seznam popisuje přibližné množství paměti používané různými objekty v SQL Serveru. Uvedené částky jsou odhady a můžou se lišit v závislosti na prostředí a způsobu vytváření objektů:

  • Zámek (udržovaný správcem zámku): 64 bajtů + 32 bajtů na vlastníka
  • Připojení uživatele: Přibližně (3 * network_packet_size + 94 kB)

Velikost síťového paketu je velikost tabulkových paketů datového proudu (TDS), které se používají ke komunikaci mezi aplikacemi a databázovým strojem. Výchozí velikost paketu je 4 kB a řídí se konfigurací velikosti síťových paketů.

Pokud je povoleno více aktivních sad výsledků (MARS), je uživatelské připojení přibližně (3 + 3 * num_logical_connections) * network_packet_size + 94 kB.

Účinky minimální paměti na dotaz

Minimální paměť na dotaz určuje minimální velikost paměti (v kilobajtech), která bude přidělena pro provedení dotazu. Označuje se také jako udělení minimální paměti. Všechny dotazy musí čekat, dokud nebude možné zabezpečit minimální požadovanou paměť, než může začít provádění, nebo až do překročení hodnoty zadané v konfigurační možnosti serveru čekání dotazů. Typ čekání, který se v tomto scénáři nahromáždí, je RESOURCE_SEMAPHORE.

Důležité

Nenastavujte minimální paměť na dotaz v konfiguraci serveru příliš vysoko, zejména u velmi zaneprázdněných systémů, protože by to mohlo vést k následujícím problémům:

  • Zvýšená konkurence pro paměťové prostředky.
  • Snížení souběžnosti zvýšením množství paměti pro každý jeden dotaz, i když je požadovaná paměť za běhu nižší než tato konfigurace.

Doporučení k použití této konfigurace najdete v tématu Konfigurace minimální paměti na dotaz v možnostech konfigurace serveru.

Úvahy o přidělení paměti

V případě spuštění režimu řádku není možné za žádné podmínky překročit počáteční udělení paměti. Pokud k provádění operací hash nebo řazení potřebujete více paměti, než je počáteční udělení, operace přetéknou na disk. Operace hash, která přetéká, je podporována pracovním souborem tempdb, zatímco operace řazení, která přetéká, je podporována pracovní tabulkou.

Přelití, ke kterému dochází během operace Řazení, se označuje jako třída událostí Sort Warnings. Upozornění řazení označují, že operace řazení nevlezou do paměti. Nezahrnuje operace řazení, které zahrnují vytváření indexů, zahrnuje pouze operace řazení v rámci dotazu (například klauzule ORDER BY použitá v příkazu SELECT).

Přelití, ke kterému dochází během operace hash, je známo jako třída události výstrahy hash. K těmto událostem dochází, když během operace hašování dojde k rekurzi nebo ukončení hašování.

  • K rekurzi hash dochází, když se vstup sestavení nevejde do dostupné paměti, což vede k rozdělení vstupu na více partice, které se zpracovávají samostatně. Pokud se některý z těchto oddílů stále nevejde do dostupné paměti, rozdělí se do dílčích částí, které se také zpracovávají samostatně. Tento proces rozdělení pokračuje, dokud se každý oddíl nevejde do dostupné paměti nebo dokud nedosáhne maximální úrovně rekurze.
  • K hashovému úniku dochází, když operace hash dosáhne maximální úrovně rekurze a přesune se k alternativnímu plánu pro zpracování zbývajících rozdělených dat. Tyto události můžou způsobit snížení výkonu vašeho serveru.

Pro provádění v dávkovém režimu se počáteční udělení paměti může dynamicky zvýšit až na určitou vnitřní prahovou hodnotu, ve výchozím nastavení. Tento mechanismus udělení dynamické paměti je navržený tak, aby umožňoval provádění operací hash nebo řazení přímo v paměti a v batch módu. Pokud se tyto operace stále nevejdou do paměti, operace se přelinou na disk.

Další informace o režimech provádění najdete v průvodci architekturou zpracování dotazů.

Správa vyrovnávací paměti

Primárním účelem databáze SQL Serveru je ukládat a načítat data, takže vstupně-výstupní operace disku s intenzivním výkonem představují základní charakteristiku databázového stroje. A protože vstupně-výstupní operace disku můžou spotřebovávat mnoho prostředků a dokončení trvá poměrně dlouho, SQL Server se zaměřuje na to, aby vstupně-výstupní operace byly vysoce efektivní. Správa vyrovnávací paměti je klíčovou komponentou pro dosažení této efektivity. Komponenta správy vyrovnávací paměti se skládá ze dvou mechanismů: správce vyrovnávací paměti pro přístup ke stránkám databáze a aktualizace databázových stránek a mezipaměti vyrovnávací paměti (označované také jako fond vyrovnávací paměti), aby se snížil počet vstupně-výstupních operací souboru databáze.

Podrobné vysvětlení vstupně-výstupních operací disku v SQL Serveru najdete v tématu Základy vstupně-výstupních operací SQL Serveru.

Jak funguje správa vyrovnávací paměti

Vyrovnávací paměť je 8 KB stránka v paměti, která má stejnou velikost jako datová nebo indexová stránka. Mezipaměť vyrovnávací paměti je proto rozdělena na stránky o velikosti 8 KB. Správce vyrovnávací paměti spravuje funkce pro čtení dat nebo indexových stránek ze souborů databázových disků do mezipaměti vyrovnávací paměti a zápis upravených stránek zpět na disk. Stránka zůstane v mezipaměti vyrovnávací paměti, dokud správce vyrovnávací paměti nepotřebuje vyrovnávací oblast pro čtení dalších dat. Data se zapisuje zpět na disk jenom v případě, že jsou upravená. Data v mezipaměti vyrovnávací paměti lze před zápisem zpět na disk upravit vícekrát. Další informace najdete v Čtení stránek a Psání stránek.

Při spuštění SQL Serveru vypočítá velikost virtuálního adresního prostoru pro mezipaměť vyrovnávací paměti na základě několika parametrů, jako je množství fyzické paměti v systému, nakonfigurovaný počet maximálních vláken serveru a různé spouštěcí parametry. SQL Server si pro mezipaměť vyrovnávací paměti rezervuje toto vypočítané množství virtuálního adresního prostoru procesu (označovaného jako cíl paměti), ale získá (potvrzení) pouze požadované množství fyzické paměti pro aktuální zatížení. Můžete dotazovat na sloupce committed_target_kb a committed_kb v zobrazení katalogu sys.dm_os_sys_info, které vrátí počet stránek rezervovaných jako paměťový cíl a počet stránek aktuálně potvrzených ve vyrovnávací paměti.

Interval mezi spuštěním SQL Serveru a tím, kdy vyrovnávací paměť dosáhne svého cíle paměti, se nazývá náběh. Během této doby čtecí požadavky zaplnují vyrovnávací paměti podle potřeby. Například požadavek na čtení jedné stránky o velikosti 8 kB vyplní jednu bufferovou stránku. To znamená, že rozšíření závisí na počtu a typu požadavků klientů. Zrychlení je dosaženo transformací požadavků na čtení jedné stránky na zarovnané požadavky na osm stránek (které tvoří jeden rozsah). Tímto se fáze rozšíření dokončí mnohem rychleji, zejména na počítačích s velkým množstvím paměti. Další informace o stránkách a rozsahech naleznete v Průvodci architekturou stránek a rozsahů.

Vzhledem k tomu, že správce vyrovnávací paměti používá většinu paměti v procesu SQL Serveru, spolupracuje se správcem paměti, aby ostatní komponenty mohly používat své vyrovnávací paměti. Správce vyrovnávací paměti komunikuje primárně s následujícími komponentami:

  • Resource Manager pro řízení celkového využití paměti a v 32bitových platformách za účelem řízení využití adresního prostoru.
  • Správce databáze a operační systém SQL Serveru (SQLOS) pro vstupně-výstupní operace se soubory nízké úrovně.
  • Log Manager pro záznamy před zápisem.

Podporované funkce

Správce vyrovnávací paměti podporuje následující funkce:

  • Správce vyrovnávací paměti je si vědom neuniformního přístupu k paměti (NUMA). Stránky mezipaměti jsou distribuovány mezi hardwarové uzly NUMA, což umožňuje vláknu získat přístup ke stránce mezipaměti, která je alokovaná na místním uzlu NUMA, spíše než z cizí paměti.

  • Správce vyrovnávací paměti podporuje Hot Add Memory, což umožňuje uživatelům přidat fyzickou paměť bez restartování serveru.

  • Správce vyrovnávací paměti podporuje velké stránky na 64bitových platformách. Velikost stránky je specifická pro verzi Windows.

    Poznámka:

    Před SQL Serverem 2012 (11.x) bylo k povolení velkých stránek v SQL Serveru potřeba použít příznak trasování 834.

  • Správce vyrovnávací paměti poskytuje dodatečnou diagnostiku, která je zpřístupněna prostřednictvím dynamických přehledů správy. Tato zobrazení můžete použít k monitorování různých prostředků operačního systému, které jsou specifické pro SQL Server. Například můžete použít zobrazení sys.dm_os_buffer_descriptors ke sledování stránek v mezipaměti.

Detekce tlaku paměti

Zatížení paměti je stav způsobený nedostatkem paměti a může vést k:

  • Nadbytečné vstupně-výstupní operace (například velmi aktivní vlákno líného zapisovače v pozadí)
  • Vyšší poměr rekompilu
  • Delší spouštění dotazů (pokud existují čekání na udělení paměti)
  • Další cykly procesoru

Tuto situaci můžou aktivovat externí nebo interní příčiny. Mezi externí příčiny patří:

  • Dostupná fyzická paměť (RAM) je nízká. Systém tím ořízne pracovní sady procesů, které jsou aktuálně spuštěny, což může vést k celkovému zpomalení. SQL Server může snížit cílovou hodnotu potvrzování fondu vyrovnávací paměti a zahájit častější zmenšování interních mezipamětí.
  • Celková dostupná systémová paměť (která zahrnuje systémový stránkový soubor) je nízká. To může způsobit selhání při přidělování paměti v systému, protože nemůže uvolnit aktuálně přidělenou paměť na disk.

Mezi interní příčiny patří:

  • Reakce na zatížení externí paměti, když databázový stroj SQL Serveru nastaví nižší limit využití paměti.
  • Nastavení paměti se ručně snížilo snížením maximální konfigurace paměti serveru .
  • Změny rozdělení paměti interních komponent mezi několik mezipamětí

Databázový stroj SQL Serveru implementuje architekturu vyhrazenou pro detekci a zpracování zatížení paměti v rámci správy dynamické paměti. Tato architektura zahrnuje úlohu na pozadí s názvem Monitorování prostředků. Úloha Monitorování zdrojů monitoruje stav externích a interních indikátorů paměti. Jakmile některý z těchto indikátorů změní stav, vypočítá odpovídající oznámení a vysílá ho. Tato oznámení jsou interní zprávy z každé součásti motoru a ukládají se do kruhových vyrovnávacích pamětí.

Dvě kruhové vyrovnávací paměti uchovávají informace relevantní pro správu dynamické paměti.

  • Prstencová vyrovnávací paměť Monitorování prostředků, která monitoruje aktivitu Monitorování prostředků, zda bylo signalizováno zatížení paměti nebo ne. Tento kruhový buffer obsahuje informace o stavu v závislosti na aktuální podmínce RESOURCE_MEMPHYSICAL_HIGH, RESOURCE_MEMPHYSICAL_LOW, RESOURCE_MEMPHYSICAL_STEADY, nebo RESOURCE_MEMVIRTUAL_LOW.
  • Kruhový vyrovnávací buffer zprostředkovatele paměti, který obsahuje záznamy oznámení o paměti pro každý fond zdrojů ve Správci prostředků. Při zjištění interního zatížení paměti je pro komponenty, které přidělují paměť, zapnuto oznámení o nedostatku paměti, aby se aktivovaly akce, které mají vyrovnávat paměť mezi mezipamětí.

Zprostředkovatelé paměti monitorují spotřebu paměti každou komponentou a pak na základě shromážděných informací vypočítá a optimální hodnotu paměti pro každou z těchto komponent. Pro každý fond prostředků Správce prostředků existuje sada brokerů. Tyto informace se pak vysílají do jednotlivých součástí, které podle potřeby zvětší nebo zmenší jejich využití.

Další informace o zprostředkovatelích paměti najdete v tématu sys.dm_os_memory_brokers.

Detekce chyb

Databázové stránky můžou používat jeden ze dvou volitelných mechanismů, které pomáhají zajistit integritu stránky, od doby, kdy se zapisuje na disk, dokud se znovu nečte: ochrana stránky roztrhaná a ochrana kontrolního součtu. Tyto mechanismy umožňují nezávislou metodu ověření správnosti nejen úložiště dat, ale hardwarových komponent, jako jsou kontrolery, ovladače, kabely a dokonce i operační systém. Ochrana se na stránku přidá těsně před zápisem na disk a ověří se po načtení z disku.

SQL Server opakuje všechny chyby čtení, které selže s kontrolním součtem, stránkou roztrhané nebo jinou vstupně-výstupní chybou čtyřikrát. Pokud je čtení v některém z pokusů o opakování úspěšné, zaznamená se zpráva do protokolu chyb a příkaz, který čtení vyvolal, pokračuje. Pokud pokusy o opakování selžou, příkaz selže s chybou MSSQLSERVER_824 .

Použitý druh ochrany stránky je atributem databáze obsahující stránku. Ochrana kontrolního součtu je výchozí ochrana databází vytvořených v SYSTÉMU SQL Server 2005 (9.x) a novějších verzích. Mechanismus ochrany stránky je určen při vytváření databáze a lze jej změnit pomocí ALTER DATABASE SET. Aktuální nastavení ochrany stránky můžete určit dotazováním page_verify_option sloupce v zobrazení katalogu sys.databases nebo IsTornPageDetectionEnabled vlastností funkce DATABASEPROPERTYEX .

Poznámka:

Pokud se nastavení ochrany stránky změní, nové nastavení okamžitě neovlivní celou databázi. Místo toho stránky přijímají aktuální úroveň ochrany databáze při příštím zápisu. To znamená, že databáze se může skládat ze stránek s různými druhy ochrany.

Ochrana roztržené stránky

Ochrana proti roztržení stránky, která byla zavedena v SQL Serveru 2000 (8.x), je především metodou zjišťování poškození stránek kvůli selhání napájení. Například neočekávaná chyba napájení může ponechat jenom část stránky zapsané na disk. Při použití ochrany proti roztržení stránky se pro každý 512bajtový sektor na 8kilobajtové (KB) stránce databáze používá specifický 2bitový podpisový vzor, který je uložen v záhlaví stránky databáze při zápisu stránky na disk.

Při čtení stránky z disku se bity roztrhané v záhlaví stránky porovnávají se skutečnými informacemi o sektorech stránek. Vzor podpisu se střídá mezi binárním 01 a 10 s každým zápisem, takže je vždy možné zjistit, kdy se na disk dostala jen část sektorů: pokud je bit v nesprávném stavu při pozdějším čtení stránky, stránka byla zapsána nesprávně a byla detekována poškozená stránka. Detekce roztrhané stránky používá minimální prostředky; Nezjistí ale všechny chyby způsobené chybami hardwaru disku. Informace o nastavení detekce roztrhané stránky naleznete v tématu ALTER DATABASE SET Options (Transact-SQL).

Ochrana kontrolního součtu

Ochrana kontrolního součtu zavedená v SYSTÉMU SQL Server 2005 (9.x) poskytuje silnější kontrolu integrity dat. Kontrolní součet se vypočítá pro data na každé stránce, která je zapsána, a je uložen v záhlaví stránky. Při každém načtení stránky s uloženým kontrolním součtem z disku databázový stroj přepočítá kontrolní součet dat na stránce a vyvolá chybu 824, pokud se nový kontrolní součet liší od uloženého kontrolního součtu. Ochrana kontrolního součtu může zachytit více chyb než ochrana proti roztrhané stránce, protože je ovlivněna každým bajtem stránky, ale spotřebovává střední množství prostředků.

Pokud je kontrolní součet povolený, chyby způsobené selháním napájení a vadným hardwarem nebo firmwarem je možné zjistit kdykoli, když správce vyrovnávací paměti přečte stránku z disku. Informace o nastavení kontrolního součtu naleznete v tématu ALTER DATABASE SET Options (Transact-SQL).

Důležité

Při upgradu uživatelské nebo systémové databáze na SQL Server 2005 (9.x) nebo novější se zachová hodnota PAGE_VERIFY (NONE nebo TORN_PAGE_DETECTION). Důrazně doporučujeme používat CHECKSUM. TORN_PAGE_DETECTION může používat méně prostředků, ale poskytuje minimální podmnožinu CHECKSUM ochrany.

Vysvětlení ne uniformních přístupů k paměti

SQL Server je si vědom NUMA (není jednotný přístup k paměti) a dobře funguje na hardwaru NUMA bez nutnosti zvláštní konfigurace. S rostoucí rychlostí hodin a počtem procesorů je stále obtížnější snížit latenci paměti potřebnou k použití tohoto dodatečného výpočetního výkonu. Aby se to obešli, dodavatelé hardwaru poskytují velké mezipaměti L3, ale jedná se pouze o omezené řešení. Architektura NUMA poskytuje škálovatelné řešení tohoto problému.

SQL Server je navržený tak, aby využíval výhod počítačů založených na technologii NUMA, aniž by vyžadoval změny aplikací. Další informace najdete v tématu Soft-NUMA (SQL Server).

Dynamické rozdělení paměťových objektů

Alokátory haldy, označované jako paměťové objekty v SQL Serveru, umožňují databázovému enginu přidělit paměť z haldy. Můžete je sledovat pomocí zobrazení dynamické správy sys.dm_os_memory_objects .

CMemThread je typ objektu paměti bezpečného pro přístup z více vláken, který umožňuje souběžné přidělení paměti z více vláken. Pro správné sledování se objekty spoléhají na konstrukty synchronizace (mutex), aby se zajistilo, CMemThread že kritické části informací současně aktualizují pouze jedno vlákno.

Poznámka:

Typ CMemThread objektu se využívá v rámci základu kódu databázového stroje pro mnoho různých přidělení a lze ho globálně rozdělit podle uzlu nebo procesoru.

Použití mutexů však může vést k konfliktům, pokud mnoho vláken přiděluje ze stejného paměťového objektu velmi souběžným způsobem. Sql Server proto má koncept dělených paměťových objektů (PMO) a každý oddíl je reprezentován jedním CMemThread objektem. Dělení objektu paměti je staticky definováno a po vytvoření není možné ho změnit. Vzhledem k tomu, že vzorce přidělování paměti se značně liší na základě aspektů, jako je využití hardwaru a paměti, není možné předem přijít s dokonalým vzorem dělení.

Ve většině případů stačí použít jeden oddíl, ale v některých scénářích to může vést k kolizím, které lze zabránit pouze u objektu s vysoce dělenou pamětí. Není žádoucí rozdělit každý objekt paměti, protože více oddílů může vést k jiným nedostatkům a zvýšení fragmentace paměti.

Poznámka:

Před SQL Serverem 2016 (13.x) bylo možné použít příznak trasování 8048 k přinucení PMO založeného na uzlech, aby se stal PMO založeným na procesoru. Počínaje SQL Serverem 2014 (12.x) SP2 a SQL Serverem 2016 (13.x) je toto chování dynamické a řízené modulem.

Počínaje SQL Serverem 2014 (12.x) SP2 a SQL Serverem 2016 (13.x) může databázový stroj dynamicky zjišťovat konflikty u konkrétního CMemThread objektu a povýšit objekt na implementaci na základě každého uzlu nebo procesoru. Jakmile je PMO povýšeno, zůstane v povýšeném stavu, dokud se nenastartuje proces SQL Serveru. CMemThreadkolizí lze zjistit přítomností vysokých CMEMTHREAD čekání v sys.dm_os_wait_stats zobrazení dynamické správy a pozorováním sys.dm_os_memory_objects sloupců contention_factorDMV , , partition_typeexclusive_allocations_count, a waiting_tasks_count.