国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

SQLServer的內(nèi)存管理架構(gòu)詳解

瀏覽:107日期:2023-05-02 10:03:25
目錄
  • 一、Windows的虛擬內(nèi)存管理器
  • 二、SQL Server 內(nèi)存體系結(jié)構(gòu)
    • 2.1、傳統(tǒng)(虛擬)內(nèi)存
    • 2.2、地址窗口擴(kuò)展 (AWE) 內(nèi)存
  • 三、從 SQL Server 2012 (11.x) 開始發(fā)生的改變
    • 3.1、對內(nèi)存管理的更改
    • 3.2、對memory_to_reserve所做的更改
  • 四、動態(tài)內(nèi)存管理
    • 4.1、堆棧大小
  • 五、緩沖區(qū)管理
    • 5.1、緩沖區(qū)管理的工作原理
    • 5.2、支持的功能
    • 5.3、磁盤 I/O
    • 5.4、長 I/O 請求
    • 5.5、長時(shí)間 I/O 請求的原因
  • 六、了解非一致性內(nèi)存訪問

    一、Windows的虛擬內(nèi)存管理器

    地址空間的已提交區(qū)域由 Windows 虛擬內(nèi)存管理器 (VMM) 映射到可用的物理內(nèi)存。

    虛擬內(nèi)存系統(tǒng)允許物理內(nèi)存的過度使用,因此虛擬內(nèi)存與物理內(nèi)存的比率可以超過 1:1。因此,較大的程序可以在具有各種物理內(nèi)存配置的計(jì)算機(jī)上運(yùn)行。但是,使用比所有進(jìn)程的總平均工作集多得多的虛擬內(nèi)存可能會導(dǎo)致性能不佳。

    二、SQL Server 內(nèi)存體系結(jié)構(gòu)

    SQL Server 根據(jù)需要?jiǎng)討B(tài)獲取和釋放內(nèi)存。通常,管理員不必指定應(yīng)分配給 SQL Server 的內(nèi)存量,盡管該選項(xiàng)仍然存在并且在某些環(huán)境中是必需的。

    所有數(shù)據(jù)庫軟件的主要設(shè)計(jì)目標(biāo)之一是最小化磁盤 I/O,因?yàn)榇疟P讀取和寫入是最耗費(fèi)資源的操作之一。SQL Server 在內(nèi)存中構(gòu)建一個(gè)緩沖池,以保存從數(shù)據(jù)庫中讀取的頁。SQL Server 中的許多代碼專用于最大程度地減少磁盤和緩沖池之間的物理讀取和寫入次數(shù)。SQL Server 試圖在兩個(gè)目標(biāo)之間取得平衡:

    • 防止緩沖池變得太大,以致整個(gè)系統(tǒng)內(nèi)存不足。
    • 通過最大化緩沖池的大小,最大限度地減少數(shù)據(jù)庫文件的物理 I/O。

    在負(fù)載較重的系統(tǒng)中,某些需要大量內(nèi)存才能運(yùn)行的大型查詢無法獲取請求的最小內(nèi)存量,并在等待內(nèi)存資源時(shí)收到超時(shí)錯(cuò)誤。若要解決此問題,請?jiān)黾硬樵兊却x項(xiàng)。對于并行查詢,請考慮降低最大并行度選項(xiàng)。

    在內(nèi)存壓力很大的系統(tǒng)中,當(dāng)查詢未獲得位圖所需的最小內(nèi)存時(shí),查詢計(jì)劃中具有合并聯(lián)接、排序和位圖的查詢可能會刪除位圖。這可能會影響查詢性能,如果排序過程無法容納在內(nèi)存中,則可能會增加數(shù)據(jù)庫中工作表的使用量,從而導(dǎo)致增長。若要解決此問題,請?zhí)砑游锢韮?nèi)存,或調(diào)整查詢以使用不同的更快查詢計(jì)劃。

    2.1、傳統(tǒng)(虛擬)內(nèi)存

    所有 SQL Server 版本都支持 64 位平臺上的傳統(tǒng)內(nèi)存。SQL Server 進(jìn)程可以訪問虛擬地址空間,最高可達(dá) x64 體系結(jié)構(gòu)上的操作系統(tǒng)最大值(SQL Server 標(biāo)準(zhǔn)版最多支持 128 GB)。對于 IA64 體系結(jié)構(gòu),限制為 7 TB(SQL Server 64 (2012.x) 及更高版本不支持 IA11)。

    2.2、地址窗口擴(kuò)展 (AWE) 內(nèi)存

    通過使用地址窗口化擴(kuò)展插件 (AWE) 和 AWE 所需的內(nèi)存中鎖定頁 (LPIM) 特權(quán),可以在低虛擬內(nèi)存條件下將大部分 SQL Server 進(jìn)程內(nèi)存鎖定在物理 RAM 中。這在 32 位和 64 位 AWE 分配中都會發(fā)生。發(fā)生內(nèi)存鎖定的原因是 AWE 內(nèi)存不通過 Windows 中的虛擬內(nèi)存管理器,該管理器控制內(nèi)存分頁。AWE 內(nèi)存分配 API 需要“鎖定內(nèi)存中的頁”(SeLockMemoryPrivilege) 權(quán)限。因此,使用 AWE API 的主要好處是在系統(tǒng)上存在內(nèi)存壓力時(shí)將大部分內(nèi)存駐留在 RAM 中。

    如果授予 LPIM,我們強(qiáng)烈建議您將最大服務(wù)器內(nèi)存 (MB) 設(shè)置為特定值,而不是保留默認(rèn)值 2,147,483,647 兆字節(jié) (MB)。

    如果未啟用 LPIM,SQL Server 將切換到使用常規(guī)內(nèi)存,并且在操作系統(tǒng)內(nèi)存耗盡的情況下,錯(cuò)誤日志中可能會報(bào)告錯(cuò)誤 17890。

    三、從 SQL Server 2012 (11.x) 開始發(fā)生的改變

    3.1、對內(nèi)存管理的更改

    從 SQL Server 2012 (11.x) 開始,單頁分配、多頁分配和 CLR 分配都合并到“任何大小”頁面分配器中,并包含在由最大服務(wù)器內(nèi)存 (MB) 和最小服務(wù)器內(nèi)存 (MB) 配置選項(xiàng)控制的內(nèi)存限制中。此更改為通過 SQL Server 內(nèi)存管理器的所有內(nèi)存要求提供了更準(zhǔn)確的大小調(diào)整功能。

    從 SQL Server 2012 (11.x) 開始,SQL Server 分配的內(nèi)存可能會超過最大服務(wù)器內(nèi)存 (MB) 設(shè)置中指定的值。當(dāng)總服務(wù)器內(nèi)存 (KB) 值已達(dá)到目標(biāo)服務(wù)器內(nèi)存 (KB) 設(shè)置時(shí),可能會發(fā)生此行為,如最大服務(wù)器內(nèi)存 (MB) 指定。如果由于內(nèi)存碎片而沒有足夠的連續(xù)可用內(nèi)存來滿足多頁內(nèi)存請求(超過 8 KB)的需求,則 SQL Server 可以執(zhí)行過度使用,而不是拒絕內(nèi)存請求。

    執(zhí)行此分配后,資源監(jiān)視器后臺任務(wù)將開始向所有內(nèi)存使用者發(fā)出釋放分配的內(nèi)存的信號,并嘗試使總服務(wù)器內(nèi)存 (KB) 值低于目標(biāo)服務(wù)器內(nèi)存 (KB) 規(guī)范。因此,SQL Server 內(nèi)存使用情況可能會短暫超過最大服務(wù)器內(nèi)存 (MB) 設(shè)置。在此情況下,總服務(wù)器內(nèi)存 (KB) 性能計(jì)數(shù)器讀數(shù)將超過最大服務(wù)器內(nèi)存 (MB) 和目標(biāo)服務(wù)器內(nèi)存 (KB) 設(shè)置。

    3.2、對memory_to_reserve所做的更改

    在較舊版本的 SQL Server 中,SQL Server 內(nèi)存管理器留出一部分進(jìn)程虛擬地址空間 (VAS) 供多頁分配器 (MPA)、CLR 分配器、SQL Server 進(jìn)程中線程堆棧的內(nèi)存分配和直接窗口分配 (DWA) 使用。虛擬地址空間的這一部分也稱為“內(nèi)存要離開”或“非緩沖池”區(qū)域。

    為這些分配保留的虛擬地址空間由memory_to_reserve配置選項(xiàng)確定。SQL Server 使用的默認(rèn)值為 256 MB。

    由于“任何大小”頁面分配器還處理大于 8 KB 的分配,因此memory_to_reserve值不包括多頁分配。除此更改外,此配置選項(xiàng)的其他所有內(nèi)容都保持不變。

    四、動態(tài)內(nèi)存管理

    SQL Server 數(shù)據(jù)庫引擎的默認(rèn)內(nèi)存管理行為是根據(jù)需要獲取盡可能多的內(nèi)存,而不會在系統(tǒng)上造成內(nèi)存不足。SQL Server 數(shù)據(jù)庫引擎通過使用 Microsoft Windows 中的內(nèi)存通知 API 來執(zhí)行此操作。

    當(dāng) SQL Server 動態(tài)使用內(nèi)存時(shí),它會定期查詢系統(tǒng)以確定可用內(nèi)存量。維護(hù)此可用內(nèi)存可防止操作系統(tǒng) (OS) 分頁。如果可用內(nèi)存較少,SQL Server 將向操作系統(tǒng)釋放內(nèi)存。如果有更多內(nèi)存可用,SQL Server 可能會分配更多內(nèi)存。SQL Server 僅在其工作負(fù)荷需要更多內(nèi)存時(shí)才添加內(nèi)存;靜態(tài)服務(wù)器不會增加其虛擬地址空間的大小。如果您注意到任務(wù)管理器和性能監(jiān)視器在使用動態(tài)內(nèi)存管理時(shí)顯示可用內(nèi)存穩(wěn)定減少,這是默認(rèn)行為,不應(yīng)被視為內(nèi)存泄漏。

    最大服務(wù)器內(nèi)存控制 SQL Server 內(nèi)存分配、編譯內(nèi)存、所有緩存(包括緩沖池)、查詢執(zhí)行內(nèi)存授予、鎖管理器內(nèi)存和 CLR1記憶(基本上是在sys.dm_os_memory_clerks中找到的任何記憶職員)。

    CLR 內(nèi)存在從 SQL Server 2012 (11.x) 開始的max_server_memory分配下進(jìn)行管理。

    示例:查詢返回有關(guān)當(dāng)前分配的內(nèi)存的信息。

    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;
    

    4.1、堆棧大小

    線程堆棧的內(nèi)存、CLR、文件.dll擴(kuò)展過程、分布式查詢引用的 OLE DB 提供程序、Transact-SQL 語句中引用的自動化對象以及非 SQL Server DLL 分配的任何內(nèi)存不受最大服務(wù)器內(nèi)存 (MB) 的控制。

    當(dāng) SQL Server 啟動時(shí),它會根據(jù)多個(gè)參數(shù)(如系統(tǒng)上的物理內(nèi)存量、服務(wù)器線程數(shù)和各種啟動參數(shù))計(jì)算緩沖池的虛擬地址空間的大小。SQL Server 為緩沖池保留其進(jìn)程虛擬地址空間的計(jì)算量,但它僅獲?。ㄌ峤唬┊?dāng)前加載所需的物理內(nèi)存量。

    然后,實(shí)例會根據(jù)需要繼續(xù)獲取內(nèi)存以支持工作負(fù)載。隨著越來越多的用戶連接和運(yùn)行查詢,SQL Server 會按需獲取更多的物理內(nèi)存。SQL Server 實(shí)例繼續(xù)獲取物理內(nèi)存,直到達(dá)到其最大服務(wù)器內(nèi)存 (MB) 分配目標(biāo)或操作系統(tǒng)指示不再有多余的可用內(nèi)存;當(dāng)內(nèi)存超過最小服務(wù)器內(nèi)存設(shè)置時(shí),它會釋放內(nèi)存,并且操作系統(tǒng)指示可用內(nèi)存不足。

    當(dāng)其他應(yīng)用程序在運(yùn)行 SQL Server 實(shí)例的計(jì)算機(jī)上啟動時(shí),它們會消耗內(nèi)存,并且可用物理內(nèi)存量將低于 SQL Server 目標(biāo)。SQL Server 實(shí)例調(diào)整其內(nèi)存消耗。如果另一個(gè)應(yīng)用程序停止并且有更多內(nèi)存可用,則 SQL Server 實(shí)例會增加其內(nèi)存分配的大小。SQL Server 每秒可以釋放和獲取幾兆字節(jié)的內(nèi)存,從而能夠快速適應(yīng)內(nèi)存分配更改。

    五、緩沖區(qū)管理

    SQL Server 數(shù)據(jù)庫的主要用途是存儲和檢索數(shù)據(jù),因此密集磁盤 I/O 是數(shù)據(jù)庫引擎的核心特征。由于磁盤 I/O 操作可能會消耗許多資源并且需要相對較長的時(shí)間才能完成,因此 SQL Server 專注于提高 I/O 的效率。緩沖液管理是實(shí)現(xiàn)這種效率的關(guān)鍵組成部分。緩沖區(qū)管理組件由兩種機(jī)制組成:用于訪問和更新數(shù)據(jù)庫頁的緩沖區(qū)管理器,以及用于減少數(shù)據(jù)庫文件 I/O 的緩沖區(qū)緩存(也稱為緩沖池)。

    5.1、緩沖區(qū)管理的工作原理

    緩沖區(qū)是內(nèi)存中的 8 KB 頁,大小與數(shù)據(jù)頁或索引頁相同。因此,緩沖區(qū)緩存分為 8 KB 頁。緩沖區(qū)管理器管理將數(shù)據(jù)或索引頁從數(shù)據(jù)庫磁盤文件讀取到緩沖區(qū)緩存以及將修改的頁寫回磁盤的功能。頁將保留在緩沖區(qū)緩存中,直到緩沖區(qū)管理器需要緩沖區(qū)來讀取更多數(shù)據(jù)。僅當(dāng)數(shù)據(jù)被修改時(shí),數(shù)據(jù)才會寫回磁盤。緩沖區(qū)緩存中的數(shù)據(jù)在寫回磁盤之前可以多次修改。

    當(dāng) SQL Server 啟動時(shí),它會根據(jù)多個(gè)參數(shù)(如系統(tǒng)上的物理內(nèi)存量、配置的最大服務(wù)器線程數(shù)和各種啟動參數(shù))計(jì)算緩沖區(qū)緩存的虛擬地址空間的大小。SQL Server 為緩沖區(qū)緩存保留此計(jì)算量的進(jìn)程虛擬地址空間(稱為內(nèi)存目標(biāo)),但它僅獲取(提交)當(dāng)前加載所需的物理內(nèi)存量。您可以查詢sys.dm_os_sys_info目錄視圖中的committed_target_kb列和committed_kb列,以分別返回保留為內(nèi)存目標(biāo)的頁數(shù)和緩沖區(qū)緩存中當(dāng)前提交的頁數(shù)。

    SQL Server 啟動和緩沖區(qū)緩存獲取其內(nèi)存目標(biāo)之間的時(shí)間間隔稱為上升。在此期間,讀取請求會根據(jù)需要填充緩沖區(qū)。例如,單個(gè) 8 KB 頁讀取請求填充單個(gè)緩沖區(qū)頁。這意味著上升取決于客戶端請求的數(shù)量和類型。通過將單頁讀取請求轉(zhuǎn)換為對齊的八頁請求(構(gòu)成一個(gè)范圍)來加快提升速度。這使得爬坡可以更快地完成,尤其是在具有大量內(nèi)存的機(jī)器上。

    由于緩沖區(qū)管理器使用 SQL Server 進(jìn)程中的大部分內(nèi)存,因此它與內(nèi)存管理器配合使用,以允許其他組件使用其緩沖區(qū)。緩沖區(qū)管理器主要與以下組件交互:

    • 資源管理器,用于控制總體內(nèi)存使用情況,在 32 位平臺中,用于控制地址空間使用情況。
    • 用于低級別文件 I/O 操作的數(shù)據(jù)庫管理器和 SQL Server 操作系統(tǒng) (SQLOS)。
    • 用于預(yù)寫日志記錄的日志管理器。

    5.2、支持的功能

    • 緩沖區(qū)管理器可識別非一致性內(nèi)存訪問 (NUMA)。緩沖區(qū)緩存頁分布在硬件 NUMA 節(jié)點(diǎn)上,這允許線程訪問在本地 NUMA 節(jié)點(diǎn)上分配的緩沖區(qū)頁,而不是從外部內(nèi)存訪問。
    • 緩沖區(qū)管理器支持熱添加內(nèi)存,允許用戶在不重新啟動服務(wù)器的情況下添加物理內(nèi)存。
    • 緩沖區(qū)管理器支持 64 位平臺上的大頁面。頁面大小特定于 Windows 版本。
    • 緩沖區(qū)管理器提供通過動態(tài)管理視圖公開的額外診斷。可以使用這些視圖監(jiān)視特定于 SQL Server 的各種操作系統(tǒng)資源。

    5.3、磁盤 I/O

    緩沖區(qū)管理器僅執(zhí)行對數(shù)據(jù)庫的讀取和寫入。其他文件和數(shù)據(jù)庫操作(如打開、關(guān)閉、擴(kuò)展和收縮)由數(shù)據(jù)庫管理器和文件管理器組件執(zhí)行。

    緩沖區(qū)管理器的磁盤 I/O 操作具有以下特征:

    • 所有 I/O 都是異步執(zhí)行的,這允許調(diào)用線程繼續(xù)處理,而 I/O 操作在后臺進(jìn)行。
    • 所有 I/O 都在調(diào)用線程中發(fā)出,除非正在使用關(guān)聯(lián) I/O 選項(xiàng)。關(guān)聯(lián)性 I/O 掩碼選項(xiàng)將 SQL Server 磁盤 I/O 綁定到指定的 CPU 子集。在高端 SQL Server 聯(lián)機(jī)事務(wù)處理 (OLTP) 環(huán)境中,此擴(kuò)展可以增強(qiáng)發(fā)出 I/O 的 SQL Server 線程的性能。
    • 多頁 I/O 通過分散-收集 I/O 完成,這允許將數(shù)據(jù)傳入或傳出不連續(xù)的內(nèi)存區(qū)域。這意味著 SQL Server 可以快速填充或刷新緩沖區(qū)緩存,同時(shí)避免多個(gè)物理 I/O 請求。

    5.4、長 I/O 請求

    緩沖區(qū)管理器報(bào)告任何未完成至少 15 秒的 I/O 請求。這有助于系統(tǒng)管理員區(qū)分 SQL Server 問題和 I/O 子系統(tǒng)問題。報(bào)告錯(cuò)誤消息 833,并顯示在 SQL Server 錯(cuò)誤日志中。長 I/O 可以是讀取或?qū)懭?消息中當(dāng)前未指示。長 I/O 消息是警告,而不是錯(cuò)誤。它們并不表示 SQL Server 的問題,而是表示底層 I/O 系統(tǒng)的問題。報(bào)告這些消息是為了幫助系統(tǒng)管理員更快地找到 SQL Server 響應(yīng)時(shí)間不佳的原因,并區(qū)分 SQL Server 無法控制的問題。因此,它們不需要任何操作,但系統(tǒng)管理員應(yīng)調(diào)查 I/O 請求花費(fèi)這么長時(shí)間的原因,以及時(shí)間是否合理。

    5.5、長時(shí)間 I/O 請求的原因

    較長的 I/O 消息可能表示 I/O 被永久阻止且永遠(yuǎn)不會完成(稱為丟失 I/O),或者只是表示它尚未完成。無法從消息中判斷出哪種情況,盡管丟失的 I/O 通常會導(dǎo)致閂鎖超時(shí)。
    長 I/O 通常表示 SQL Server 工作負(fù)荷對于磁盤子系統(tǒng)來說過于密集。在以下情況下,可能指示磁盤子系統(tǒng)不足:

    • 在繁重的 SQL Server 工作負(fù)荷期間,錯(cuò)誤日志中會出現(xiàn)多個(gè)長 I/O 消息。
    • 性能監(jiān)視器計(jì)數(shù)器顯示較長的磁盤延遲、較長的磁盤隊(duì)列或無磁盤空閑時(shí)間。

    長 I/O 也可能是由 I/O 路徑中的組件(例如,驅(qū)動程序、控制器或固件)不斷推遲處理舊的 I/O 請求,轉(zhuǎn)而處理更接近磁盤磁頭當(dāng)前位置的新請求引起的。根據(jù)哪些請求最接近讀/寫頭的當(dāng)前位置來優(yōu)先處理請求的常用技術(shù)稱為“電梯搜索”。這可能很難用性能監(jiān)視器工具證實(shí),因?yàn)榇蠖鄶?shù) I/O 都會及時(shí)得到維護(hù)。執(zhí)行大量順序 I/O 的工作負(fù)載(如備份和還原、表掃描、排序、創(chuàng)建索引、批量加載和清零文件)可能會加劇長 I/O 請求。

    六、了解非一致性內(nèi)存訪問

    SQL Server 可識別非一致性內(nèi)存訪問 (NUMA),并且在沒有特殊配置的 NUMA 硬件上表現(xiàn)良好。隨著時(shí)鐘速度和處理器數(shù)量的增加,減少使用這種額外處理能力所需的內(nèi)存延遲變得越來越困難。為了規(guī)避這種情況,硬件供應(yīng)商提供了大型 L3 緩存,但這只是一個(gè)有限的解決方案。NUMA 體系結(jié)構(gòu)為此問題提供了可擴(kuò)展的解決方案。

    SQL Server 旨在利用基于 NUMA 的計(jì)算機(jī),而無需進(jìn)行任何應(yīng)用程序更改。

    到此這篇關(guān)于SQLServer的內(nèi)存管理架構(gòu)詳解的文章就介紹到這了,更多相關(guān)SQLServer內(nèi)存管理架構(gòu)內(nèi)容請搜索以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持!

    標(biāo)簽: MsSQL
    相關(guān)文章:
    主站蜘蛛池模板: 国产美女高清一级a毛片 | 91黑丝国产线观看免费 | 亚洲国产网站 | 国产黄色片在线免费观看 | 亚洲国产欧美一区二区欧美 | 最新国产成人综合在线观看 | 亚洲自偷自拍另类12p | 三级全黄的全黄三级三级播放 | 亚洲精品一区二区三区www | 欧美自拍在线 | 日韩欧美一区二区不卡看片 | 精品欧美成人高清在线观看2021 | 鲁丝片一区二区三区免费 | 精品精品国产自在久久高清 | 日韩在线二区 | 色综合精品久久久久久久 | 91最新网站| 欧美国产日本精品一区二区三区 | 欧美一级片在线看 | 深夜福利视频在线观看免费视频 | 女人张开腿让男人桶个爽 | 一级片免 | gdcm01果冻传媒 | 亚洲精品第一第二区 | 日本草草视频在线观看 | 特级片视频 | 国产精品黄网站免费观看 | 午夜无遮挡怕怕怕免费视频 | 久久精品国产欧美日韩亚洲 | 男女无遮挡拍拍拍免费1000 | 高清波多野结衣一区二区三区 | 正在播放国产精品放孕妇 | 亚洲性在线 | 国产精品不卡 | 免费视频网站一级人爱视频 | 欧洲成人免费视频 | 国产在线观看成人免费视频 | 99在线观看巨臀大臀视频 | 欧美成人三级网站 | 九草视频在线观看 | 欧美黄色xxx |