一些內(nèi)存使用錯誤理解-創(chuàng)新互聯(lián)

在實際的場景中會遇到各種奇怪的問題,為什么會感覺到奇怪,因為沒有理論支撐的東西才感覺到奇怪,SQL Server自己管理內(nèi)存,我們可以干預(yù)的方式也很少,所以日常很難遇到處理內(nèi)存問題的案例。當(dāng)遇到了原有的知識儲備已經(jīng)變得模糊,這是已經(jīng)記不住第幾遍閱讀《SQL 2012實施與管理實戰(zhàn)指南》內(nèi)存管理章節(jié),也分享給群友。

成都創(chuàng)新互聯(lián)長期為1000+客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為遼源企業(yè)提供專業(yè)的成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè),遼源網(wǎng)站改版等技術(shù)服務(wù)。擁有十載豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

一些內(nèi)存使用錯誤理解

    本文來澄清一些用戶經(jīng)常對SQL Server內(nèi)存使用的誤解。對這些知識的理解可以幫助數(shù)據(jù)庫管理員理解SQL Server的行為

    1. Windows上還有很多物理內(nèi)存沒有被使用,就意味著SQL Server不缺內(nèi)存

    這個觀點是非常錯誤的,因為:

    (1)SQL Server很可能設(shè)置了Max Server Memory,約束了SQL Server繼續(xù)申請內(nèi)存的能力。(注:實際場景中就遇到過客戶128GB內(nèi)存的機器SQL Server 的Max Server Memory 被設(shè)置成2048MB 導(dǎo)致嚴(yán)重的問題)

    (2)在32位的機器上 ,由于虛擬地址空間的限制,SQL Server可能已經(jīng)無法繼續(xù)申請內(nèi)存。

    例如,在一臺4 GB或更大的32位服務(wù)器上,SQL Server最多只能使用2 GB物理內(nèi)存。一般Windows會使用500 MB左右的物理內(nèi)存,這臺機器可能就有1 GB多的空閑物理內(nèi)存。這部分內(nèi)存是SQL Server不開AWE就用不到的。 所以,服務(wù)器上有很多空閑物理內(nèi)存,只能說明Windows不缺內(nèi)存,不能說明SQL Server自己不缺內(nèi)存。(這也是為什么建議更換老一代服務(wù)器,使用64位的操作系統(tǒng)和SQL Server的原因)

    2.  SQL Server進(jìn)程的Private Bytes(或Working Set)在不停地向上漲,說明SQL Server有內(nèi)存泄漏的問題

  恰恰相反,對于申請內(nèi)存,SQL Server有嚴(yán)格的限制。在32位的服務(wù)器上,不管是Buffer Pool還是MemToLeave,都有一個使用大上限。當(dāng)Windows感覺到有內(nèi)存壓力的時候,SQL Server又會主動地釋放內(nèi)存所以作為一個進(jìn)程,SQL Serve發(fā)生內(nèi)存泄漏的機會是非常小的。

  之所以會有這樣的疑惑,是因為SQL Server啟動的時候,僅會Commit它啟動所需要的那部分內(nèi)存。隨著用戶的使用,SQL Server會不斷地申請內(nèi)存,直到Windows感覺到內(nèi)存壓力,或者SQL到了自己的上限為止,在這之前,SQL Server的內(nèi)存使用量的確會不斷地增加。對SQL Server來講,緩存越多的數(shù)據(jù),它的性能會越好這種增長是正常的,不用焦慮如果不希望SQL Server使用那么多內(nèi)存,只需設(shè)置Max Server Memory這個上限即可。

(注:實際情況中很多人提到過,SQL Server竟然吃掉了所有服務(wù)器的內(nèi)存,是不是內(nèi)存泄露了?或問內(nèi)存是不是這就是我系統(tǒng)的瓶頸呀?)

   3.  Max Server Memory的值,就是SQL Server內(nèi)存使用量的大值。超過這個值就不正常

