powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как понять что SQL Server-у не хватает памяти?
6 сообщений из 31, страница 2 из 2
Как понять что SQL Server-у не хватает памяти?
    #39612610
Col
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MindНадо точно знать куда смотреть.

Я бы сказал там надо весь вывод анализировать отдельно по блокам, да я думаю Вы это проходили судя по описанию меморилика стукнувшего по голове процессора

Mind Был другой весьма редкий случай "нехватки памяти".

Это скорее из области багов, про такое хорошо байки травить когда все уже закончилось. :)
Эвент 17130 же является прямым следствием нехватки памяти.
Я на него наступил когда заведомо установил сервер с 20% от запланированного объема памяти, логисты наши тогда сильно "провинились" а у меня не было других вариантов.
...
Рейтинг: 0 / 0
Как понять что SQL Server-у не хватает памяти?
    #39613171
aleksrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mindaleksrovсмотрите самые дорогие хранимки и запросы в кэше по i\oВ случае серьезного memory pressure кэш планов будет достаточно быстро вымываться, так что толку на него смотреть особо нету. Да и впринципе, не понятно какая связь между средним количеством логических операций и памятью? Ну допустим есть дорогие запросы, а как это покажет что "SQL Server-у памяти не хватает"?

Не то в order by, там есть total_physical_reads, по нему отфильтровать. Среднее кол-во лог. операций покажет что запрос читает много страниц, как вариант.
Дорогие запросы покажут что дело именно в них, к примеру как я описывал выше. Или еще пример, есть запрос, в where была конструкция where cast (column as date) =, только убрав это, запрос стал выполняться быстрее, вместо scan seek и кол-во лог. чтений упало в 3 раза. Этот же запрос, смотрим дальше, from table as t1 left join table2 as t2..... прикол в том что тут join и нафиг не нужен был, в select не было ни одного стобца из t2, как не было ни в where ни в group by, убираю его (результат запроса естественно не меняется) и log read падает еще больше так как t2 с 10 млн строк читать не нужно. Итого кол-во прочитанных страниц упало в раз 10 наверно. А теперь если таких запросов много и они выгрибают куча данных, естетсвенно памяти будет не хватать, в 90% проблемы с памятью связанны именно с этим, то что описали вы, это уже оставшиеся 10%.
Я к тому что сначала стоит посмотреть что у вас выполняется, да и как я писал вообще знать вашу нагрузку, может у вас каждый час запускается отчет для руководства который пол базы читает.
Статистику ожиданий разумеется надо посмотреть.
...
Рейтинг: 0 / 0
Как понять что SQL Server-у не хватает памяти?
    #39613251
neodum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, благодарю за ответы.



т.к. около 95% памяти - это Database Cache Memory, думаю надо искать что в кэше.

Database Cache Memory - это, как я понял, кэш страниц базы данных.

Т.е. какие-то таблицы в кэшэ.





Подскажите пожалуйста,

1) как выяснить что за таблицы в кэше?

2) Как выяснить какие запросы помещают эти данные в кэш?
...
Рейтинг: 0 / 0
Как понять что SQL Server-у не хватает памяти?
    #39613656
Eleanor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
neodum1) как выяснить что за таблицы в кэше?
Выполнить запрос из примера B - sys.dm_os_buffer_descriptors
...
Рейтинг: 0 / 0
Как понять что SQL Server-у не хватает памяти?
    #39613711
дампер2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eleanorneodum1) как выяснить что за таблицы в кэше?
Выполнить запрос из примера B - sys.dm_os_buffer_descriptors

Да, спасибо.

Выполнил этот же запрос вот из этой статьи:

https://docs.microsoft.com/ru-ru/sql/relational-databases/system-dynamic-management-views/sys-dm-os-buffer-descriptors-transact-sql


Думаю это то же самое, только на русском.




Сейчас остался открытым второй вопрос:

2) Как выяснить какие запросы помещают эти данные в кэш?

И появился новый:

Можно ли как-нибудь ограничить Database Cache Memory напрямую и имеет ли смысл это делать?
Модератор: 21244208
...
Рейтинг: 0 / 0
Как понять что SQL Server-у не хватает памяти?
    #39614366
Andy_OLAPПризнак первый.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SELECT  @@servername AS INSTANCE
,[object_name]
,[counter_name]
, UPTIME_MIN = CASE WHEN[counter_name]= 'Page life expectancy'
          THEN (SELECT DATEDIFF(MI, MAX(login_time),GETDATE())
          FROM   master.sys.sysprocesses
          WHERE  cmd='LAZY WRITER')
      ELSE ''
