powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как найти прожерливые сессии ?
10 сообщений из 10, страница 1 из 1
Как найти прожерливые сессии ?
    #40005409
ssms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Скажите как можно найти сесиии, которые больше всего грузят CPU?
...
Рейтинг: 0 / 0
Как найти прожерливые сессии ?
    #40005411
ssms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть, к примеру в sysprocesses колонка cpu - это хорошо.

Но это только на данный момент времени показывает.

А сессию может подключится и отключится за за долю секунды и так 100500 раз.
...
Рейтинг: 0 / 0
Как найти прожерливые сессии ?
    #40005412
ssms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как можно посомтреть кто жрет процессор, к примеру, в течении минуты.
...
Рейтинг: 0 / 0
Как найти прожерливые сессии ?
    #40005419
ssms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
статистика ведь должна соббираться ккая-то
...
Рейтинг: 0 / 0
Как найти прожерливые сессии ?
    #40005435
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ssms,

вопрос поставлен не корректно.

у Ваc сессия не обязательно будет в пуле, тогда у вас приложение запускает 100500 раз запрос и получает разные session_id - нагрузка есть но она распределена между различными session_id.

вы можете узнать наиболее ресурсоемкие запросы через sys.dm_exec_query_stats

ну или включайте QueryStore
...
Рейтинг: 0 / 0
Как найти прожерливые сессии ?
    #40005442
ssms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
felix_ff
ssms,

вопрос поставлен не корректно.

у Ваc сессия не обязательно будет в пуле, тогда у вас приложение запускает 100500 раз запрос и получает разные session_id - нагрузка есть но она распределена между различными session_id.

вы можете узнать наиболее ресурсоемкие запросы через sys.dm_exec_query_stats

ну или включайте QueryStore


Да, спасибо. Там показывает то что в кэше. Это частично решает проблему.





А подскажите как можно с помощью профайлера собрать статистику по загрузке cpu ?


Пока думаю трэйс в таблицу сделать и потом по ней выбоку с суммлй загрузки.


Или какой-то метод попроще есть? Стандартный, в профайлере.
...
Рейтинг: 0 / 0
Как найти прожерливые сессии ?
    #40005457
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ssms,

номер сессии может быть использован другим подключением, это ничего не даст.
...
Рейтинг: 0 / 0
Как найти прожерливые сессии ?
    #40005465
ssms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов
ssms,

номер сессии может быть использован другим подключением, это ничего не даст.


Нужен не номер сессии а запрос.
...
Рейтинг: 0 / 0
Как найти прожерливые сессии ?
    #40005468
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ssms,

sqltrace - грузный, снизите достаточно значительно пропускную способность транзакций.

если версия сервера позволяет, то включите легковесную профилировку
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
dbcc traceon (7412, -1);
go
CREATE EVENT SESSION [PerfStats_LWP_Plan] ON SERVER
ADD EVENT sqlserver.query_plan_profile(
  ACTION(sqlos.scheduler_id,sqlserver.database_id,sqlserver.is_system,
    sqlserver.plan_handle,sqlserver.query_hash_signed,sqlserver.query_plan_hash_signed,
    sqlserver.server_instance_name,sqlserver.session_id,sqlserver.session_nt_username,
    sqlserver.sql_text))
ADD TARGET package0.ring_buffer(SET max_memory=(25600))
WITH (MAX_MEMORY=4096 KB,
  EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,
  MAX_DISPATCH_LATENCY=30 SECONDS,
  MAX_EVENT_SIZE=0 KB,
  MEMORY_PARTITION_MODE=NONE,
  TRACK_CAUSALITY=OFF,
  STARTUP_STATE=OFF);



в событии есть колонка cpu_time, можно анализировать по ней.

если версия сервера 2019 то есть третья версия упрощенного профилирования, она вообще почти не оказывает значительного влияния на производительность.
https://docs.microsoft.com/ru-ru/sql/relational-databases/performance/query-profiling-infrastructure?view=sql-server-ver15


и потом уже анализируйте ring_buffer
...
Рейтинг: 0 / 0
Как найти прожерливые сессии ?
    #40005524
архивариус
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ssms,


https://glennsqlperformance.com/2020/02/04/sql-server-diagnostic-information-queries-for-february-2020/

это запросы из какой то предыдущей версии этих скриптов:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
/* ########################################################################################################## */
-- Get CPU utilization by database (Query 34) (CPU Usage by Database)
WITH DB_CPU_Stats
AS
(SELECT pa.DatabaseID, DB_Name(pa.DatabaseID) AS [Database Name], SUM(qs.total_worker_time/1000) AS [CPU_Time_Ms]
 FROM sys.dm_exec_query_stats AS qs WITH (NOLOCK)
 CROSS APPLY (SELECT CONVERT(int, value) AS [DatabaseID] 
              FROM sys.dm_exec_plan_attributes(qs.plan_handle)
              WHERE attribute = N'dbid') AS pa
 GROUP BY DatabaseID)
SELECT ROW_NUMBER() OVER(ORDER BY [CPU_Time_Ms] DESC) AS [CPU Rank],
       [Database Name], [CPU_Time_Ms] AS [CPU Time (ms)], 
       CAST([CPU_Time_Ms] * 1.0 / SUM([CPU_Time_Ms]) OVER() * 100.0 AS DECIMAL(5, 2)) AS [CPU Percent]
