SQL Server記憶體

来源:http://www.cnblogs.com/wenBlog/archive/2017/09/04/7474300.html
-Advertisement-
Play Games

背景 最近一個客戶找到我說是所有的SQL Server 伺服器的記憶體都被用光了,然後截圖給我看了一臺伺服器的任務管理器。如圖 這裡要說明一下任務管理器不會完整的告訴真的記憶體或者CPU的使用情況,也就是說這裡只能得到非精確的信息,有可能就是一個假警報。 為了讓我的客戶放心,我檢查了伺服器並且查看了很多 ...


背景

最近一個客戶找到我說是所有的SQL Server 伺服器的記憶體都被用光了,然後截圖給我看了一臺伺服器的任務管理器。如圖

這裡要說明一下任務管理器不會完整的告訴真的記憶體或者CPU的使用情況,也就是說這裡只能得到非精確的信息,有可能就是一個假警報。

為了讓我的客戶放心,我檢查了伺服器並且查看了很多性能指標。我所看到的就是CPU和硬碟使用都是很低的只有記憶體是高的,這恰恰是我們期望的SQLServer 伺服器的狀態。SQL Server會儘可能的使用記憶體,通過緩存儘可能多的磁碟來改善性能。當然如果OS需要它也會立即釋放資源回來。

SQL Server 對記憶體是“貪得無厭”的,它會持有所有分配給它的記憶體,不論是否使用。而這也是我們想要它去做的。因為它會存儲數據和執行計劃在緩存中,然後當使用完這些記憶體時,它不會釋放這些記憶體,緩存到記憶體中,除非兩種情況才會釋放緩存的數據記憶體:1) SQL Server 重啟或者記憶體不足 2) 操作系統需要記憶體 
預設的記憶體設定就是使用所有記憶體(安裝時設置),當操作系統需要記憶體時,它也會大量釋放記憶體。然後等到有記憶體時在重新大量持有。但是這種不是最佳實踐,最好還是設定一個最大記憶體限制,這樣操作系統就會保證一定量的記憶體永遠為SQL Server 使用。

 

當看到資源管理器,Available MB 的記憶體有兩部分組成Standby--備用和Free--可用,這Standby 的空間系統已經把它緩存了,而Free的記憶體意味著沒有被使用。它們都叫做可利用記憶體。因此針對一開始那個客戶擔憂我們大可不必太擔心。當然我們還需要健康其他的性能計數器,查明是否存在記憶體影響性能的隱患。需要關註的指標如下:

  • Page Life Expectancy
  • Available Bytes
  • Buffer Cache Hit Ratio
  • Target & Total Server Memory
  • Memory Grants Pending
  • Pages/sec (Hard Page Faults)
  • Batch Requests/sec & Compilations/sec

介紹下這些性能參數:

Page Life Expectancy (PLE)

這個性能計數器記錄了數據頁(非鎖定)在緩衝池中的平均時間。在生產高峰這個數值可能比較低,但是一般要保持這個數據在300s以上,數據待在緩衝中時間越長,那麼SQL的IO操作越少。

如果長期這個數值在300s以下,可以考慮增加記憶體,當然由於現在記憶體越來越大,這個值也變得不那麼重要了,但是對於中小系統依然可以作為一個標準閾值。

由於這個閾值基於32位系統的4G記憶體,那麼標準演算法可以大致可以推算:記憶體大小(GB)/4*300

也可以使用下麵的語句來查詢該計數器:

SELECT [cntr_value] FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%Buffer Manager%' AND [counter_name] = 'Page life expectancy'

Available MBytes

該計數器監測還有多少可用記憶體,是否操作系統存在記憶體壓力。一般我們調查是否這個計數器持續在500MB以下,這說明記憶體過低。如果持續低於500則說明你需要增加更多的記憶體。

這個計數器不能通過T-SQL查詢,只能通過性能監視器觀察。

Buffer Cache Hit Ratio