Max Server Memory這個值應(yīng)該是Buffer Pool的上限(此點針對SQL Server 2005/2008而言,對于SQL Server 2012內(nèi)存管理發(fā)生了非常大的變化),而不是SQL Server所有內(nèi)存使用的上限。由于SQL Server 內(nèi)存的使用包括Buffer Pool和MemToLeave,所以SQL Server實際內(nèi)存使用量一定會比Max Server Memory要大但是在正常情況下SQL Server MemToLeave的使用會遠(yuǎn)小于Buffer Pool的使用,控制好Buffer Pool,就基木控制住了SQL Server的整體內(nèi)存使用量

  ?。ㄗⅲ航ㄗh無論內(nèi)存是否存在壓力都要合理的設(shè)置大內(nèi)存,PS:我也曾經(jīng)被使用的內(nèi)存超過設(shè)置的Max Server Memory嚇了一跳)

    4. SQL Server的內(nèi)存使用總量,就是性能監(jiān)視器里面的SQL Server:Memory Manager一Total Server Memory的值

    性能監(jiān)視器里面與SQL Server相關(guān)的counter,都是SQL Server自己負(fù)責(zé)收集的。從SQL Server 2005以后,SQL整合了所有的內(nèi)存申請,讓它們使用同一的接口。所以SQL Server對自己申請的內(nèi)存數(shù)量,是了如指掌的,但問題是,在SQL Server進(jìn)程里運行的代碼不都是SQL Server自己的代碼。對第三方的代碼,SQL Server是不知道它們申請了多少內(nèi)存的。

    SQLServer:Memory Manager - Total Server Memory的值,是SQL Server自己的代碼申請的內(nèi)存空間大小。真正SQL Server進(jìn)程申請的空間值,會比這個值大一些。(具體大多少和MemToLeave的大小有關(guān)系)

    如果SQL Server沒有開啟AWE,SQL Server進(jìn)程申請的邏輯內(nèi)存數(shù)和物理內(nèi)存數(shù)可以由Process下的Private Bytes和Working Set看出。這兩個值會包含所有的內(nèi)存支出,包括SQL自己的代碼和第三方的代碼。

    如果SQL Server開啟了AWE,問題就比較尷尬了。因為Windows沒有辦法正確判斷出一個使用了AWE 內(nèi)存的進(jìn)程,究竟總共用了多少內(nèi)存。我們只能借助SQLServer:Memory Manager一Total Server Memory來判斷SQL Server的Buffer Pool使用量。至于SQL Server自己申請的內(nèi)存總數(shù)(Buffer Pool + MemToLeave ),可以通過查詢和內(nèi)存相關(guān)的DMV計算出來,但第三方的代碼申請的內(nèi)存,就很難做精確計算了

   

    5.當(dāng)系統(tǒng)有內(nèi)存壓力的時候,SQL Server總是會自動釋放內(nèi)存

    默認(rèn)情況下,SQL Server的確會在系統(tǒng)有內(nèi)存壓力的時候自動釋放內(nèi)存但是有個例外:SQL Server啟動時會試圖做“Lock Page In Memory”的動作。如果啟動賬號有這個權(quán)限,動作就會成功。那么當(dāng)同一臺服務(wù)器上的其他應(yīng)用程序需要內(nèi)存的時候,SQL Server很可能不會釋放內(nèi)存。所以在這種情況下,建議SQL Server設(shè)置Max Server Memory上限。

(注:Lock Page In Memory很多資料上寫到SQL的內(nèi)存不會被釋放了,但實際情況中,當(dāng)操作系統(tǒng)感覺到壓力一樣會把SQL的內(nèi)存釋放掉,也是錯誤理解6的由來)

    6.  SQL Server有辦法將自己的內(nèi)存綁定在物理內(nèi)存里

    SQL Server的確想通過Lock Page In Memory的方法達(dá)到這個目的。但是,作為一個用戶態(tài)為主的應(yīng)用程序,它還是會受限于核心態(tài)。如果核心態(tài)里發(fā)出內(nèi)存要求,SQL Server就會被迫把自己的內(nèi)存釋放出來。

    7.增加MemToLeave的大小可以提高SQL Server的性能

    在32位的SQL Server上,默認(rèn)MemToLeave是256 MB+0.5 MB x ( Max Thread數(shù)目)。如果MemToLeave 用完了,SQL Server的一些重要功能就不能進(jìn)行,甚至新的連接都建立不起來所以一些對MemToLeave需求比較大的SQL Server,例如,一些經(jīng)常運行Linked Server分布式查詢的SQL Server,或者是一些運行CLR,Extended Stored Procedur的SQL Server,可能不得不再加一些MemToLeave空間。這可以使用SQL Server的