FROM DB_CPU_Stats
WHERE DatabaseID <> 32767 -- ResourceDB
ORDER BY [CPU Rank] OPTION (RECOMPILE);
------
/* ########################################################################################################## */
-- Get Average Task Counts (run multiple times)  (Query 39) (Avg Task Counts)
SELECT AVG(current_tasks_count) AS [Avg Task Count], 
AVG(work_queue_count) AS [Avg Work Queue Count],
AVG(runnable_tasks_count) AS [Avg Runnable Task Count],
AVG(pending_disk_io_count) AS [Avg Pending DiskIO Count]
FROM sys.dm_os_schedulers WITH (NOLOCK)
WHERE scheduler_id < 255 OPTION (RECOMPILE);
------

-- Sustained values above 10 suggest further investigation in that area
-- High Avg Task Counts are often caused by blocking/deadlocking or other resource contention

-- Sustained values above 1 suggest further investigation in that area
-- High Avg Runnable Task Counts are a good sign of CPU pressure
-- High Avg Pending DiskIO Counts are a sign of disk pressure

-- How to Do Some Very Basic SQL Server Monitoring
-- https://www.sqlskills.com/blogs/glenn/how-to-do-some-very-basic-sql-server-monitoring/
/* ########################################################################################################## */
-- Get CPU Utilization History for last 256 minutes (in one minute intervals)  (Query 41) (CPU Utilization History)
DECLARE @ts_now bigint = (SELECT cpu_ticks/(cpu_ticks/ms_ticks) FROM sys.dm_os_sys_info WITH (NOLOCK)); 

SELECT TOP(256) SQLProcessUtilization AS [SQL Server Process CPU Utilization], 
               SystemIdle AS [System Idle Process], 
               100 - SystemIdle - SQLProcessUtilization AS [Other Process CPU Utilization], 
               DATEADD(ms, -1 * (@ts_now - [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 WITH (NOLOCK)
			WHERE ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR' 
			AND record LIKE N'%<SystemHealth>%') AS x) AS y 

--WHERE SQLProcessUtilization > 70	-- >70 %

ORDER BY record_id DESC OPTION (RECOMPILE);
------

-- Look at the trend over the entire period 
-- Also look at high sustained 'Other Process' CPU Utilization values
/* ########################################################################################################## */
-- Get top total worker time queries for entire instance (Query 42) (Top Worker Time Queries)
SELECT TOP(50) DB_NAME(t.[dbid]) AS [Database Name], 
REPLACE(REPLACE(LEFT(t.[text], 255), CHAR(10),''), CHAR(13),'') AS [Short Query Text],  
qs.total_worker_time AS [Total Worker Time], qs.min_worker_time AS [Min Worker Time],
qs.total_worker_time/qs.execution_count AS [Avg Worker Time], 
qs.max_worker_time AS [Max Worker Time], 
qs.min_elapsed_time AS [Min Elapsed Time], 
qs.total_elapsed_time/qs.execution_count AS [Avg Elapsed Time], 
qs.max_elapsed_time AS [Max Elapsed Time],
qs.min_logical_reads AS [Min Logical Reads],
qs.total_logical_reads/qs.execution_count AS [Avg Logical Reads],
qs.max_logical_reads AS [Max Logical Reads], 
qs.execution_count AS [Execution Count], qs.creation_time AS [Creation Time]
,t.[text] AS [Query Text], qp.query_plan AS [Query Plan] -- uncomment out these columns if not copying results to Excel
FROM sys.dm_exec_query_stats AS qs WITH (NOLOCK)
CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS t 
CROSS APPLY sys.dm_exec_query_plan(plan_handle) AS qp 
ORDER BY qs.total_worker_time DESC OPTION (RECOMPILE);
------


-- Helps you find the most expensive queries from a CPU perspective across the entire instance
-- Can also help track down parameter sniffing issues
/* ########################################################################################################## */
-- Top Cached SPs By Total Worker time. Worker time relates to CPU cost  (Query 57) (SP Worker Time)
SELECT TOP(25) p.name AS [SP Name], qs.total_worker_time AS [TotalWorkerTime], 
qs.total_worker_time/qs.execution_count AS [AvgWorkerTime], qs.execution_count, 
ISNULL(qs.execution_count/DATEDIFF(Minute, qs.cached_time, GETDATE()), 0) AS [Calls/Minute],
qs.total_elapsed_time, qs.total_elapsed_time/qs.execution_count 
AS [avg_elapsed_time], qs.cached_time
FROM sys.procedures AS p WITH (NOLOCK)
INNER JOIN sys.dm_exec_procedure_stats AS qs WITH (NOLOCK)
ON p.[object_id] = qs.[object_id]
WHERE qs.database_id = DB_ID()
AND DATEDIFF(Minute, qs.cached_time, GETDATE()) > 0
ORDER BY qs.total_worker_time DESC OPTION (RECOMPILE);
------

-- This helps you find the most expensive cached stored procedures from a CPU perspective
-- You should look at this if you see signs of CPU pressure
/* ########################################################################################################## */
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как найти прожерливые сессии ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]