none
Stolen Server Memory.объект Locks RRS feed

  • Вопрос

  • Доброго времени суток!

    Microsoft SQL Server 2016 (SP1-CU1) (KB3208177) - 13.0.4411.0 (X64) 
    Jan  6 2017 14:24:37 
    Copyright (c) Microsoft Corporation
    Standard Edition (64-bit) on Windows Server 2012 R2 Standard 6.3 <X64> (Build 9600: ),

    Max server memory (MB) = 92160.

    Из них :

    36604.46 Занял Кеш и около 50 гб колеблется в Lock Memory ( https://msdn.microsoft.com/ru-ru/library/ms190216.aspx ).

    Как понять , чем именно сервер занял данное количество памяти и какие процессы последовали данному?(То что написано в статье не отвечает к сожалению на мой вопрос).

    С данной проблемой столкнулся после замены 2008R2 на 16.

    Заранее спасибо.

    20 марта 2017 г. 11:02

Ответы

  • Итого:

    Начал исследовать ситуацию, когда создается большое количество блокировок (ведь не должно копиться так много, а где эскалация?), нарвался на кусок кода и в нем хинт rowlock. Исправили, пересобрали приложение которое использовал данный хинт, более проблема себя не проявляет память динамически резервируется и освобождается.

    22 марта 2017 г. 8:04

Все ответы

  • Так, кажется осознал немного.

    select 
    sum (
    (locks*94)
    /1024

    from sys.dm_exec_requests ec
    cross apply (
    SELECT 
    request_session_id, 
    cast(COUNT (*)as bigint) locks
    FROM sys.dm_tran_locks trn
    where ec.session_id=trn.request_session_id
    GROUP BY request_session_id 
    )b

    Снизил max degree of parallelism до 4, очистил кеш.

    Память вернулась данный запрос более не возвращает 100500 гб, но при возникновении большого количества блокировок, когда доходит например до 15 гб, память остается зарезервированной.

    Почему сервер не возвращает память для дальнейшего использования другими процессами? 

    20 марта 2017 г. 13:04
  • А почему должен? Использование настроек min и max server memory не решает ваши проблемы?
    mssql ориентирован скорее на dedicated режим использования. Разделение ресурсов между несколькими равноправными сервисами требует ручной настройки и отличного понимания механизмов работы всех крупных потребителей (массовое использование MMF, к примеру, может сильно поменять расклад  и общей архитектуры решения
    20 марта 2017 г. 16:23
  • Ну в общем, да, должен.

    В кратце обрисую картину:

    в один момент для блокировок было задействовано максимальное значение памяти = 60% от max server memory. 30% занял кеш, 10% допустим планы. Итого вся память использована. Далее Например какому либо клерку необходимо получить памяти (Блокировок в текущем моменте нету или например они занимают 10 % - фактически). В результате либо что то выгружается из кеша, либо клерк и вовсе не получит памяти. А при этом 50% памяти висит "просто так". 

    При этом в 2008R2 я подобного не замечал. Честно говоря больше на багу похоже. Не выполнять же FREESYSTEMCACHE по несколько раз в день.

    К тому же:() мсдн

    Если параметр locks имеет значение по умолчанию 0, порог укрупнения блокировок достигается, если память, используемая объектами блокировки, составляет 24 % от памяти компонента Database Engine, исключая память AWE. Структура данных, представляющая блокировку, имеет длину примерно в 100 байт. Этот порог динамический, поскольку компонент Database Engine динамически получает и освобождает память в целях компенсации меняющейся рабочей нагрузки.

    "динамически получает и освобождает память".

    И вот есть ли еще какие варианты посмотреть почему это не происходит или сходу идти к в поддержку? 

    • Изменено M.Dornostup 20 марта 2017 г. 18:26
    20 марта 2017 г. 18:19
  • Итого:

    Начал исследовать ситуацию, когда создается большое количество блокировок (ведь не должно копиться так много, а где эскалация?), нарвался на кусок кода и в нем хинт rowlock. Исправили, пересобрали приложение которое использовал данный хинт, более проблема себя не проявляет память динамически резервируется и освобождается.

    22 марта 2017 г. 8:04