END
, [cntr_value] AS PLE_SECS
,[cntr_value]/ 60 AS PLE_MINS
,[cntr_value]/ 3600 AS PLE_HOURS
,[cntr_value]/ 86400 AS PLE_DAYS
FROM  sys.dm_os_performance_counters
WHERE   [object_name] LIKE '%Manager%'
AND [counter_name] = 'Page life expectancy'



Это всё есть в
Код: sql
1.
2.
SELECT	sqlserver_start_time, server_memory_kb = bpool_committed * 8 , server_memory_target_kb = bpool_commit_target * 8
FROM	sys.dm_os_sys_info



И вы забыли про связь PLE с numa и объёмом памяти.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT	t.numa_node, t.memory_total_kb, t.memory_target_kb, t.ple, (memory_total_kb / 1024 / 1024), (memory_total_kb / 1024 / 1024 / 4), ple_target = 300 * (memory_total_kb / 1024 / 1024 / 4) 
FROM	
	(	SELECT	
			numa_node = instance_name
		,	memory_total_kb = SUM(CASE [counter_name] WHEN N'Total pages' THEN cntr_value * 8 ELSE 0 END) 
		,	memory_target_kb = SUM(CASE [counter_name] WHEN N'Target pages' THEN cntr_value * 8 ELSE 0 END) 
		,	ple = SUM(CASE [counter_name] WHEN N'Page life expectancy' THEN cntr_value ELSE 0 END)  
		FROM  sys.dm_os_performance_counters
		WHERE   
			[object_name] = N'SQLServer:Buffer Node'
		AND	[counter_name] IN (N'Page life expectancy',N'Target pages',N'Total pages') 
		GROUP BY
			instance_name	
	) t



Но начинал бы я с sys.dm_os_wait_stats.
Код: 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.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
/*--Скрипт мониторинга----------------------
USE tempdb;

DECLARE @atB AS DATETIME;
SET @atB = 
(	SELECT	
		MIN(at)
	FROM	dbo.sys_dm_os_wait_stats
);

DECLARE @atA AS DATETIME;
SET @atA = 
(	SELECT	
		MAX(at)
	FROM	dbo.sys_dm_os_wait_stats
);

SELECT
	tB.at
,	tA.wait_type
,	waiting_tasks_count = tA.waiting_tasks_count - tB.waiting_tasks_count
,	wait_time_ms = tA.wait_time_ms - tB.wait_time_ms
,	wait_time_per_task_ms = 
		CASE WHEN tA.waiting_tasks_count = tB.waiting_tasks_count THEN
			0
		ELSE
			(tA.wait_time_ms - tB.wait_time_ms*1.)/(tA.waiting_tasks_count - tB.waiting_tasks_count)				
		END
,	signal_wait_time_ms = tA.signal_wait_time_ms - tB.signal_wait_time_ms
FROM	
	(	SELECT	*
	 	FROM	dbo.sys_dm_os_wait_stats
	 	WHERE	at = @atB
	) AS tB
INNER JOIN
	(	SELECT	*
	 	FROM	dbo.sys_dm_os_wait_stats
	 	WHERE	at = @atA
	) AS tA	
ON	tB.wait_type = tA.wait_type
ORDER BY
	tA.wait_time_ms - tB.wait_time_ms DESC;
------------------------------------------*/

USE [master];
SET NOCOUNT ON;

BEGIN TRY
	DROP TABLE tempdb.dbo.sys_dm_os_wait_stats;	
END TRY
BEGIN CATCH END CATCH;

