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

Подскажите как понять что SQL Server-у памяти не хватает?

Какие признаки?
...
Рейтинг: 0 / 0
Как понять что SQL Server-у не хватает памяти?
    #39610817
дампер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SQL Server 2008
...
Рейтинг: 0 / 0
Как понять что SQL Server-у не хватает памяти?
    #39610818
дампер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как-то запросом это понять можно?
...
Рейтинг: 0 / 0
Как понять что SQL Server-у не хватает памяти?
    #39610821
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как понять что SQL Server-у не хватает памяти?
    #39610832
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дамперДобрый день.

Подскажите как понять что SQL Server-у памяти не хватает?

Какие признаки?
Признак первый.
Код: 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.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT 
  physical_memory_in_use_kb/1024 AS sql_physical_memory_in_use_MB, 
    large_page_allocations_kb/1024 AS sql_large_page_allocations_MB, 
    locked_page_allocations_kb/1024 AS sql_locked_page_allocations_MB,
    virtual_address_space_reserved_kb/1024 AS sql_VAS_reserved_MB, 
    virtual_address_space_committed_kb/1024 AS sql_VAS_committed_MB, 
    virtual_address_space_available_kb/1024 AS sql_VAS_available_MB,
    page_fault_count AS sql_page_fault_count,
    memory_utilization_percentage AS sql_memory_utilization_percentage, 
    process_physical_memory_low AS sql_process_physical_memory_low, 
    process_virtual_memory_low AS sql_process_virtual_memory_low
FROM sys.dm_os_process_memory;  


И официальная ссылка .
...
Рейтинг: 0 / 0
Как понять что SQL Server-у не хватает памяти?
    #39610835
дампер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гавриленко Сергей Алексеевич https://www.google.ru/search?q=mssql memory bottleneck&oq=mssql memory bottleneck&aqs=chrome..69i57.9247j0j7&sourceid=chrome&ie=UTF-8


Смотрю представление:
sys.dm_os_performance_counters

и ни как не могу понять какой процент в кэш попадает (


Он же в процентах быть должен... в perfmon посмотреть не могу.
...
Рейтинг: 0 / 0
Как понять что SQL Server-у не хватает памяти?
    #39610840
дампер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Andy_OLAPдамперДобрый день.

Подскажите как понять что SQL Server-у памяти не хватает?

Какие признаки?
Признак первый.
Код: 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.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT 
  physical_memory_in_use_kb/1024 AS sql_physical_memory_in_use_MB, 
    large_page_allocations_kb/1024 AS sql_large_page_allocations_MB, 
    locked_page_allocations_kb/1024 AS sql_locked_page_allocations_MB,
    virtual_address_space_reserved_kb/1024 AS sql_VAS_reserved_MB, 
    virtual_address_space_committed_kb/1024 AS sql_VAS_committed_MB, 
    virtual_address_space_available_kb/1024 AS sql_VAS_available_MB,
    page_fault_count AS sql_page_fault_count,
    memory_utilization_percentage AS sql_memory_utilization_percentage, 
    process_physical_memory_low AS sql_process_physical_memory_low, 
    process_virtual_memory_low AS sql_process_virtual_memory_low
FROM sys.dm_os_process_memory;  


И официальная ссылка .





Спасибо.

Пытаюсь понять что выводит :)
...
Рейтинг: 0 / 0
Как понять что SQL Server-у не хватает памяти?
    #39610842
дампер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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'





PLE_SECS = 1637 сек вроде больше 300 сек.

Сильно ли 1637 - страшное значение?

... пока со всторым скриптом разбираюсь...
...
Рейтинг: 0 / 0
Как понять что SQL Server-у не хватает памяти?
    #39610852
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дампер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'





PLE_SECS = 1637 сек вроде больше 300 сек.

Сильно ли 1637 - страшное значение?

... пока со всторым скриптом разбираюсь...
Запустите тяжелый и длинный запрос. Если после его окончания значение PLE упадет практически до нуля - памяти для SQL так мало, что в кэши ничего не помещается.
...
Рейтинг: 0 / 0
Как понять что SQL Server-у не хватает памяти?
    #39610854
дампер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Andy_OLAPдамперпропущено...



PLE_SECS = 1637 сек вроде больше 300 сек.

Сильно ли 1637 - страшное значение?

... пока со всторым скриптом разбираюсь...
Запустите тяжелый и длинный запрос. Если после его окончания значение PLE упадет практически до нуля - памяти для SQL так мало, что в кэши ничего не помещается.


Понял, благодарю!


... пока со вторым запросом разбираюсь, там sql_memory_utilization_percentage=100
...
Рейтинг: 0 / 0
Как понять что SQL Server-у не хватает памяти?
    #39610860
