问题 使用查询检测SQL Server利用率


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

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

  • 如果没有,我如何防止SQL服务器达到完全利用率?

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

预期结果(赏金猎人):

@memory_usage float, @cpu_usage float; /* in percentage */

欢迎任何想法。谢谢。


5913
2018-02-08 15:48


起源

过早优化是万恶之源。 - Andomar
基于你的问题,我想我会退一步看看另一种方法。 - Kenneth Fisher
首先,如果您正在耗尽服务器上的虚拟内存,请确保您的实例设置了最大内存设置。 SQL Server相当擅长管理它的缓存内存,所以你永远不需要重新启动实例(针对这个特定问题),除非你正在占用操作系统需要运行的内存。关于离开操作系统需要多少内存的文章很多,但你可以从这里查看BOL开始: msdn.microsoft.com/en-us/library/ms178067.aspx。这是2012年,但我不确定你使用的是什么版本。 - Kenneth Fisher
接下来,您可以研究服务代理方法。将SP请求加载到队列中,然后将队列设置为在x范围内执行它们。其中x是您希望同时运行的SP数。最后但并非最不重要的是,您可以查看资源调控器。这将使您分开资源,以便某些类型的操作只允许这么多的内存和/或CPU。 BOL在这里 msdn.microsoft.com/en-us/library/bb933866.aspx。 - Kenneth Fisher


答案:


这样的事可以帮到你吗?

用于通过SQL Server实例监视内存使用情况的脚本


7
2018-02-08 15:51





对于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使用率的一个很好的来源,但它并没有经常更新 - 我所看到的每一分钟。如果您需要更多实时信息,也许可以影响这一点。
  • 中的CPU使用值 sys.dm_os_ring_buffers 是一个整数,但我做了 @cpuUsage 一个 float 按照你的规格。由于存储过程使用两个 float params,您可以重构CPU使用率确定以提供小数部分而不更改其调用者。

5
2018-02-17 22:35



cpu使用不起作用 - sys.dm_os_sys_memory很有用 - Uğur Gümüşhan
很高兴听到内存使用检查有帮助,@UğurGümüşhan。 CPU使用率检查以什么方式不起作用?它错了吗?也许需要进行简单的调整才能在您的环境中工作。另外,这让我想起了 - 你使用的SQL Server和OS版本是什么? (根据 @@VERSION,我检查了Microsoft SQL Server 2008 R2(SP1)上的存储过程 - 10.50.2500.0(Intel X86)2011年6月17日00:57:23版权所有(c)Microsoft Corporation在Windows NT 6.1上使用高级服务的Express Edition <X86>( Build 7601:Service Pack 1)。) - J0e3gan
我们公司有sql server 2008r2 ..每次cpuusage都返回1 - Uğur Gümüşhan
有趣的是,@UğurGümüşhan。感谢您的跟进。如果您执行查询 SELECT TOP 10 * FROM sys.dm_os_ring_buffers WHERE ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR' AND record LIKE '%<SystemHealth>%' ORDER BY [timestamp] DESC,你看到了什么价值观 SystemIdle 中的元素 record 专栏的XML?例如,在我的系统中,它们就是 88, 94, 86, 90, 94, 93, 88, 92, 84,和 77。他们都是 1 在你的服务器上?如果是这样,你会看到除此之外的任何值 1 如果你检查超出 TOP 10 记录...或尝试大量加载CPU? - J0e3gan
我看到所有记录中的一些记录,systemidle 99和process utilization = 0 - Uğur Gümüşhan


不确定如何在SQL中执行此操作,但您始终可以在C#中创建一个函数,然后使用CRL将其作为存储过程在SQL Server中使用。

http://msdn.microsoft.com/en-us/library/ms131094.aspx


1
2018-02-17 09:15