我当前的项目将不断向sql server发送查询,它可能会使用100%的内存或CPU。
如何检查服务器是否接近存储过程中的完全利用率,以便我可以决定是否执行查询或在表中保存一些设置,以便以下查询可以知道工作负载是高并决定做什么
如果没有,我该如何防止SQL Server达到完全利用率?
有关案件的更多信息: 现在我知道我们当前的测试服务器每秒可以处理40-50个查询(一个特定的存储过程)。现在我们将决定每秒向服务器发送多少查询。如果我们将数量设置为比预期的高1,那么从长远来看,查询最终会填满虚拟内存,而客户端将不得不定期重启其sql server实例。
预期结果(赏金猎人):
@memory_usage float, @cpu_usage float; /* in percentage */
欢迎任何想法。感谢。
答案 0 :(得分:7)
答案 1 :(得分:5)
对于SQL Server的任何此类密集使用以及微调它的努力,我假设(虚拟)计算机专用于SQL Server。
话虽如此,获取机器当前使用的CPU和内存百分比应该可以解决问题:
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
是计算机CPU使用率的一个很好的来源,但它并没有经常更新 - 每一分钟我都看到了。如果您需要更多实时信息,也许可以影响这一点。sys.dm_os_ring_buffers
中的CPU使用价值是一个整数,但我根据您的规范将@cpuUsage
设为float
。由于存储过程使用两个float
参数,因此您可以重构CPU使用率确定以提供小数部分而不更改其调用者。答案 2 :(得分:1)
不确定如何在SQL中执行此操作,但您始终可以在C#中创建一个函数,然后使用CRL将其作为存储过程在SQL Server中使用。