web-dev-qa-db-ja.com

使用しない場合のCPUの高い使用率

何が起こっているのかを理解しようとしていますが、現時点ではこの問題のトラブルシューティングはできません...

同じ仕様のサーバーが2台あり、実際にはほとんど同じユーザーが接続されています(私のみ)...

サーバーの1つはCPU使用率20%で安定していますが、他のサーバーは1%です...同じデータベース、同じプロセス...

両方がアイドル状態の場合、他のサーバーと比較してSQL Serverでこの大量のCPUを実際に消費しているものを知るにはどうすればよいですか?

1
J1mmy

まず、最大のCPUを消費しているサービス/プロセスを確認する必要があります。

詳細情報を提供する、Microsoftが提供する監視ツールを処理できます。

あなたはそれをここで見つけることができます https://technet.Microsoft.com/en-us/sysinternals/processmonitor.aspx

SQL Serverの場合、

最初に、master.dbo.sysprocessを次のように使用することをお勧めします

select * from master.dbo.sysprocesses order by cpu desc

上の意味でspid <50を返す場合、ユーザープロセスではなくSQL Server独自のプロセスです。したがって、lastwaittype列の値に基づいて、推奨される(待機タイプに応じて)SQL Server構成を変更するか、HWを調整できます。

プロセスID> 50が返される場合は、それがユーザープロセスであることを意味します。以下のクエリを使用して、プロセスの詳細を検索し、クエリを調整できます。

セッションがアクティブな場合(実行中、実行可能、スパンド)

select
            db_name(sp.dbid),sp.spid,er.wait_type,er.wait_time,er.wait_resource,er.total_elapsed_time,st.text,qp.query_plan
            ,ec.net_packet_size,ec.client_net_address,es.Host_name,es.program_name,es.client_interface_name
            ,es.status,es.cpu_time,qmg.granted_memory_kb,es.total_scheduled_time,es.total_elapsed_time
            ,es.reads,es.writes,es.logical_reads

from
                sys.dm_exec_requests er
inner join      master.dbo.sysprocesses sp
on              er.session_id=sp.spid
inner join      sys.dm_exec_connections ec
on              er.session_id=ec.session_id
inner join      sys.dm_exec_sessions es
on              ec.session_id=es.session_id
inner join      sys.dm_exec_query_memory_grants qmg
on er.session_id=qmg.session_id
cross apply     (select text from sys.dm_exec_sql_text(er.sql_handle)) st
cross apply     (select * from sys.dm_exec_query_plan(er.plan_handle)) qp

セッションがアクティブでない(スリープしている)場合。

select a.spid,db_name(b.dbid) [DB Name],b.text [Query],a.cpu
from master.dbo.sysprocesses a
cross apply sys.dm_exec_sql_text(a.sql_handle) b where status='sleeping'

ありがとう

2
Rajesh Ranjan

以下は、実行プランとともに、最もCPUを消費する上位5つのクエリを取得するクエリです。

SELECT TOP 5 total_worker_time/execution_count AS [Avg CPU Time],  
Plan_handle, query_plan   
FROM sys.dm_exec_query_stats AS qs  
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle)  
ORDER BY total_worker_time/execution_count DESC;  
GO  

CPU使用率がSQL Serverからのものであることを確認しますか?
以下のクエリを使用して、お知らせください。

DECLARE @ts_now2 BIGINT
SELECT @ts_now2 = cpu_ticks / (cpu_ticks / ms_ticks)
FROM sys.dm_os_sys_info

SELECT TOP (1000) SQLProcessUtilization AS [SQL Server Process CPU Utilization]
    ,SystemIdle AS [System Idle Process]
    ,100 - SystemIdle - SQLProcessUtilization AS [Other Process CPU Utilization]
    ,Dateadd(ms, - 1 * (@ts_now2 - [timestamp]), Getdate()) AS [Event Time]
FROM (
    SELECT record.value('(./Record/@id)[1]', 'int') AS record_id
        ,record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int') AS [SystemIdle]
        ,record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]', 'int') AS [SQLProcessUtilization]
        ,[timestamp]
    FROM (
        SELECT [timestamp]
            ,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 x
    ) AS y
ORDER BY record_id DESC;
0
Danilo Braga

SSMSでSQLサーバーを右クリックすると表示されるアクティビティモニターでそれを確認できます。ここで、最近実行されたクエリのプロセスメモリ使用率とプロセッサ使用率を確認できます。

詳細については、クエリを実行してくださいsys.sysprocessess テーブル。それが役に立てば幸い。

0