sql server 性能調優 資源等待之記憶體瓶頸的三種等待類型

来源:https://www.cnblogs.com/MrHSR/archive/2018/08/08/9350174.html
-Advertisement-
Play Games

一.概述 這篇介紹Stolen記憶體相關的主要三種等待類型以及對應的waittype編號,CMEMTHREAD(0x00B9),SOS_RESERVEDMEMBLOCKLIST(0x007B),RESOURCE_SEMAPHORE_QUERY_COMPILE(0x011A)。也可以通過sysproce ...


一.概述

  這篇介紹Stolen記憶體相關的主要三種等待類型以及對應的waittype編號,CMEMTHREAD(0x00B9),SOS_RESERVEDMEMBLOCKLIST(0x007B),RESOURCE_SEMAPHORE_QUERY_COMPILE(0x011A)。也可以通過sysprocesses里查看連接處於某個等待狀態, waittype!=0x0000。

select * from sys.sysprocesses where waittype!=0x0000 and spid>50

   再次看下Stolen記憶體的分配場景:

1. CMEMTHREAD記憶體 

  cmemthread是指多個用戶同時往同一塊緩存里申請或釋放記憶體時,在一個時間點上, 只有一個連接可以做申請或釋放記憶體動作, 其他連接必須等待。原因:出現這種等待的原因通常是發生在併發度非常高的sqlserver里,而這些併發的連接,在大量地使用需要每次都做編譯的動態t-sql語句。 解決:修改客戶連接行為,儘可能更多地使用存儲過程, 或者使用參數化的t-sql語句,減少語句編譯量增加執行計劃的重用,避免大量連接同時申請記憶體做語句編譯的現象。

    在生產環境下cmemthread平均每次請求時間為0.20ms(1570876.0/7825922.0=0.20)

2.SOS_RESERVEDMEMBLOCKLIST

  sos_reservedmemblocklist是指當用戶要申請MemtoLeave這塊記憶體時而暫時不能滿足就會出現等待。原因:當用戶發過來的語句內含有大量參數,或者有一個in 子句,它的執行計劃在8kb的singlepage里可能放不下,需要用multi-page來存儲。當緩存的執行計劃越來越多,multi-page里的記憶體也會越來越多。 解決:(1)避免使用帶有大量參數或者長in子句的語句,這種語句需要消耗比正常語句更多的記憶體及cpu資源, 改變的方法是可以把參數值存儲到臨時表,用join來連接。(2)定期運行dbcc freeproccache 語句,手工清除緩存中的執行計劃,緩存記憶體壓力。

-- 查看緩存占用空間
SELECT SUM(CONVERT(DECIMAL(18,4),size_in_bytes))/1024.0/1024.0 AS 'sizeMB'
FROM sys.dm_exec_cached_plans
--查看緩存中的對象類型,重用次數,sql語句,緩存空間大小,可以根據幾個維度來統計
SELECT  usecounts,size_in_bytes/1024.0 AS 'sizeKB',cacheobjtype,objtype,[text] 
FROM sys.dm_exec_cached_plans 
CROSS APPLY sys.dm_exec_sql_text(plan_handle) 
WHERE usecounts > 1  
ORDER BY usecounts DESC

  

3.RESOURCE_SEMAPHORE_QUERY_COMPILE

   resource_semaphore_query_compile是指:當編譯的語句需要的記憶體達到了sqlserver的編譯記憶體上限時(sqlserver會為編譯記憶體設置一個上限),其它語句將進入等待狀態,等前面的語句編譯完成,把記憶體釋放出來以後,後面的語句才能繼續編譯。解決(1)修改客戶連接行為,儘可能更多地使用存儲過程, 或者使用參數化的t-sql語句,減少語句編譯量,增加執行計劃的重用,避免大量連接同時申請記憶體做語句編譯的現象.(2)簡化每次需要編譯語句的複雜度,降低編譯需要的記憶體量。(3)當stolen 記憶體使用總量比較大的時候,也可以定期執行dbcc freeproccache 。

