Sql-Server

如何使用 t-sql 提取性能計數器“記憶體:頁數/秒”?

  • January 29, 2016

我已經用Google搜尋了這個,到目前為止,沒有運氣,所以轉向所有你很棒的大師尋求幫助。

我試圖弄清楚是否有辦法使用 t-sql 獲取 perfmon 計數器“記憶體:頁數/秒”,因為我試圖將它作為自定義指標添加到我們的 Ignite 監控工具中。我查看了 sys.dm_os_performance_counters DMV,但沒有找到它。

有人知道這樣做的方法嗎?提前致謝 :)

按照@Srutzky 僅查看頁面錯誤/秒(而不是頁面/秒)的範例,您可以這樣做:

DECLARE @before BIGINT, @after BIGINT;

SELECT @before = page_fault_count FROM sys.dm_os_process_memory;

WAITFOR DELAY '00:00:10';

SELECT @after = page_fault_count FROM sys.dm_os_process_memory;

SELECT PageFaultsPerSec = (1.0*@after - @before)/10.0;

您可能只需要對以下指標進行 Ignite 民意調查:

SELECT page_fault_count FROM sys.dm_os_process_memory

然後根據門檻值或增量設置警報。但我仍然建議您聯繫他們以了解如何最好地基於來自任意 DMV 的列實現自定義指標,這可能與性能計數器 DMV 不同。

理想情況下/從長遠來看,我同意@Aaron(對問題的評論)關於聯繫 SolarWinds 要求他們為此創建自定義指標。但即使你這樣做並且他們接受了這個想法,他們也可能需要一段時間才能發布它。同時,或者如果您只想以臨時方式查看此資訊,您可以嘗試以下操作:

如果該指標確實與報告的“頁面錯誤”指標相同DBCC MEMORYSTATUS (請參閱底部的註釋) ,那麼您可以執行以下操作:

DECLARE @BeginningValue TABLE
(
 [Counter] NVARCHAR(100) NOT NULL,
 [Value] BIGINT NOT NULL,
 [InsertTime] DATETIME NOT NULL DEFAULT (GETDATE())
);
DECLARE @EndingValue TABLE
(
 [Counter] NVARCHAR(100) NOT NULL,
 [Value] BIGINT NOT NULL,
 [InsertTime] DATETIME NOT NULL DEFAULT (GETDATE())
);
---

INSERT INTO @BeginningValue ([Counter], [Value])
 EXEC ('DBCC MEMORYSTATUS;');

WAITFOR DELAY '00:00:10.000'; -- 10 second pause

INSERT INTO @EndingValue ([Counter], [Value])
 EXEC ('DBCC MEMORYSTATUS;');
---

DELETE FROM @BeginningValue WHERE [Counter] <> N'Page Faults';
DELETE FROM @EndingValue WHERE [Counter] <> N'Page Faults';

SELECT lst.Value AS [EndingValue], frst.Value AS [BeginningValue],
      lst.InsertTime AS [EndingTime], frst.InsertTime AS [BeginningTime],
      (lst.Value - frst.Value) AS [Difference],
      DATEDIFF(SECOND, frst.InsertTime, lst.InsertTime) AS [NumSeconds],
      CONVERT(DECIMAL(14, 4),
              (((lst.Value - frst.Value) * 1.0) /
                       DATEDIFF(SECOND, frst.InsertTime, lst.InsertTime))
             ) AS [PageFaults/Sec]
FROM   @BeginningValue frst
CROSS JOIN @EndingValue lst;

回報:

Ending  Beginning  EndingTime               BeginningTime            Diff  Sec.  Faults/Sec
418529  418497     2016-01-28 13:13:27.850  2016-01-28 13:13:17.827  32    10    3.2000

筆記

  • 如果您使用的是 SQL Server 2008 或更高版本,請使用sys.dm_os_process_memory DMV(如@Aaron 的回答中所指出的那樣),否則您可以使用DBCC MEMORYSTATUS我上面顯示的方法。DBCC MEMORYSTATUS由於忽略了從任何 DMV 返回的欄位,我只推薦了(因此這種擷取它返回的資訊的方法)。但是我已經對它們進行了測試並且它們返回相同的值,因此DBCC MEMORYSTATUS如果您可以訪問sys.dm_os_process_memoryDMV,則確實沒有充分的理由使用這些額外的工作。
  • 我在最初發布此答案時沒有詳細說明這一點,但樣本之間的 10 秒實際上相當低,並且可能會降低結果指標的準確性。理想情況下,將使用更大的數字——如果不是 60 秒,至少 30 秒。然而,令人擔憂的是,讓監控工具呼叫此程式碼(我假設它將被放入儲存過程中)會在監控軟體中引入潛在風險,考慮到延遲是超時,或者以某種方式延遲其處理或收集其他指標。因此,我使用 10 秒作為一種更注重可靠性而非準確性的方法。這可以追溯到我一開始所說的關於同意@Aaron 的理想情況的立場,即軟體供應商提供了一種本機/內置的方法來收集這些資訊。

引用自:https://dba.stackexchange.com/questions/127625