BEGIN TRY
	CREATE TABLE #WaitTypeIrrelevant
	(	wait_type NVARCHAR(60) NOT NULL);

	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'BROKER_EVENTHANDLER');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'BROKER_RECEIVE_WAITFOR');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'BROKER_TASK_STOP');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'BROKER_TO_FLUSH');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'BROKER_TRANSMITTER');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'CHECKPOINT_QUEUE');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'CHKPT');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'CLR_AUTO_EVENT');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'CLR_MANUAL_EVENT');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'CLR_SEMAPHORE');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'DBMIRROR_DBM_EVENT');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'DBMIRROR_EVENTS_QUEUE');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'DBMIRROR_WORKER_QUEUE');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'DBMIRRORING_CMD');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'DIRTY_PAGE_POLL');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'DISPATCHER_QUEUE_SEMAPHORE');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'EXECSYNC');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'FSAGENT');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'FT_IFTS_SCHEDULER_IDLE_WAIT');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'FT_IFTSHC_MUTEX');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'HADR_CLUSAPI_CALL');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'HADR_FILESTREAM_IOMGR_IOCOMPLETION');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'HADR_LOGCAPTURE_WAIT');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'HADR_NOTIFICATION_DEQUEUE');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'HADR_TIMER_TASK');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'HADR_WORK_QUEUE');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'KSOURCE_WAKEUP');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'LAZYWRITER_SLEEP');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'LOGMGR_QUEUE');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'ONDEMAND_TASK_QUEUE');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'PWAIT_ALL_COMPONENTS_INITIALIZED');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'QDS_CLEANUP_STALE_QUERIES_TASK_MAIN_LOOP_SLEEP');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'QDS_PERSIST_TASK_MAIN_LOOP_SLEEP');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'REQUEST_FOR_DEADLOCK_SEARCH');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'RESOURCE_QUEUE');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'SERVER_IDLE_CHECK');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'SLEEP_BPOOL_FLUSH');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'SLEEP_DBSTARTUP');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'SLEEP_DCOMSTARTUP');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'SLEEP_MASTERDBREADY');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'SLEEP_MASTERMDREADY');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'SLEEP_MASTERUPGRADED');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'SLEEP_MSDBSTARTUP');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'SLEEP_SYSTEMTASK');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'SLEEP_TASK');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'SLEEP_TEMPDBSTARTUP');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'SNI_HTTP_ACCEPT');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'SP_SERVER_DIAGNOSTICS_SLEEP');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'SQLTRACE_BUFFER_FLUSH');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'SQLTRACE_INCREMENTAL_FLUSH_SLEEP');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'SQLTRACE_WAIT_ENTRIES');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'WAIT_FOR_RESULTS');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'WAIT_XTP_CKPT_CLOSE');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'WAIT_XTP_HOST_WAIT');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'WAIT_XTP_OFFLINE_CKPT_NEW_LOG');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'WAITFOR');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'WAITFOR_TASKSHUTDOWN');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'XE_DISPATCHER_JOIN');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'XE_DISPATCHER_WAIT');
	INSERT INTO #WaitTypeIrrelevant (wait_type) VALUES (N'XE_TIMER_EVENT');
END TRY
BEGIN CATCH END CATCH;
GO

SELECT	at = GETDATE(), *
INTO tempdb.dbo.sys_dm_os_wait_stats
FROM	sys.dm_os_wait_stats dows

WAITFOR DELAY '00:00:15';

INSERT INTO tempdb.dbo.sys_dm_os_wait_stats
(	at
,	wait_type
,	waiting_tasks_count
,	wait_time_ms
,	max_wait_time_ms
,	signal_wait_time_ms)
SELECT
	at = GETDATE()
,	dows.wait_type
,	dows.waiting_tasks_count
,	dows.wait_time_ms
,	dows.max_wait_time_ms
,	dows.signal_wait_time_ms
FROM
	sys.dm_os_wait_stats dows
WHERE
	NOT EXISTS ( SELECT NULL FROM #WaitTypeIrrelevant _wti WHERE dows.wait_type = _wti.wait_type ); 

GO

WHILE 1 = 1
BEGIN
	WAITFOR DELAY '00:00:15';

	BEGIN TRANSACTION;
	
	DELETE FROM	t
	FROM
		tempdb.dbo.sys_dm_os_wait_stats AS t WITH (TABLOCK)
	WHERE
		t.at =
			(	SELECT	MIN(_t.at) 
		 		FROM	tempdb.dbo.sys_dm_os_wait_stats AS _t
			)
	;
	
	INSERT INTO tempdb.dbo.sys_dm_os_wait_stats
	(	at
	,	wait_type
	,	waiting_tasks_count
	,	wait_time_ms
	,	max_wait_time_ms
	,	signal_wait_time_ms)
	SELECT
		at = GETDATE()
	,	dows.wait_type
	,	dows.waiting_tasks_count
	,	dows.wait_time_ms
	,	dows.max_wait_time_ms
	,	dows.signal_wait_time_ms
	FROM
		sys.dm_os_wait_stats dows
	WHERE
		NOT EXISTS ( SELECT NULL FROM #WaitTypeIrrelevant _wti WHERE dows.wait_type = _wti.wait_type );
	 	
	COMMIT TRANSACTION;	
END;

...
Рейтинг: 0 / 0
6 сообщений из 31, страница 2 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как понять что SQL Server-у не хватает памяти?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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