總結:以上三種等待類型,當緩存的執行計劃越來越多,存放buffer pool里的stolen記憶體在不斷增長,當需要的記憶體超過8kb時,multi-page里的存儲執行計劃stolen記憶體也會越來越多 。能過sys.sysprocess.waittype欄位,可以檢查stolen記憶體上是否有瓶頸。通過sql server 記憶體初探 知道 sql server里的Consumer下的功能組件,第三方代碼,線程都是能過stolen方式直接提交,並不需要先申請記憶體。

  查看記憶體使用情況

-- 按申請方式統計記憶體 (Reserve 再commit)(直接commit叫Stolen)   
SELECT 
SUM(virtual_memory_reserved_kb)/1024.0 AS 'reserved(MB)',
SUM(virtual_memory_committed_kb)/1024.0 AS 'committed(MB)',
(SUM(single_pages_kb)+SUM(multi_pages_kb))/1024.0 AS 'Stolen(MB)'
 FROM sys.dm_os_memory_clerks
 
 -- 按申請記憶體頁大小統計記憶體    
SELECT 
(SUM(virtual_memory_committed_kb)+SUM(single_pages_kb))/1024.0 AS 'Buffer Pool(MB)',
SUM(multi_pages_kb)/1024.0 AS 'MemToLeave(MB)'
 FROM sys.dm_os_memory_clerks

   按申請方式統計記憶體,共申請了92576MB,提交了83621MB, 在Stolen中有9244MB。 如下圖所示:

  按申請記憶體頁大小(<=8kb  >8kb)統計記憶體:
  

 


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

-Advertisement-
Play Games
更多相關文章
  • 預設的Centos6.5 glibc版本最高為2.12, 而在進行Nodejs開發時項目所依賴的包往往需要更高版本的glibc庫支持, 因此在不升級系統的前提下, 需要主動更新系統glibc庫. 一般遇到錯誤libc.so.6: version GLIBC_2.14 not found時表示需要對g ...
  • 之前租的伺服器沒有中文亂碼的問題,最近重裝了一下系統, 出現了中文亂碼, 以下是解決方案: 輸入locale查看當前的語言是否是中文 如果不是, 輸入添加中文字元集: 還可以 查看本地安裝的語言包有哪些: 接著 輸入 修改內容為(原內容最好註釋掉別刪): 保存退出並使該文件立即生效執行如下命令: 完 ...
  • DNS(Domain Name System,功能變數名稱系統),網際網路上作為功能變數名稱和IP地址相互映射的一個分散式資料庫,能夠使用戶更方便的訪問互聯網,而不用去記住能夠被機器直接讀取的IP數串。 查看dns 可以使用 /etc/resolv.conf 文件,nslookup 命令 和 dig 命令: 配置 d ...
  • 1 海量數據的存儲問題 如今隨著互聯網的發展,數據的量級也是撐指數的增長,從GB到TB到PB。對數據的各種操作也是愈加的困難,傳統的關係性資料庫已經無法滿足快速查詢與插入數據的需求。這個時候NoSQL的出現暫時解決了這一危機。它通過降低數據的安全性,減少對事務的支持,減少對複雜查詢的支持,來獲取性能 ...
  • 占座 ...
  • [20180808]exists and not exists.txt--//生產系統遇到的一個性能問題,通過例子來說明:1.環境:SCOTT@test01p> @ ver1PORT_STRING VERSION BANNER CON_ID IBMPC/WIN_NT64-9.1.0 12.1.0.1 ...
  • 一、基本概念 1.資料庫: 資料庫(DataBase)就是一個存儲數據的倉庫,為了方便數據的存儲和管理,它將數據按照特定的規律存儲在磁碟上。通過資料庫管理系統,可以有效的組織和管理存儲在資料庫中的數據。資料庫是數據管理軟體。數據存儲分為三個階段:人工管理階段、文件系統階段和資料庫系統階段。 2.數據 ...
  • 一.key_buffer 上一篇瞭解key_buffer設置,key_buffer_size指定了索引緩衝區的大小,它決定索引處理的速度,尤其是索引讀的速度。通過檢查狀態值Key_read_requests和Key_reads,可以知道key_buffer_size設置是否合理。比例key_read ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...