2012-01-13 50 views
0

我想我的应用程序(已部署到数千个位置)能够监视其自己的环境,特别是sql服务器框。当SQL Server是本地的时候,这很容易实现,因为我可以使用System.Diagnostics库并通过它收集Windows性能计数器。当SQL服务器是远程但是我有一个问题,因为我不能保证我的c#应用程序(在这种情况下是一个Windows服务)有权访问远程SQL服务器机器,而不是我知道它可以访问SQL Server的事实。如何通过sql server远程收集windows性能计数器

关于如何通过SQL收集该机器的Windows性能计数器的任何想法?

我想过的一种方式是使用SQL CLR,但它似乎需要不安全的访问,我很确定我不想要。

感谢

+0

只是为了说明一下,您希望您的数据库能够收集运行应用程序的计算机的性能计数器统计信息,对吗? – 2012-01-13 16:46:33

+0

MS-SQL CLR有一个安全模式,我相信您可以根据您的要求使用 - 请参阅http://msdn.microsoft.com/en-us/library/ms345101.aspx – 2012-01-13 16:55:41

+0

@ M.Babcock我想要我的应用程序或SQL服务器收集运行SQL Server的计算机的性能计数器统计信息。 – Mark 2012-01-13 19:19:58

回答

4

标记为您在注释中规定

“我不能保证我将有适当的特权”

要么你有在你的安装程序中写入某种功能,以确保你拥有适当的权限ges(也许不会在没有管理员设置权限的情况下安装)用于远程perf。计数器访问。

您没有说明正是你所要监控,但是,我可能会建议使用内置INT的SQL Server动态管理视图(DMV的)

MSDN
Good Articles Videos
Very Useful Examples

这些在SQL服务器的最新版本中已经变得非常强大,并且允许您监视您在perfmon(CPU,IO,MEMORY等等)中使用的大多数统计信息。也许不像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

我认为这是最好的方法。不幸的是,我试图收集物理磁盘 - Ave Disk sec/read,这是我在DMV中找不到的。 – Mark 2012-01-16 20:37:44

+1

@Mark检查I/O的“dm_io_virtual_file_stats”还有其他几个DMV的IO,请参阅编辑exacmples – 2012-01-18 02:17:04

-2

我想你需要的东西比自推出SQL CLR这个更稳健。 MS有一个精确称为SCOM的工具。

我在使用50台服务器的envs上取得了非常好的效果。

您可以通过内置的时间点报告,数据仓库和警报来收集大量可配置数据。

good wikipedia article

technet

+0

正如问题中所述,此应用程序已部署到数千个位置。为了从一台机器上收集几个性能计数器,我不太可能将SCOM部署到数千个位置。 – Mark 2012-01-13 19:24:03

1

如果签上你的组件,你可以从组件创建一个登录,授予它服务器级别的权限来运行不安全的程序集,并从DLL创建程序集。这使您可以运行不安全的程序集,而无需打开数据库上的可信标志。

+0

听起来有点让步,但是您是什么意思“从程序集创建登录”? – Mark 2012-01-27 21:13:55

+0

从可执行文件='path to dll'创建非对称密钥[ArbitraryKeyName];从非对称密钥[ArbitraryKeyName]创建登录[ArbitraryLoginName] – 2012-01-27 21:31:03