дампер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Andy_OLAP,

разюбираюсь с

sys.dm_os_process_memory



там есть два последних поля, они сейчас 0.


Если бы с памятью было бы все плохо - они бы стали 1 ?
...
Рейтинг: 0 / 0
Как понять что SQL Server-у не хватает памяти?
    #39610863
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дамперAndy_OLAPпропущено...

Запустите тяжелый и длинный запрос. Если после его окончания значение PLE упадет практически до нуля - памяти для SQL так мало, что в кэши ничего не помещается.


Понял, благодарю!


... пока со вторым запросом разбираюсь, там sql_memory_utilization_percentage=100
Используй Силу, Люк! (c)

Можно скачать официальную утилиту мелкомягких под названием RamMap, прочитать кошерную статью из официального блога , учесть различные нюансы .
И понять, что куда идет на сервере.
...
Рейтинг: 0 / 0
Как понять что SQL Server-у не хватает памяти?
    #39610865
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дампер,

Оценить можно так:
Код: sql
1.
2.
3.
4.
5.
6.
select
 counter_name, cntr_value
from
 sys.dm_os_performance_counters
where
 counter_name in (N'Total Server Memory (KB)', N'Target Server Memory (KB)')

Если Target > Total, то памяти не хватает.
...
Рейтинг: 0 / 0
Как понять что SQL Server-у не хватает памяти?
    #39610926
Slava_Nik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andy_OLAPдамперпропущено...



PLE_SECS = 1637 сек вроде больше 300 сек.

Сильно ли 1637 - страшное значение?

... пока со всторым скриптом разбираюсь...
Запустите тяжелый и длинный запрос. Если после его окончания значение PLE упадет практически до нуля - памяти для SQL так мало, что в кэши ничего не помещается.
ерунду сказали, и что он получит? может такой выборки никогда не будет? ну да после этого запроса упадет PLE до нуля, но это не показатель.
Как выше уже говорили:
ple за период, а не за запрос или час
buffercash
операци lazy wrire
логи сиквела смотрите, если серверу совсем плохо, то это отразится в логах.
плюс есть еще пару счетчиков, связанные со страницами и dmv, но не могу точно сказать.
все это надо анализировать совместно, а не отдельно,

Как то на курсах в MS говорили, что идеально когда память на сервере равна объему бд, но это применимо когда бд небольшие.
У меня бд десятки Тб, памяти столько не поставишь, а даже еще сделаешь хуже серверу с огромным объемом памяти.

А конкретно по вашему вопросу и случаю, описали бы какой объем у вас есть, размер бд, и почему такой вопрос задаете.
...
Рейтинг: 0 / 0
Как понять что SQL Server-у не хватает памяти?
    #39610927
Slava_Nik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmдампер,

Оценить можно так:
Код: sql
1.
2.
3.
4.
5.
6.
select
 counter_name, cntr_value
from
 sys.dm_os_performance_counters
where
 counter_name in (N'Total Server Memory (KB)', N'Target Server Memory (KB)')

Если Target > Total, то памяти не хватает.
не показатель, отчасти.
...
Рейтинг: 0 / 0
Как понять что SQL Server-у не хватает памяти?
    #39611046
дампер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invmдампер,

Оценить можно так:
Код: sql
1.
2.
3.
4.
5.
6.
select
 counter_name, cntr_value
from
 sys.dm_os_performance_counters
where
 counter_name in (N'Total Server Memory (KB)', N'Target Server Memory (KB)')

Если Target > Total, то памяти не хватает.



А если равны? о_О

У меня они равны.
...
Рейтинг: 0 / 0
Как понять что SQL Server-у не хватает памяти?
    #39611065
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дамперУ меня они равны.Тогда смотрите другие счетчики:
Page Life Expectancy
Buffer Cache hit ratio
Page reads / sec
Page writes / sec
Lazy writes / sec
Memory Grants Pending
Total Server Memory
Target Server Memory
Available Mbytes
Pages / sec
Paging File % Usage

Почему вы вообще решили, что у вас проблемы с памятью?
...
Рейтинг: 0 / 0
Как понять что SQL Server-у не хватает памяти?
    #39611124
aleksrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смешались кони люди. Дельное только invm сказал.