緩衝命中率,這個計數器記錄平均多少頻率從緩衝池中取得數據。我們在OLTP資料庫中一般這個比率是90%-95%(該數值經由@MSSQL123 指出發現是錯誤的,再次進行修改)。由於sqlserver 把預讀也作為緩衝比例,所以導致該值很高,所以該計數器只做理解,不能作為真實性能瓶頸參考了。如果該計數器持續低於90%,則需要增加記憶體。

在可以使用下麵的T-SQL語句查詢:

SELECT [cntr_value] FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%Buffer Manager%' AND [counter_name] = 'Buffer cache hit ratio'

Target & Total Server Memory

伺服器當前總記憶體(buffer)以及目標記憶體,在緩衝池初始化增加記憶體的時候,總記憶體會比目標記憶體稍低一點。這個比例會逐漸接近1,如果總記憶體沒有增長很快,就會顯著低於目標記憶體,這就表示如下兩點:

1)  你可以分配儘可能多的記憶體,SQL能緩存整個資料庫到記憶體中,然後如果資料庫小於機器記憶體,記憶體不會完全用光,在這種情況下,總記憶體將永遠小於目標記憶體。

2)  SQL不能增加緩衝池,比如系統記憶體有壓力。如果這種情況你需要增加最大伺服器記憶體,或者增加記憶體來改善性能。

SELECT [cntr_value] FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%Memory Manager%' AND [counter_name] IN ('Total Server Memory (KB)','Target Server Memory (KB)')

Memory Grants Pending

這個計數器測量等待記憶體授予的SQL的進程數量。一般推薦閾值為1或者更少。如果大於1這說明記憶體不足按順序等待記憶體釋放再操作SQL。

一般工作中出現這種等待可能是由於糟糕的查詢,缺失索引,排序或者哈希引起的。為了查明原因可以查詢DMV --sys.dm_exec_query_memory_grants 這個視圖,將會展示哪一個查詢需要記憶體授予執行。

如果不是以上原因引起的記憶體等待,則需要增加記憶體來解決這個問題。此時就有理由增加硬體了。查詢的T-SQL語句如下:

SELECT [cntr_value] FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%Memory Manager%' AND [counter_name] = 'Memory Grants Pending'

Pages/sec (Hard Page Faults)

這裡也使用資料庫級別計數器:當需要讀取或寫入的頁不在記憶體中,需要到磁碟中讀取時計數。這個計數器是一個記錄讀和寫的總和並且不能直接在記憶體中獲取只能從因盤中讀取(導致resulting in hard page faults),這個問題是由於操作系統必須交換文件在磁碟上,當訪問記憶體時,記憶體不足則需要交換文件到磁碟上,由於磁碟讀寫速度遠低於記憶體,性能就會受到嚴重影響。

對於這個計數器,推薦閾值為<50(或者某個穩定值),如果看到高於這個值,不過需要註意,只要這個值能夠穩定在一個較低的水平,沒有持續性的大批量數據的寫入(磁碟)於讀取(從磁碟載入記憶體),都可以接受。相反,如果長期在一個高位水平,並且觀察到PLE不能穩定在參考值範圍內,說明記憶體可能存在瓶頸。當然,如果資料庫備份或者還原,包括導出、導入數據以及記憶體中映射文件等等這些也會導致性能計數器超出某個穩定值。

Batch Request & Compilations

該計數器包含兩個檢查

  • SQL Server: SQL Statistics – Batch Request/Sec.  傳入查詢的數量(批處理數量)
  • SQL Server: SQL Statistics - Compilations/Sec.  新建立的執行計劃數量

如果Compilations/sec是25%或者相對Batch Requests/sec更高,則執行計劃將被放到緩存中,但是永遠不會重用執行計劃。寶貴的記憶體就被浪費了,而不是緩存數據。這是糟糕的實踐,我們要做的就是阻止這種情況,

如果Compilation/sec 很高比如100,表示有大量的即席查詢正在運行。這時可以啟用“optimize for ad hoc”把執行計劃緩存,但是只有在第二次查詢時才能被使用。

使用如下T-SQL可以得到相應的指標:

SELECT [cntr_value] FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%SQL Statistics%' AND [counter_name] = 'Batch Requests/sec';

SELECT [cntr_value] FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%SQL Statistics%' AND [counter_name] = 'SQL Compilations/sec';

