2012-01-13 10 views
0

自分のアプリケーション(何千もの場所に展開されている)を使用して、独自の環境、特にSQLサーバーボックスを監視できるようにしたいと思います。 SQL Serverがローカルの場合、System.Diagnosticsライブラリを使用してWindowsパフォーマンスカウンタを収集することができますので、これは簡単です。しかし、SQL Serverがリモートの場合、私のC#アプリケーション(この場合はWindowsサービス)がリモートSQLサーバマシンにアクセスできる保証ができないため、問題があります。それ以外の点は、SQL Serverにアクセスできることです。SQLサーバーを介してWindowsパフォーマンスカウンターをリモートで収集する方法

私はどのように私はWindowsパフォーマンスのカウンタを収集することができますか?

私が考えてきた方法の1つはSQL CLRを使用することですが、UNSAFEアクセスが必要なように思われます。これは私が望ましくないと確信しています。

おかげ

+0

明確にするために、アプリケーションを実行しているマシンのパフォーマンスカウンタ統計をデータベースで収集できるようにしますか? –

+0

MS-SQL CLRには、あなたの要件に合ったSAFEモードがあります。http://msdn.microsoft.com/en-us/library/ms345101.aspx –

+0

@ M.BabcockアプリケーションやSQLが必要ですSQL Serverを実行しているマシンのパフォーマンスカウンタの統計情報を収集するサーバー。 – Mark

答えて

4

マークあなたが適切な特権を持っているかどうかを確かめるために、何らかの機能をインストーラに書き込むges(おそらく管理者権限なしではインストールできません)。カウンターアクセス。

あなたが監視しようとしていた正確に何を述べるませんでした、しかし、私は、構築されたint型のSQL Serverの動的管理ビュー(DMVの)

MSDN
Good Articles Videos
Very Useful Examples

を使用することをお勧めかもしれませんこれらはSQL Serverの最近のリリースで非常に堅牢になり、perfmon(CPU、IO、MEMORYなど)で動作する大部分の統計情報を監視することができます。おそらくperfmonほど細かいものではないかもしれませんが、通常は速い関連データのために現在はperfmonよりも有用であることがわかります。また、接続文字列ユーザーが管理者権限を持っている限り、サーバーの特権について心配する必要はありません。そして、この機能性はすでにSQL Serverに組み込まれています。パフォーマンスモニタは、しかし、それはあなたが特定のデータベース・ファイルに焦点を当てることを可能にするようここで


編集... @マークがないよう、正確な、私はデータベース上のIO時間を取得するために使用するいくつかのDMVスクリプトです。

「dm_io_virtual_file_stats」DMV

select 
read_stall_ms = case when num_of_reads = 0 then 0 else (io_stall_read_ms/num_of_reads) end, 
write_stall_ms = case when io_stall_write_ms = 0 then 0 else (io_stall_write_ms/num_of_writes) end, 
total_stall_ms = case when (num_of_reads = 0 and num_of_writes = 0) then 0 else (io_stall/(num_of_reads + num_of_writes)) end, 
db = db_name(vfs.database_id), 
mf.physical_name, 
vfs.* 
from sys.dm_io_virtual_file_stats(null, null) as vfs 
join sys.master_files as mf on vfs.database_id = mf.database_id and vfs.file_id = mf.file_id 
order by total_stall_ms desc 

select m.database_id, 
db_name(m.database_id) as database_name, 
m.file_id, 
m.name as file_name, 
m.physical_name, 
m.type_desc, 
fs.num_of_reads, 
fs.num_of_bytes_read, 
fs.io_stall_read_ms, 
fs.num_of_writes, 
fs.num_of_bytes_written, 
fs.io_stall_write_ms 
from sys.dm_io_virtual_file_stats(NULL, NULL) fs 
join sys.master_files m on fs.database_id = m.database_id and fs.file_id = m.file_id 

少し凝っ...

select db_name(d.database_id) as database_name, 
quotename(object_schema_name(d.object_id, d.database_id)) + N'.' + quotename(object_name(d.object_id, d.database_id)) as object_name, 
d.database_id, 
d.object_id, 
d.page_io_latch_wait_count, 
d.page_io_latch_wait_in_ms, 
d.range_scans, 
d.index_lookups, 
case when mid.database_id is null then 'N' else 'Y' end as missing_index_identified 
from (select 
     database_id, 
     object_id, 
     row_number() over (partition by database_id order by sum(page_io_latch_wait_in_ms) desc) as row_number, 
     sum(page_io_latch_wait_count) as page_io_latch_wait_count, 
     sum(page_io_latch_wait_in_ms) as page_io_latch_wait_in_ms, 
     sum(range_scan_count) as range_scans, 
     sum(singleton_lookup_count) as index_lookups 
    from sys.dm_db_index_operational_stats(NULL, NULL, NULL, NULL) 
    where page_io_latch_wait_count > 0 
    group by database_id, object_id) as d 
left join (select distinct database_id, object_id from sys.dm_db_missing_index_details) as mid on mid.database_id = d.database_id and mid.object_id = d.object_id 
+0

これは最善のアプローチだと思います。残念ながら、私は物理ディスクを収集しようとしています - 私はDMVで見つけることができませんAveディスク秒/読み取り。 – Mark

+1

@マークI/Oのために "dm_io_virtual_file_stats"をチェックしてください。IOのためのその他のDMVもいくつかあります。exacmpleの編集を参照してください。 –

-2

は、私はあなたがこのために自己ロールのSQL CLRよりも堅牢なものが必要だと思うでしょう。 MSには、これをSCOMと呼ぶツールがあります。

私は50台のサーバーを持つenvsで非常に良い結果を得ています。

ポイント・イン・タイム・レポート、データ・ウェアハウスおよびアラートを使用して、構成可能なデータのロードを収集します。あなたは

どちらかあなたが持っている

"私は、適切な権限を持っていることを保証することはできません" のコメントで述べたように

good wikipedia article

technet

+0

質問に記載されているとおり、このアプリケーションは何千もの場所に展開されています。 1台のマシンからいくつかのパフォーマンスカウンタを収集するために、SCOMを何千もの場所に配置することは実際には不可能です。 – Mark

1

あなたのアセンブリに署名した場合、あなたはそれ付与、アセンブリからログインを作成することができますをチェックアウト安全でないアセンブリを実行し、dllからアセンブリを作成するサーバーレベルのアクセス許可。これにより、データベース上の信頼できるフラグをオンにしなくても安全でないアセンブリを実行することができます。

+0

"アセンブリからのログインを作成する"とはどういう意味ですか? – Mark

+0

実行ファイルから非対称キー[ArbitraryKeyName]を作成する= 'dllへのパス';非対称鍵[ArbitraryKeyName]からログイン[ArbitraryLoginName]を作成する –

関連する問題