Так, по порядку: Запустите тяжелый и длинный запрос. Если после его окончания значение PLE упадет практически до нуля - памяти для SQL так мало, что в кэши ничего не помещается.
Вообще не показатель. У меня в системе есть хранимка которая выполняется раз в 30 мин. и собирает статистику, выполняется минуты 3-5, выгребает чуть ли не 50 ГБ при кэше в 20. PLE падает до нуля, а Lazy Write счетчик до 900 подскакивает. Этот запрос выбирает данные которые потом и нафиг не нужны следующим запросом, в итоге PLE у меня не бывает больше 1700 примерно, а после этого запроса счетчик Page Read какое то время показывает довольно высокие значения. Вывод, будет скоро брать оперативу, в раза 3 увеличим и будет у меня счастье. Я к тому что надо знать нагрузку и понимать ее приничины, а не просто смотреть на цифры.

Buffer Cache hit ratio не показатель - https://www.red-gate.com/simple-talk/sql/database-administration/great-sql-server-debates-buffer-cache-hit-ratio/

Смотрите счетчики которые написал invm, смотрите самые дорогие хранимки и запросы в кэше по i\o
Код: 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.
select top 50 
s.name + '.' + p.name as [Procedure] 
,qp.query_plan as [Plan] 
,(ps.total_logical_reads + ps.total_logical_writes) / 
ps.execution_count as [Avg IO] 
,ps.execution_count as [Exec Cnt] 
,ps.cached_time as [Cached] 
,ps.last_execution_time as [Last Exec Time] 
,ps.last_physical_reads as [Last Ph reads] 
,ps.total_physical_reads as [Total Ph reads] 
,ps.total_logical_reads as [Total Log Reads] 
,ps.last_logical_reads as [Last Log Reads] 
,ps.total_logical_writes as [Total Log Writes] 
,ps.last_logical_writes as [Last Log Writes] 
,ps.total_worker_time as [Total Worker Time]--в микросекундах 
,ps.last_worker_time as [Last Worker Time]--в микросекундах 
,ps.total_elapsed_time as [Total Elapsed Time]--в микросекундах 
,ps.last_elapsed_time as [Last Elapsed Time]--в микросекундах 
from 
sys.procedures as p with (nolock) join sys.schemas s with (nolock) on 
p.schema_id = s.schema_id 
join sys.dm_exec_procedure_stats as ps with (nolock) on 
p.object_id = ps.object_id 
outer apply sys.dm_exec_query_plan(ps.plan_handle) qp 
order by 
[Avg IO] desc 
option (recompile); 






select top 50 
substring(qt.text, (qs.statement_start_offset/2)+1, 
(( 
case qs.statement_end_offset 
when -1 then datalength(qt.text) 
else qs.statement_end_offset 
end - qs.statement_start_offset)/2)+1) as [Sql] 
,qs.execution_count as [Exec Cnt] 
,(qs.total_logical_reads + qs.total_logical_writes) 
/ qs.execution_count as [Avg IO] 
,qp.query_plan as [Plan] 
,qs.total_logical_reads as [Total Logic Reads] 
,qs.last_logical_reads as [Last Logic Reads] 
,last_physical_reads 
,qs.total_logical_writes as [Total Logic Writes] 
,qs.last_logical_writes as [Last Logic Writes] 
,qs.total_worker_time as [Total Worker Time] --время исп. CPU 
,qs.last_worker_time as [Last Worker Time] 
,qs.total_elapsed_time/1000 as [Total Elps Time] 
,qs.last_elapsed_time/1000 as [Last Elps Time] 
,qs.creation_time as [Compile Time] 
,qs.last_execution_time as [Last Exec Time] 
,qs.query_plan_hash 
,qs.query_hash 
from 
sys.dm_exec_query_stats qs with (nolock) 
cross apply sys.dm_exec_sql_text(qs.sql_handle) qt 
cross apply sys.dm_exec_query_plan(qs.plan_handle) qp 
order by [Avg IO] desc option (recompile) 
--order by [Total Worker Time] desc option (recompile) 



Также если совсем все хреново можно еще посмотреть dm_exec_query_resource_Semaphores и dm_exec_query_memory_grants

Также учтите, что нехватка памяти может быть не нехваткой как таковой, а просто плохо написанным запросом.
...
Рейтинг: 0 / 0
Как понять что SQL Server-у не хватает памяти?
    #39611148
Eleanor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дамперразбираюсь с
sys.dm_os_process_memory

там есть два последних поля, они сейчас 0.
Если бы с памятью было бы все плохо - они бы стали 1?
Это значит, что прямо сейчас памяти у вас хватает. Было бы 1 - прямо сейчас не хватает.

Можно посмотреть, не было ли нехватки памяти в прошлом (обычно в течение нескольких дней) с помощью запроса к sys.dm_os_ring_buffers .
EventTime - время события,
IndicatorsProcess = 2 - Sql Server-у не хватало памяти,
IndicatorsSystem = 2 - ОС не хватало памяти.

