如何通过sql server远程收集windows性能计数器

本文关键字:程收集 windows 性能计数器 server 何通过 sql | 更新日期: 2023-09-27 18:20:25

我希望我的应用程序(部署到数千个位置)能够监控自己的环境,特别是sql server框。当SQL Server是本地的时,这很容易做到,因为我可以使用System.Diagnostics库并通过它收集windows性能计数器。然而,当SQL server是远程的时,我会遇到问题,因为我不能保证我的c#应用程序(在这种情况下是windows服务)能够访问远程SQL server机器,而不是我知道它可以访问SQL server。

关于如何通过SQL从那台机器上收集windows性能计数器,有什么想法吗?

我想到的一种方法是使用SQL CLR,但它似乎需要UNSAFE访问权限,我很确定我不想要。

感谢

如何通过sql server远程收集windows性能计数器

如您在评论中所述进行标记

"我不能保证我会有适当的特权"

要么你必须在安装程序中写入某种功能,以确保你拥有远程性能计数器访问的适当权限(可能没有管理员设置权限就不会安装)。

然而,您并没有确切地说明您试图监视的内容,我可以建议您使用内置的int SQL Server动态管理视图(DMV)吗

MSDN
好文章视频
非常有用的示例

这些在SQL server的最新版本中变得非常健壮,并允许您监视在perfmon中使用的大多数统计信息(CPU、IO、MEMORY等)。也许粒度不如perfmon,但通常我发现它们比现在的perfmon更有用,可以快速获得相关数据。只要你的连接字符串用户拥有管理权限,你就不必担心服务器权限。这个功能已经内置在sql server中了。看看吧。


编辑。。。@标记以下是我用来获取数据库IO时间的一些DMV脚本,不如PerfMon精确,但它允许您专注于特定的数据库文件。

查看"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

如果对程序集进行签名,则可以从程序集创建登录名,授予其运行不安全程序集的服务器级权限,并从dll创建程序集。这允许您运行不安全的程序集,而不必打开数据库上的可信任标志。

我认为您需要比自滚SQL CLR更健壮的东西来实现这一点。MS有一个精确的工具叫做SCOM。

我在拥有50台服务器的envs中取得了非常好的结果。

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

好的维基百科文章

technet