Ответ 1
Помогло бы вам подобное?
Script Чтобы отслеживать использование памяти по экземпляру SQL Server
Мой текущий проект будет отправлять запросы на сервер sql постоянно, и он может использовать 100% памяти или процессора.
Как проверить, подходит ли сервер для полного использования в хранимой процедуре, чтобы я мог решить, следует ли выполнять запросы или нет или сохранить некоторые настройки в таблице, чтобы следующие запросы могли знать, какая рабочая нагрузка высоко и решить, что делать
Если нет, как я могу предотвратить использование SQL-сервера для полного использования?
Дополнительная информация о деле: Сейчас я знаю, что наш текущий тестовый сервер может обрабатывать 40-50 запросов в секунду (одна конкретная хранимая процедура). И теперь мы решим, сколько запросов отправляется на сервер каждую секунду. Если мы установим сумму, даже на 1 превышающую ожидаемую, в конечном счете, запросы в конечном итоге заполнят виртуальную память, и клиент должен будет периодически перезапускать экземпляр сервера SQL.
Ожидаемые результаты (для охотников за головами):
@memory_usage float, @cpu_usage float; /* in percentage */
Любые идеи приветствуются. Спасибо.
Помогло бы вам подобное?
Script Чтобы отслеживать использование памяти по экземпляру SQL Server
Для любого такого интенсивного использования SQL Server и усилий по его тонкой настройке я предполагаю, что (виртуальная) машина предназначена для SQL Server.
Сказав это, получение текущего процентного значения процессора и используемой памяти должно сделать трюк:
CREATE PROCEDURE dbo.p_GetSystemUsage
@cpuUsage float out, -- % CPU usage
@memoryUsage float out -- % memory usage
AS
BEGIN
SET NOCOUNT ON;
/*
* % CPU usage
*/
SELECT TOP 1
@cpuUsage = 100 - r.SystemIdle
FROM (
SELECT
rx.record.value('(./Record/@id)[1]', 'int') AS record_id,
rx.record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int') AS SystemIdle
FROM (
SELECT CONVERT(XML, record) AS record
FROM sys.dm_os_ring_buffers
WHERE
ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR' AND
record LIKE '%<SystemHealth>%') AS rx
) AS r
ORDER BY r.record_id DESC
/*
* % memory usage
*/
SELECT
@memoryUsage =
(((m.total_physical_memory_kb - m.available_physical_memory_kb) /
convert(float, m.total_physical_memory_kb)) *
100)
FROM sys.dm_os_sys_memory m
END
Несколько замечаний:
sys.dm_os_sys_memory
является хорошим источником использования физической памяти машины. Он предоставляет аналогичную информацию об использовании файла страницы машины. По моему опыту, его информация часто меняется - несколько запросов к ней в течение второй секунды дают разные результаты.sys.dm_os_ring_buffers
- хороший источник использования процессора, но он не обновляется так часто - каждую минуту из того, что я видел. Возможно, вы можете повлиять на это, если вам нужна более подробная информация в режиме реального времени.sys.dm_os_ring_buffers
является целым числом, но я сделал @cpuUsage
a float
за вашу спецификацию. Поскольку хранимый proc использует два параметра float
, вы можете реорганизовать определение использования ЦП для предоставления дробной части без изменения ее вызывающих абонентов.Не уверен, как это сделать в SQL, но вы всегда можете создать функцию на С#, а затем сделать ее доступной на вашем SQL Server в качестве хранимой процедуры с помощью CRL.