Как удаленно собирать счетчики производительности Windows через sql server

Я бы хотел, чтобы мое приложение (которое развернуто в тысячах мест) могло контролировать свою собственную среду, в частности сервер sql. Когда SQL Server является локальным, это легко сделать, поскольку я могу использовать библиотеку System.Diagnostics и через нее собирать счетчики производительности Windows. Однако, когда SQL-сервер является удаленным, у меня возникает проблема, потому что я не могу гарантировать, что мое приложение С # (в данном случае служба Windows) имеет доступ к удаленному серверу sql, КРОМЕ того факта, что я знаю, что он может получить доступ к SQL Server.

Любые идеи о том, как я могу собрать счетчики производительности Windows с этой машины через SQL?

Один из способов, о котором я подумал, - это использовать SQL CLR, но, похоже, он требует доступа UNSAFE, который, я уверен, мне не нужен.

Спасибо


person Mark    schedule 13.01.2012    source источник
comment
Просто для пояснения, вы хотите, чтобы ваша база данных могла собирать статистику счетчиков производительности машины, на которой выполняется ваше приложение, верно?   -  person M.Babcock    schedule 13.01.2012
comment
MS-SQL CLR имеет режим БЕЗОПАСНОСТИ, который, я считаю, вы можете использовать с учетом ваших требований - см. msdn.microsoft.com/en-us/library/ms345101.aspx   -  person ron tornambe    schedule 13.01.2012
comment
@ M.Babcock Я хочу, чтобы мое приложение или SQL Server собирали статистику счетчиков производительности машины, на которой работает SQL Server.   -  person Mark    schedule 13.01.2012
comment
@ron tornambe Я знаю, что у него есть БЕЗОПАСНЫЙ режим, но счетчики System.performance, похоже, требуют привилегий найма, чем те, которые основаны на моих тестах. Я считаю, что это связано с тем, что для получения счетчиков производительности через System.Diagnostics требуется доступ к реестру. Я не знаю, лучше ли WMI или для этого потребуется такой же уровень доступа   -  person Mark    schedule 13.01.2012
comment
@Mark - из своего приложения C # вы можете вызвать эту перегрузку Конструктор PerformanceCounter для подключения к удаленному счетчику. Уловка будет заключаться в том, чтобы определить, с какого компьютера нужно собирать статистику, и гарантировать, что у него есть необходимые разрешения.   -  person M.Babcock    schedule 13.01.2012
comment
@ M.Babcock, но в том-то и дело, я не могу гарантировать, что у меня будут надлежащие привилегии. Все, что я могу гарантировать, это то, что у меня есть доступ к SQL Server.   -  person Mark    schedule 13.01.2012
comment
@Mark - Ваши варианты здесь очень просты. 1. Гарантируйте, что ваше приложение работает на той же машине, что и SQL Server (если не тот, который у вас есть сейчас, то другой, который может выполнить простую задачу). ИЛИ 2. Работайте со сборкой UNSAFE SQL CLR. Здесь действительно нет никакого волшебства.   -  person M.Babcock    schedule 13.01.2012


Ответы (3)


Отметьте, как вы сказали в комментариях

"я не могу гарантировать, что у меня будут соответствующие привилегии"

Либо вам нужно написать какую-то функциональность в вашем установщике, которая будет гарантировать, что у вас есть надлежащие привилегии (возможно, вы не сможете установить без прав администратора) для удаленного выполнения. счетчики доступа.

Вы не указали, что именно вы пытаетесь отслеживать, однако могу ли я предложить использовать встроенные представления динамического управления SQL Server (DMV)

MSDN
Видео с хорошими статьями
Очень полезные примеры

они стали очень надежными в последних выпусках SQL-сервера и позволяют отслеживать большую часть статистики, с которой вы будете работать в perfmon (CPU, IO, MEMORY и многие другие). Возможно, не такая большая детализация, как в perfmon, но обычно я считаю их более полезными, чем в настоящее время perfmon, для быстрого получения актуальных данных. И пока у вашего пользователя строки подключения есть права администратора, вам не нужно беспокоиться о привилегиях сервера. И эта функциональность уже встроена в sql-server. Посмотрите сами.


Изменить ... @Mark Вот несколько сценариев DMV, которые я использую, чтобы получить время ввода-вывода в базе данных, не так точно, как PerfMon, однако он позволяет вам сосредоточиться на конкретном файле базы данных.

Посмотрите DMV "dm_io_virtual_file_stats"

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
person bumble_bee_tuna    schedule 14.01.2012
comment
Думаю, это лучший подход. К сожалению, я пытаюсь собрать Physical disk - Ave Disk sec / read, который я не могу найти в DMV. - person Mark; 17.01.2012
comment
@Mark Проверьте dm_io_virtual_file_stats для ввода-вывода, есть еще пара других DMV для ввода-вывода, см. Примеры - person bumble_bee_tuna; 18.01.2012

Если вы подписываете свою сборку, вы можете создать учетную запись из сборки, предоставить ей разрешение на уровне сервера для запуска небезопасных сборок и создать сборку из библиотеки DLL. Это позволяет запускать небезопасные сборки без включения флага надежности в базе данных.

person Ben Thul    schedule 27.01.2012
comment
Звучит многообещающе, но что вы имеете в виду, говоря о создании логина из сборки? - person Mark; 28.01.2012
comment
создать асимметричный ключ [ArbitraryKeyName] из исполняемого файла = 'путь к dll'; создать логин [ArbitraryLoginName] из асимметричного ключа [ArbitraryKeyName] - person Ben Thul; 28.01.2012

Я бы подумал, что для этого вам понадобится что-то более надежное, чем самовращающийся SQL CLR. У MS есть инструмент для точного этого, называемый SCOM.

У меня были очень хорошие результаты в envs с 50 серверами.

Вы собираете множество настраиваемых данных с помощью встроенных отчетов на определенный момент времени, хранилищ данных и предупреждений.

хорошая статья в Википедии

technet

person Jules    schedule 13.01.2012
comment
Как указано в вопросе, это приложение развернуто в тысячах мест. На самом деле я не могу развернуть SCOM в тысячах мест только для того, чтобы собрать несколько счетчиков производительности с одной машины. - person Mark; 13.01.2012