本文主要介紹sql server內存(sqlserver內存數(shù)據(jù)庫),下面一起看看sql server內存(sqlserver內存數(shù)據(jù)庫)相關資訊。
了解sql server的內存管理是sql server問題處理和性能調優(yōu)的基本問題。介紹了sql server內存管理的原理。二級存儲(secondary storage)計算機的存儲系統(tǒng)是分等級的,離cpu越近越高興,但容量越小(如圖1)。比如傳統(tǒng)的計算機存儲架構是:寄存器緩存在cpu的第一級,兩級緩存,內存,硬盤依次緩存,但同時遠離cpu,存儲系統(tǒng)會比之前的存儲系統(tǒng)多一個數(shù)量級,比如硬盤通常同時多一個數(shù)量級。圖一。計算機存儲系統(tǒng)因此,sql server,內存分配通過正常的生產系統(tǒng)可以 通常不會加載所有的數(shù)據(jù),所以會涉及到兩級存儲,也就是磁盤。磁盤存儲組件機械最后的現(xiàn)代計算機需要移動磁頭磁盤來讀取數(shù)據(jù)(具體原理可以在我之前寫的一篇文章中找到),因為access數(shù)據(jù)庫中的數(shù)據(jù)是隨機分布在磁盤的各個位置的,所以如果需要經常移動磁頭,就需要經常讀取磁盤。表演會很精彩。計算機存儲系統(tǒng)可以知道計算機在硬盤操作中需要先讀取內存中的所有數(shù)據(jù),所以充分利用緩沖內存,減少磁盤的io訪問是提高服務器sql性能的關鍵問題之一,這也是本文的出發(fā)點。一個自調整引擎由于sql server一直面向中小型企業(yè),所以sql server存儲引擎被設計成一個不需要太多配置就可以使用的產品,從而降低部署成本。不過這種配置也被很多人詬病對微軟過于開放,幾乎沒有直接分配sql server使用的內存空間。唯一開放的配置是是否使用awe以及實例占用的最大或最小內存,如圖2所示。圖二。sql server控制的內存控制具體的sql server,如何使用內存,比如給執(zhí)行計劃緩存分配多少,給數(shù)據(jù)分配多少緩沖區(qū),這些都是不可控的。這也是為什么很多其他使用微軟技術的技術開發(fā)人員會有一種優(yōu)越感,但是在我看來,雖然sql server提供的可配置的地方很少,而且很多地方都是間接配置的,但是你知道原理的同時也需要知道windows的一些原理。sql server中如何使用內存sql server存儲引擎本身就是windows下的一個進程,所以sql server使用的內存和其他windows程序一樣,需要windows申請內存。在存儲了來自windows的應用程序后,sql server可以用粗略的內存劃分為兩個部分:緩沖池內存(數(shù)據(jù)頁和頁面,無緩沖區(qū)的free)內存(行、dll和鏈接)服務器等。).緩沖池的內存占用了sql server的大部分內存使用量,緩沖池占用的內存也設置了圖2中的最大值和最小值,所以內存占用sqlservr.exe可能大于圖2中的最大值。還有一點就是sql server使用了內存特性:它使用了多少以后不會公布(除非通知它windows的內存壓力)。例如,我們公司 的開發(fā)服務器,如圖3所示,在幾乎沒有負載的情況下查看內存使用情況。圖3.sql server進程內存使用情況您可以看到,當cpu為0負載時,內存占用了13 g..這實際上是未發(fā)布的應用程序從sql server到windows的結果。特定sql server可以使用多少內存由以下因素決定:1 .物理內存的大小2。所安裝windows版本的內存限制(如windows server 2008標準的限制,最大內存只有32 gb) 3。sql server是32位或64位4。配置sql server使用的內存量,如圖2所示。對于5.sql server版本(例如,express版本只能使用1g內存),sql server操作系統(tǒng)的三層內存分配分為三個級別的內存分配,如圖4所示。圖4。sql server操作系統(tǒng)內存的相關存儲節(jié)點第一個底層是存儲節(jié)點,存儲節(jié)點的作用是從windows sql server操作系統(tǒng)中分配內存。每個sql server實例通常只有一個存儲節(jié)點,存儲節(jié)點的數(shù)量僅取決于numa架構的硬件配置。我們可以通過dbcc memorystatus看到一些關于內存的節(jié)點信息,如圖5所示。圖5。查看內存節(jié)點信息,我們可以看到,按照應用內存大小的分類,可以分為兩部分。1。將8kb或更小的存儲單元應用于緩存。(分頁分配圖5) 2。應用的內存超過一個8kb的單元,這被稱為多頁面(或memtoleave)(頁面分配器圖5)。為什么叫memtoleave?它被稱為memtoleave,因為sql server用于大部分緩存,但它仍然需要一些連續(xù)內存sql clr、鏈接服務器和備份緩沖區(qū)。sql 32服務器將保留一部分虛擬地址來啟動實例(vas)多頁分配器。具體預留多少可以用下面的公式計算:預留地址=((cpu核數(shù)-4) 256)* 0.5mb 256mb,通常是384mb。記憶讓 讓我們來看看內存職員,即分配內存的內存管理員,并用它來分配已分配的內存。我們可以簡單地做出如下聲明,如圖6所示。圖6。按內存管理員的類別分類注:如圖4所示,內存管理員只是內存分配的一部分,另一部分是數(shù)據(jù)緩存(緩沖池)。緩沖池在開始講緩沖池之前,首先需要討論的是虛擬內存。在windows中,每個進程都有一個虛擬內存(虛擬地址空間vas)。32位系統(tǒng)是2的32種冪,即4g。4g是一個窗口分為兩部分,一部分是windows和其他應用。虛擬內存并不是實際的物理內存,而是物理內存的映射,當物理內存中不存在的虛擬內存的內容,產生了內存的一部分頁錯替換,然后需要讀入內存和硬盤的部分可以從我之前寫的一篇文章中讀到:操作系統(tǒng)的內存管理。所以緩沖池的作用是通過數(shù)據(jù)頁進行緩沖,從而減少以后讀取數(shù)據(jù)時對磁盤的訪問。緩沖池的這一部分是圖2中最大和最小服務器內存所占用的空間。這個最小值并不意味著sqlserver啟動時占用大量內存,但是一旦超過這個值,sql server緩沖池的使用就不會被釋放。在dbcc內存狀態(tài)的一部分,我們可以看到緩沖池的信息,如圖7所示。圖7緩沖池相關信息從sql server實例開始。vas地址空間緩沖池的保留取決于很多因素,包括:物理內存和sql server 32或64(32的限制是4g,指定一半windows減去memtoleave換空間)和實際sql server的物理內存,可以用下面的語句表示,如圖8所示。圖8。查看緩沖池使用的物理內存。緩沖池將繼續(xù)按需應用內存。如果需要,緩沖池將繼續(xù)消耗內存。除非windows通知sql server內存太低,否則緩沖池將能夠釋放內存,否則緩沖池將占用內存而不釋放內存。另外,緩沖池和sql server操作系統(tǒng)分配的頁面大小是一樣的,都是8192字節(jié)。當sql server等部分需要借用內存緩沖池時,這部分的內存在物理內存中是不連續(xù)的,聽起來像是緩沖池內存管理系統(tǒng)。sql server占用的內存可以用這個公式估算:通過緩沖池借用的頁面緩沖池的內存和緩沖池占用的非內存multipageallocator占用的內存,如圖9所示。圖9??梢怨浪愠鰏ql server占用的內存。內存對象本質上是一堆,由頁面分配器分配??梢酝ㄟ^sys.dm_os_memory_objects dmv認為,dmv可以看到list的page_allocator_address列,是內存的五線譜,內存對象的標識,是分配內存的五線譜。32位sql server內存瓶頸前面的基本原理可以看作是一個32位sql server使用vas地址分配,所以地址空間限制在4gb,4gb會有半個窗口,這樣緩沖池只能使用2g內存,這就使得32位sql server即使有額外的物理內存也沒有用。解決方案之一是通過將windows的2g默認內存降低到1g,將sql server的默認內存降低到3g。通過鍵入bcdedit/在windows server 2003中,我們需要添加/3gb啟動參數(shù)作為boot.ini另一種方法是使用awe(地址窗口擴展)來分配內存. awe加4位。通過計算機物理地址擴展(physical address extension pae),將32位cpu的地址范圍提高到2的36倍,即64gb,基本解決了尋址范圍不足的問題。allocateuserphysicalpages virtualalloc和allocateuserphysicalpages virtualalloc以及sql server用于申請內存窗口的方法。默認情況下,所有內存,sql server需要使用virtualalloc windows內存。這個應用是操作系統(tǒng)級的,也就是虛擬內存直接與之對應。這就導致了在virtualalloc中所有內存分配都可以在虛擬內存中的情況下,windows所面臨的內存壓力置換問題。這將導致木衛(wèi)一生涯。需要allocateuserphysicalpages內存來直接匹配底部頁面的頁表。所以內存需要的內存不會被這種方法替代。在sql server 32中,通過在緩沖池中打開awe內存分配,數(shù)據(jù)緩存將使用該函數(shù),內存緩沖池的其他部分和memtoleave部分(主要是計劃緩存的實現(xiàn))將通過virtualalloc分配內存。因此,在通過awe打開內存之前,sql server首先需要相應的權限,否則會在日志中報錯,如圖10所示。圖10。打開awe而不打開相應的權限。我們可以在組策略中設置一個帳戶使sql server擁有此權限,例如如圖11所示。圖11。64位sql server鎖定內存頁面(內存中鎖定的頁面)問題64 windows存在內存問題,但還是要注意,默認情況下,64位sql server還是使用virtualalloc來分配內存,也就是說windows中所有的內存分配都會有壓力。當頁面被替換時,這可能會導致抖動(緩沖池丟失,這是sql)。服務器上的頁面緩沖池被換到了硬盤上,造成了大量的io占用(查看sys . dm _ exec _ query _ memory _ grants dmv的查詢,所以要等待內存)64頁面allocateuserphysicalpages上的sql server緩沖池的內存分配日期可以避免這個問題。對于32位sql server,64位sql server不支持。;不需要在awe中打開,只需打開如圖11所示頁面的內存鎖。但這也暴露了另一個問題,因為sql server鎖定了內存頁。當windows出現(xiàn)緊急情況時,sql server將無法處理緊急情況下的windows內存(當然,池中的一些非數(shù)據(jù)緩存和memtoleave buffer仍然是可以的,但往往不夠用,因為這部分的內存消耗與數(shù)據(jù)緩存相比是非常小的),因為sql server的特點是內存多少,這可能導致windows無法響應windows內存不足時的不穩(wěn)定甚至崩潰。在內存中鎖定頁面后,sql server緩沖池被打開,使用的內存受到限制。正如在圖2中已經提到的,我在這里不再贅述。有一個問題。當通過allocateuserphysicalpages分配緩沖池時,我們可以在任務管理器中看到,我們的sqlservr.exe內存只包含未緩存的數(shù)據(jù)緩沖池和memtoleave部分,不包含數(shù)據(jù)緩存,因此可能會導致sqlservr.exe占用數(shù)百兆內存和內存使用量。這時,我們需要看到的sql server:在perfmon.exe找到的內存管理服務器的總內存計數(shù)器。摘要:本文介紹了sql server內存管理的基本原理和sql server的部分內存使用。對于sql server性能調優(yōu),這是了解內存使用情況的一個關鍵部分。許多io問題可能是由內存引起的。單擊此處下載本文的pdf版本。
了解更多sql server內存(sqlserver內存數(shù)據(jù)庫)相關內容請關注本站點。