<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
對於資料庫引擎來說,記憶體是一個效能提升的重要解決手段。把資料快取起來,可以避免在查詢或更新資料時花費多餘的時間,而這時間通常是從磁碟獲取資料時用來等待磁碟定址的。把執行計劃快取起來,可以避免重複分析執行計劃時帶來額外的CPU及各種資源的開銷。通過在記憶體中開闢查詢記憶體空間,可以迅速地完成排序、雜湊等計算,達到快速返回運算結果的目的。若沒有足夠的記憶體空間,資料庫引擎將無法快速地響應使用者的請求。
SQL Server儲存引擎本身是一個Windows下的程序,所以SQL Server使用記憶體和其它Windows程序一樣,都需要向Windows申請記憶體(通過VirtualAlloc之類的API向Windows申請記憶體)。
記憶體晶片提供的物理儲存空間,能被CPU直接存取,存取速度快,易丟失。記憶體效能指標GB/s,ns(納秒),前者是吞吐量,後者是響應時間。磁碟效能指標MB/s,us(微秒),從兩者對比就能看出記憶體存取速度是遠優於磁碟的。
實體記憶體容量是有限的,如果所有程序都直接使用有限的實體記憶體,那新的程序將無法為他們找到任何實體記憶體,那麼實體記憶體將容易成為瓶頸。所以Windows會授予每個程序一個虛擬地址空間(Virtual Address Space,VAS),通過VAS建立應用程式與實體記憶體的橋樑。
是指一個應用程式能夠申請存取的最大地址空間。VAS作為中間的抽象層的,不是所有的請求都直接對映到實體記憶體,它首先對映到VAS,然後對映到實體記憶體。
而兩個程序可以共用一個VAS,而VAS的大小取決於CPU架構,具體請看下面表格:
OS Type | Kernel Model (核心模式) | User Model (使用者模式) | Total |
32位元系統 | 2GB | 2GB | 4GB |
64位元系統 | 8TB | 8TB | 16TB |
VAS有兩種記憶體模式,Kernel Model和User Model。Kernel Model下的VAS是供Windows系統程序使用,而User Model下的VAS是供使用者程序使用。
由表格可知,32位元Windows系統應用程式可以存取最大2GB的VAS,64Windows位系統可以存取最大8TB的VAS。這意味著在32位元Windows系統中一個word檔案程序跟一個SQL Server程序能得到最大2GB的VAS是一樣的。因此,從理論上講,這意味著任何應用程式程序在32位元Windows系統上都將共用最大限度的2 G的VAS。
VMM是負責把實體記憶體在系統中所有需要記憶體的程序之間作共用,必要時會從VAS回收實體記憶體,把資料儲存到頁面檔案上面去,保證資料永不丟失。當程序需要記憶體時,VMM會從頁面檔案中查詢資料,並將這資料寫入一部分空閒記憶體當中,然後將新頁面對映到需要操作的VAS當中。
SQL Server 2012對記憶體管理這塊跟SQL Server 2008還是有比較大的區別的,參考一些資料,下面我們來看看兩者具體架構。
SQL Server 2008 R2:
SQL Server 2012:
名詞術語
為了更加清楚瞭解Buffer Pool,我們先來了解下 SQL Server的所需要的記憶體有哪些,其中包括SQL Server服務(sqlserver.exe)和其它一些元件所佔用的記憶體,例如SQL Server代理程式(sqlagent.exe), SQL Server複製代理程式、SQL Server報表服務(ReportingServicesService.exe)、SQL Server Analysis Services(msmdsrv.exe)、SQL Server Integration Services(MsDtsSrvr.exe),和SQL Server 全文搜尋(msftesql.exe)。
在一臺執行SQL Server的伺服器上,執行著sqlserver服務(sqlserver.exe)和其它一些元件。在sqlserver服務(sqlserver.exe)獲取到的記憶體中,又分為2大塊:一部分為Buffer Pool,另一部分為非Buffer Pool,舊稱MemToReserve(預設sqlserver.exe給它預留了256MB)。下表為這兩部分記憶體各自的用途:
SQL Server 程序所佔記憶體 | ||
Buffer Pool EXEC sp_configure N'min server memory EXEC sp_configure N'max server memory | 非Buffer Pool(即MemToReserve) (預設為256MB), 可以sqlserver.exe啟動時加-g引數,預留足夠記憶體(預留記憶體大小=256MB+工作執行緒數*512KB) | |
Buffer Pool中主要存放之前查詢中的資料頁,和索引頁。然後根據它自已的演演算法,自動清理過期過存取或效率低下的頁。 | SQL Server工作執行緒 | 佔用不多 |
分散式查詢參照的OLE DB存取介面 | 如操作連結伺服器 | |
備份還原 | 維護計劃或者T-SQL備份恢復 | |
擴充套件過程 | 如sp_或sys開頭的系統儲存過程,sp_OACreate 儲存過程 | |
多頁的分配器SQL Server記憶體管理器 | 如.net framework程式(它們連線sqlserver的網路包大小為8K, sqlserver預設網路包大小為4k) | |
.DLL檔案 |
| |
SQL Server CLR的Microsoft COM物件 |
這塊記憶體是<=8kb的儲存,適用於sql server 2008及以前,屬於Buffer Pool緩衝池來分配。有儲存資料頁面,Consumer功能元件。
這塊記憶體是>8kb的儲存,適用於sql server 2008及以前,不屬於Buffer Pool緩衝池來分配, 有儲存Consumer功能元件, 第三方程式碼, Threads執行緒。
這個適用於sql server 2012及以上,整合了single-page,multi-page統稱any size page。
它來統一響應SQL Server 內部各種元件記憶體申請的請求。因為這個原因,在SQL Server 2012裡面,max server memory 不再像以前的版本那樣,只控制buffer pool的大小,也包括那些大於8kb 的記憶體請求。也就是,max server memory能夠更準確地控制SQL Server 的記憶體使用了。
從記憶體架構我們可以看到有page reservation需預先申請的記憶體,有momory objects從windows api申請的記憶體,有clr第三方申請的記憶體。
記憶體使用分類
(1)Database Cache(資料頁面緩衝區)
存放資料頁面的緩衝區。SQL Server資料庫裡的資料都是以8KB為一個頁面儲存。當有使用者需要使用到這個頁面上儲存的資料時,SQL Server會把整個頁面都調入記憶體,供使用者使用。所以8KB是資料存取的最小單元。當用戶修改了某個頁面上的資料時,SQL Server會在記憶體中將這個頁面修改,但是不會立刻將這個頁面寫回磁碟,而是等到後面的Checkpoint或Lazy Write的時候集中處理。
(2)各類Consumer
SQL Server的很多功能元件,都必須要申請記憶體來完成它們的任務。這些統稱為“Consumer”。常見有如下:
(3)執行緒記憶體
SQL Server會為每個程序內的每個執行緒分配0.5MB的記憶體,以存放執行緒的資料結構和相關資訊。
(4)第三方程式碼申請的記憶體(COM,XP...)
在SQL Server的程序裡,會執行一些非SQL Server自身的程式碼。例如,使用者定義的CLR或者Extended Stored Procedure程式碼,Linked Server需要載入的資料連結驅動,呼叫SQL Mail功能需要載入的MAPI動態庫等。這些程式碼也會申請記憶體,會算在SQL Server自己都不知道。
有些SQL Server記憶體的申請方式,是預先Reserve一塊大的記憶體,然後在使用的時候一小塊一小塊地Commit。而另外的記憶體申請則直接從空間裡Commit。在SQL Server裡,把後一種方式叫Stolen。
在SQL Server裡,對Database Cache,SQL Server會先Reserve,再Commit。其他的所有記憶體使用,基本都是直接Commit,都是“Stolen”。要重申的是,Stolen記憶體也是正常使用的記憶體,不是洩漏掉的記憶體。
之所以要把這兩種分開,是因為SQL Server不會對Stolen的記憶體使用AWE功能。也就是說,AWE擴充套件出去的記憶體,只能用來存放Database Cache。其他記憶體還要在原來的那2GB裡想辦法。
對於SQL Server自己申請的記憶體,有兩種記憶體申請單位。
小於等於8KB一個單位記憶體申請,SQL Server就分配一個8KB頁面。所有這些頁面都集中管理,這塊記憶體被稱為Buffer Pool。一次一個頁面的這種分配稱為Single Page Allocation。
對於大於8KB為單位的記憶體申請,SQL Server把它們集中在另外一個區域,稱為Multi-Page Allocation(舊稱MemToLeave)。而這種分配稱為Multi-Page Allocation。
型別 | Database Cache | Consumer | 3rh Party Code | Threads |
Reserved/Commit | 是 | 一般不是 | 一般不是 | 不是 |
Stolen | 不是 | 是 | 是 | 是 |
Buffer Pool (Single Page) | 所有 | 絕大部分 | 沒有 | 沒有 |
MemToLeave(Multi-Page) | 沒有 | 一小部分 | 所有 | 所有 |
這裡的一個例外是執行在SQL Server程序裡的CLR程式碼所申請的記憶體。這部分記憶體像第三方程式碼一樣,也是使用MemToLeave的記憶體。但是,CLR可能也會用Reserve-Commit的方式申請記憶體。所以MemToLeave的記憶體也並不是都是Stolen的。
根據SQL Server記憶體架構圖,我們可以知道,在2012版本上,Single Page Allocation跟Multi-Page Allocation合併為Any Size Page Allocation了。而max server memory控制的不但是 Buffer Pool記憶體大小,而是所有大於等於小於8KB的記憶體請求。
如圖:
比如我設定最小伺服器記憶體為8G,重新啟動下SQL Server (MSSQLSERVER)服務,再使用dmv來檢視當前範例的總記憶體空間,以及佔用記憶體空間:
--Target Server Memory (KB)最多能申請的記憶體量
--Total Server Memory (KB)目前使用了多少記憶體量
SELECT counter_name, ltrim(cntr_value*1.0/1024.0/1024.0)+'G' AS memoryGB FROM sys.dm_os_performance_counters WHERE counter_name like '%target%server%memory%'or counter_name like '%total%memory%'
從查詢結果可以看到當我們在SQL Server設定最小伺服器記憶體為8G的時候,給SQL Server分配了多少記憶體,它就佔用多少多少記憶體,從而達到效能最佳。
到此這篇關於SQL Server記憶體機制的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45