一個啟動參數(shù)一g完成。例如,如果想把MemToLeave設(shè)成512 MB+0.5 MB x ( Max Thread數(shù)目),可以加啟動參數(shù)一g512。

    但是需要想清楚的是,SQL Server的虛擬地址空間只有2 GB,給MemToLeave越多,Buffer Pool能拿到的就越少。Data Cache的內(nèi)存還可以從AWE擴(kuò)展的內(nèi)存補,Buffer Pool里的Stolen內(nèi)存就沒辦法了。所以其實這是拆東墻補西墻,關(guān)鍵要看哪一塊內(nèi)存對SQL Server的性能和穩(wěn)定運行最重要。不必要多給,這會浪費資源,影響B(tài)uffer Pool里面的性能。只有確定了SQL Server的MemToLeave的確不夠,才應(yīng)該去增大它

8.增加物理內(nèi)存一定會提高SQL Server的性能

    既然SQL Server這么喜歡內(nèi)存,那管理員多給服務(wù)器配備一些內(nèi)存,是不是就一定能夠提高性能呢?很多時候這個想法是對的,但是并不是總是正確。這是因為增加的內(nèi)存SQL Server不一定用得到。

    (1)首先要檢查是哪一部分的內(nèi)存有瓶頸,是Database Cache,還是Stolen,是Buffer Pool,還是MemToLeave。

    (2)要檢查缺的那部分內(nèi)存是不是已經(jīng)到了理論上的上限,新加內(nèi)存SQL Server用不用得上例如,在32位+AWE的服務(wù)器上,Buffer Pool里的Stolen Memory最多也不過1.6 GB。如果是這一部分內(nèi)存不夠,再加內(nèi)存也沒有用。只有將系統(tǒng)升級到64位,才能突破這些限制。

    (3)加人的內(nèi)存,一般大部分都會被Buffer Pool使用,這樣SQL Server就會緩存更多的數(shù)據(jù)頁面和執(zhí)行計劃,大多數(shù)時候這會對性能有幫助。如果Database Pages沒有壓力,SQL Server會緩存太多的動態(tài)T-SQL執(zhí)行計劃,對性能沒什么好處,反而會增加SQL Server的維護(hù)成本。只有在SQL Server的Database Page缺內(nèi)存的時候,增加內(nèi)存才會對性能有明顯幫助。如果數(shù)據(jù)庫比較小,常用數(shù)據(jù)頁面已經(jīng)緩存在了內(nèi)存里,增加內(nèi)存對性能不會有太大幫助。

(注:內(nèi)存這個東西對于一些初級DBA分析起來還是有些難度,而很多情況下只要看到內(nèi)存壓力就要添加內(nèi)存這樣也是不對的,很多時候內(nèi)存的消耗很自己程序的語句優(yōu)化程度也有著非常大的關(guān)系)

9. Stolen的內(nèi)存真的是偷來的嗎

  很多在描述Stolen的內(nèi)存塊的時候都說這塊內(nèi)存是不需要保留(Reserve)而直接提交(Commit )使用的,所以這塊內(nèi)存叫作Stolen。這么說錯了嗎?其實,從Windows的層面,對于任何內(nèi)存的使用,都必須遵循先Reserve再Commit的過程。對于一塊內(nèi)存,如果不Reserve而直接使用會導(dǎo)致訪問違例(Access Violation)因為SQL Server內(nèi)部的內(nèi)存管理機制,所有要使用的內(nèi)存,Buffer Pool都已經(jīng)幫我們保留(Reserve)好了如果SQL所要做的,是用Buffer Pool已經(jīng)保留(Reserve)好了的那部分地址空間去直接提交(Commit ),而且,這一部分內(nèi)存又不是用來存放Buffer的,就被稱為Stolen

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)站名稱:一些內(nèi)存使用錯誤理解-創(chuàng)新互聯(lián)
文章出自:http://muchs.cn/article14/cechde.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗域名注冊、定制網(wǎng)站網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)