web-dev-qa-db-ja.com

t-sqlを使用してperfmonカウンター "Memory:Pages / Sec"を抽出するにはどうすればよいですか?

私はこれまでグーグルで検索してきましたが、運が悪いので、すばらしいグルたちに助けを求めてください。

Ignite監視ツールでカスタムメトリックとして追加しようとしているので、t-sqlを使用してパフォーマンスカウンター "Memory:Pages/Sec"を取得する方法があるかどうかを確認しようとしています。私はsys.dm_os_performance_counters DMVを調べましたが、そこには見つかりませんでした。

誰かがこれを行う方法を知っていますか?前もって感謝します :)

4
Chinesinho

@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とは異なる場合があります。

2
Aaron Bertrand

理想的には/長期的には、SolarWindsに連絡してカスタムメトリックを作成するよう依頼することについて、@ Aaron(質問の コメント )に同意します。しかし、あなたがそれをしてもそして彼らはアイデアを受け入れますが、彼らがそれをリリースするのにしばらく時間がかかるかもしれません。それまでの間、またはこの情報をその場限りの方法で表示したい場合は、次のことを試してください。

[〜#〜] if [〜#〜]そのメトリックは実際には「 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の answer で指摘されている)を使用してください。それ以外の場合は、DBCC MEMORYSTATUSを使用できます。上に示しました。 DMVから返されるフィールドを見落としているため、私はDBCC MEMORYSTATUS(したがって、返される情報を取得するこのメソッド)のみを推奨していました。しかし、私は両方をテストしましたが、同じ値を返します。したがって、DBCC MEMORYSTATUS DMVへのアクセス権がある場合、余分な作業が伴うため、sys.dm_os_process_memoryを使用する十分な理由はありません。

  • この回答の最初の投稿ではこれについて詳しく説明していませんが、サンプル間の10秒は実際にはかなり短く、結果として得られるメトリックの精度が低下する可能性があります。理想的には、より大きな数(少なくとも60秒ではなくても30秒)を使用することになります。ただし、懸念事項は、監視ツールがこのコードを呼び出すことです(私はそれがストアドプロシージャに配置されると想定していました)、遅延をタイムアウトと見なして監視ソフトウェアに潜在的なリスクをもたらすか、どういうわけかその処理または他のコレクションの遅延を引き起こしますメトリック。したがって、精度よりも信頼性を優先する手段として10秒を使用しました。これは、ソフトウェアベンダーがこの情報を収集するためのネイティブ/組み込みの手段を提供するという理想的なシナリオの@Aaronの立場に同意することについて、最初に私が言ったところに戻ります。

1
Solomon Rutzky