使用查询检测 SQL Server 利用率

Uğu*_*han 7 rdbms sql-server-2008 sql-server

我当前的项目将不断向 sql 服务器发送查询,它可能会使用 100% 的内存或 CPU。

  • 如何在存储过程中检查服务器是否接近充分利用,以便我可以决定是否执行查询或将某些设置保存在表中,以便以下查询可以知道工作负载很高并决定要做什么

  • 如果没有,如何防止 SQL Server 达到充分利用?

有关案例的更多信息:现在我知道我们当前的测试服务器每秒可以处理 40-50 个查询(一个特定的存储过程)。现在我们将决定每秒向服务器发送多少查询。如果我们设置的数量比预期的还要高 1,从长远来看,查询最终会填满虚拟内存,客户端将不得不定期重新启动他们的 sql server 实例。

预期结果(赏金猎人):

@memory_usage float, @cpu_usage float; /* in percentage */
Run Code Online (Sandbox Code Playgroud)

欢迎任何想法。谢谢。

Pau*_*ams 11

如果您真的想限制 SQL Server 内存,请查看最大服务器内存选项。

获取内存使用情况是可能的,但这取决于您真正想要什么。您想将内存使用情况视为“最大服务器内存”选项的百分比吗?如果是这样,请查看sys.dm_os_process_memory

select convert(float, memory_utilization_percentage) / 100 as memory_usage
from sys.dm_os_process_memory
Run Code Online (Sandbox Code Playgroud)

如果您想要物理内存使用与总系统内存,请查看sys.dm_os_sys_infosys.dm_os_process_memorysys.dm_os_sys_info

select * from sys.dm_os_sys_info

declare @physicalMemoryInUseKB bigint
declare @totalSystemMemoryBytes bigint

select @physicalMemoryInUseKB = physical_memory_in_use_kb from sys.dm_os_process_memory
select @totalSystemMemoryBytes = physical_memory_in_bytes from sys.dm_os_sys_info
select convert(float, @physicalMemoryInUseKB) * 1024
       / convert(float, @totalSystemMemoryBytes) as memory_usage
Run Code Online (Sandbox Code Playgroud)

我认为除非您启用了资源调控器,否则您无法获得 CPU 使用率。如果这样做,请查看 sys.dm_os_performance_counters:

select
    case CPUUsageBase
        when 0 then 0
        else convert(float, CPUUsage) / convert(float, CPUUsageBase)
    end as 'cpu_usage'
from
(select cntr_value as [CPUUsage]
from sys.dm_os_performance_counters
where counter_name like 'CPU usage%'
and object_name like '%Workload Group Stats%'
and cntr_type = 537003264) Usage
cross join
(select cntr_value as [CPUUsageBase]
 from sys.dm_os_performance_counters
 where counter_name like 'CPU usage %'
 and object_name like '%Workload Group Stats%'
 and cntr_type = 1073939712) UsageBase
Run Code Online (Sandbox Code Playgroud)


Str*_*DBA 5

DMV 提供 CPU 和内存使用信息。这些查询需要 VIEW_SERVER_STATE 权限才能运行。

DECLARE @memory_usage FLOAT
    , @cpu_usage FLOAT

SET @memory_usage = ( SELECT    1.0 - ( available_physical_memory_kb / ( total_physical_memory_kb * 1.0 ) ) memory_usage
                        FROM      sys.dm_os_sys_memory
                    )

SET @cpu_usage = ( SELECT TOP ( 1 )
                            [CPU] / 100.0 AS [CPU_usage]
                    FROM     ( SELECT    record.value('(./Record/@id)[1]', 'int') AS record_id
                                        , record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]', 'int') AS [CPU]
                                FROM      ( SELECT    [timestamp]
                                                    , CONVERT(XML, record) AS [record]
                                            FROM      sys.dm_os_ring_buffers WITH ( NOLOCK )
                                            WHERE     ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR'
                                                    AND record LIKE N'%<SystemHealth>%'
                                        ) AS x
                            ) AS y
                    ORDER BY record_id DESC
                    )


SELECT  @memory_usage [memory_usage]
        , @cpu_usage [cpu_usage]
Run Code Online (Sandbox Code Playgroud)


mrd*_*nny 4

在存储过程中?一旦导致 CPU 达到 100% 的查询完成,您将无法再监视该指标,而这将由存储过程中的下一个查询来完成。

如果您使用的是 SQL Server 2008 或更高版本(以及企业版),您可以使用资源调控器来确保其他进程有可用的 CPU 能力和内存。