同樣可以獲得比率:

SELECT ROUND (100.0 * (SELECT [cntr_value] FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%SQL Statistics%' AND [counter_name] = 'SQL Compilations/sec') / (SELECT [cntr_value] FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%SQL Statistics%' AND [counter_name] = 'Batch Requests/sec') ,2) as [Ratio]

關於如何設定資料庫可用的記憶體最大值,如圖所示:

推薦閾值:一般來說,我都是採用10%用於操作系統其它90%分配給資料庫。當然如果記憶體很大可以調整這個比例小於1/9,對於記憶體較小的通常我都預留4-6G左右給操作系統。

我們看一下實際例子:

在性能監視器中看一下這個計數器,我們可以看到這個伺服器處於健康狀態下,有11GB的可用空間,沒有PageFaults(I/O只從緩存中沒有交換到磁碟),緩衝的比率為100%,PLE超過20000s,沒有記憶體等待,充足的總記憶體和較低的編譯比率(編譯數/查詢數).

這個測量數據很容易理解,這要比任務管理器更具有作用,能依據此做出判斷是否有足夠的記憶體在這台SQL Server伺服器上。

總結

    如果只根據任務管理器來做出判斷,我們很容易出現錯誤決定。因為不管系統多少記憶體,SQL Server 會儘可能的使用占用記憶體,這不是bug。緩存數據在記憶體中有很好的效果,意味著伺服器是健康的,也為用戶提供了更好的執行效率。在實際資料庫環境中,一般突然遇到的性能問題多半是因為T-SQL語句引起的,就如我前面提到糟糕的查詢(缺失索引、排序、哈希等等),這個時候通過語句優化可以很好的解決突發問題,這裡就不詳解了。如果伺服器普遍存在文章中出現的記憶體性能計數器問題,那就寫報告提交記憶體增加需求吧。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 什麼是HTML5 網頁的5.0版本。2014年才定製完HTML5的標準,歷時8年 2. 為什麼要用HTML5 1> 跨平臺:利用HTML5編寫的UI界面能運行在所有擁有瀏覽器的平臺 2> HTML5的運行平臺:瀏覽器 3> 但是HTML5不能完成一些特定的功能,比如:拍照(ImagePicke ...
  • 前言 Electron 是一個搭建跨平臺桌面應用的框架,僅僅使用 JavaScript、HTML 以及 CSS,即可快速而容易地搭建一個原生應用。這對於想要涉及其他領域的開發者來說是一個非常大的福利。 原文作者:林鑫,作者博客:http://blog.gdfengshuo.com/ 項目介紹 倉庫地 ...
  • 使用 Android studio 開發項目中,有幾種引用三方代碼的方式:jar 包 ,類庫 ,gradle.build 的compile依賴。 大家會發現github上不少的項目只提供compile依賴的方式,但是當用到jar包使用過的情況 且 該項目不提供jar包的時候怎麼辦? 其實Androi ...
  • NSArray、NSMutableArray、NSDictionary、NSMutableDictionary、是我們的在iOS開發中非常常用的類。當然,在享受這些類的便利的同時,它們也給我們帶來一些困擾。粗心我們可能會調用addObject:傳入一個nil, 也有可能是會objectAtIndex ...
  • 1. standard standard 是活動預設的啟動模式,在不進行顯式指定的情況下,所有活動都會自動使用這個啟動模式。對於使用 standard 模式的活動,系統不會在乎活動是否已在返回棧中存在,每次啟動都會創建一個新的活動實例。 2. singleTop 當活動的啟動模式指定為 single ...
  • 效果圖 源碼 https://github.com/YouXianMing/Animations 說明 1. 數據適配器PickerViewDataAdapter含有PickerViewComponent的數組以及行高的信息,數組中有幾個Component就有幾列 2. PickerViewComp ...
  • 視圖的操作: 1.視圖的創建: create view view_name as 查詢語句; 2.視圖的查看: show tables;// 顯示所有的表和視圖 show create view view_name; desc view_name; show table status from ta ...
  • TensorFlow™ 是一個採用數據流圖(data flow graphs),用於數值計算的開源軟體庫 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...