Но, честно говоря, использую этот запрос только для сравнения со средними значениями. Если сообщений о нехватки памяти за день неожиданно стало больше, чем было раньше - стоит посмотреть, что произошло.
...
Рейтинг: 0 / 0
Как понять что SQL Server-у не хватает памяти?
    #39612083
step_ks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmдампер,

Оценить можно так:
Код: sql
1.
2.
3.
4.
5.
6.
select
 counter_name, cntr_value
from
 sys.dm_os_performance_counters
where
 counter_name in (N'Total Server Memory (KB)', N'Target Server Memory (KB)')

Если Target > Total, то памяти не хватает.
Хм, можете пояснить или указать источник?
Допустим, Target=56GB, Total=40 GB. Т.е. серверу больше 40 пока не надо. Почему можно считать, что не хватает?
...
Рейтинг: 0 / 0
Как понять что SQL Server-у не хватает памяти?
    #39612107
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
step_ksДопустим, Target=56GB, Total=40 GB. Т.е. серверу больше 40 пока не надо. Почему можно считать, что не хватает?Не обязательно не хватает, а может быть не хватает. Поэтому я и написал "оценить".
https://social.msdn.microsoft.com/Forums/sqlserver/en-US/1e51965d-fbb1-4f73-b977-5284516b3d45/total-server-memory-vs-target-server-memory-made-me-crazy?forum=sqldatabaseengine If Total Server Memory is less than Target Server Memory it can be a sign of memory pressure
...
Рейтинг: 0 / 0
Как понять что SQL Server-у не хватает памяти?
    #39612133
Фотография Mind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

И самое главное
авторHowever, I very rarely rely on this as a way to look for memory pressure, there a plenty of other counters that give you a better clue when SQL is in memory contention.
...
Рейтинг: 0 / 0
Как понять что SQL Server-у не хватает памяти?
    #39612377
Col
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно что еще не написали о самом простом:
DBCC MEMORYSTATUS
Материала для анализа там более чем достаточно.

Ну и совсем уж апокалиптический евент 17130
"Not enough memory for the configured number of locks"

Неужто никто не наступал?
...
Рейтинг: 0 / 0
Как понять что SQL Server-у не хватает памяти?
    #39612398
Фотография Mind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleksrovсмотрите самые дорогие хранимки и запросы в кэше по i\oВ случае серьезного memory pressure кэш планов будет достаточно быстро вымываться, так что толку на него смотреть особо нету. Да и впринципе, не понятно какая связь между средним количеством логических операций и памятью? Ну допустим есть дорогие запросы, а как это покажет что "SQL Server-у памяти не хватает"?
...
Рейтинг: 0 / 0
Как понять что SQL Server-у не хватает памяти?
    #39612405
Фотография Mind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ColСтранно что еще не написали о самом простом:
DBCC MEMORYSTATUS
Материала для анализа там более чем достаточно.Я бы не назвал это самым простым, и скорее проблема в том что материала слишком много. Надо точно знать куда смотреть. У вас есть какие то четкие критерии, типа если это значение больше такого то, значит серверу памяти не хватает?

ColНу и совсем уж апокалиптический евент 17130
"Not enough memory for the configured number of locks"
Неужто никто не наступал?Нет не случалось. Был другой весьма редкий случай "нехватки памяти".

CPU через 1-2 неделю после перезагрузки сервера стабильно уходило в 90%+, при этом все предложенные тут счетчики памяти не показывали вообще ничего, PLE намного больше 300, Free Memory так вообще 4Гб, всякие Total, Target тоже ничего вменяемого. Единственные аномалии были в высоком RESOURCE_SEMAPHORE_QUERY_COMPILE ну и соответственно Big Gateway-и проседали. В итоге, как оказалось, один из клерков (вроде этот USERSTORE_TOKENPERM) утекал, забирая себе всю память, вытесняя всех остальных, но только внутри Stolen Server Memory, не забирая память у Database Cache и не захватывая больше определенного лимита из Free Memory. Соответстенно PLE и прочие совсем не страдали, зато очень сильно страдал Plan Cache, что собственно и приводило к постоянным вытеснениям планов и компиляциям (не рекомпиляциям) ну и как следствие высокой CPU нагрузке.

Как раз таки только DBCC MEMORYSTATUS хоть как то намекал что преблема с памятью, но естественно нужно было знать, что конкретно искать, к тому же ожидания на Gateway были далеко не постоянными, так что нужно было еще и поймать тот момент когда это происходило.


Ко всему вышеперечисленному, я бы добавил что нужно смотреть на ожидания, а конкретно на:
PAGEIOLATCH_XX
RESOURCE_SEMAPHORE
RESOURCE_SEMAPHORE_QUERY_COMPILE

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


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