web-dev-qa-db-ja.com

クエリによるSQL Server使用率の検出

現在のプロジェクトでは、SQLサーバーにクエリを常に送信し、メモリまたはCPUを100%使用する可能性があります。

  • クエリを実行するかどうかを決定したり、テーブルにいくつかの設定を保存したりして、次のクエリがワークロードが高いことを認識し、何をすべきかを決定できるように、サーバーがストアドプロシージャの使用率に近づいているかどうかを確認するにはどうすればよいですか?

  • そうでない場合、SQLサーバーが完全に使用されないようにするにはどうすればよいですか?

ケースの詳細:現在、現在のテストサーバーが1秒あたり40〜50のクエリを処理できることを知っています(1つの特定のストアドプロシージャ)。次に、毎秒サーバーに送信されるクエリの数を決定します。予想よりも1だけ多い値を設定すると、長期的には、クエリは最終的に仮想メモリを満たし、クライアントは定期的にSQLサーバーインスタンスを再起動する必要があります。

期待される結果(バウンティハンターの場合):

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

どんなアイデアでも歓迎します。ありがとう。

7

SQL Serverのメモリを本当に制限したい場合は、 Maximum server memory オプションを確認してください。

メモリ使用量を取得することは可能ですが、それは実際に何が必要かによって異なります。 「最大サーバーメモリ」オプションの割合としてメモリ使用量を表示しますか?もしそうなら、 sys.dm_os_process_memory を見てください:

select convert(float, memory_utilization_percentage) / 100 as memory_usage
from sys.dm_os_process_memory

物理メモリの使用とシステムメモリの合計の両方が必要な場合は、両方のsys.dm_os_process_memoryおよび sys.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

Resource Governor を有効にしない限り、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
11
Paul Williams

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]
5
StrayCatDBA

ストアドプロシージャ内? CPUが100%になる原因となったクエリが完了すると、ストアドプロシージャ内の次のクエリによって実行されるそのメトリックを監視できなくなります。

SQL Server 2008以降(およびEnterprise Edition)を使用している場合は、リソースガバナーを使用して、他のプロセスがCPU能力とメモリを利用できるようにすることができます。

4
mrdenny