Re[5]: [SqlServer-2016] жрёт процессор в Idle.
От: _ABC_  
Дата: 10.11.16 10:20
Оценка: 23 (2)
Здравствуйте, IID, Вы писали:

IID>На физической. Я про это выше писал. Что за лимиты ?

Disclaimer. Объяснение поверхностное, а значит содержит допущения, неточности и т.п. вещи. Ну и не без
участия КО оно написано. Кроме того, он может быть путанным и немного перескакивать с одного на другое.
Тут КО уже непричастен.

Каждому инстансу SQL Server можно задать минимальный и максимальный размер используемой памяти.
По умолчанию, эти размеры не ограничены и инстанс при необходимости пытается сожрать всю доступную память.
Если же возникает ситуация нехватки памяти другим приложениям или самой ОС, то винда требует освободить сколько-то памяти.

При незаданном минимальном размере (0 по умолчанию), сервер будет пытаться освободить память всегда, когда этого требует винда.
Скорее всего, внутри есть какая-то незадокументрированная скрытая граница, отличная от дефолтного нуля, но 16-й жрет больше,
чем предыдущие версии, а эту границу могли и не проапдейтить.

Если ты задашь минимальный размер, допустим, в 1 ГБ, то он стартанет с обычных 100+ МБ и не будет пытаться освободить память
по запросу ОС пока не достигнет размера 1 ГБ, а в последующем всегда будет держать за собой минимум 1 ГБ.

IID>SQL сервер работает вхолостую, ни одной пользовательской БД на нём нет.

Сам SQL сервер ни за что не отдаст сожранную память добровольно. Только, если винда затребует. А это уже внешний фактор, не зависящий
от того, крутится что-то на инстансе, или нет. Т.е., не SQL server решает, что ему памяти много, а OS.

И вот тут начинаются те вещи, что ты заметил. Винда по какой-то причине дает команду на освобождение памяти, инстанс начинает очистку — растет
нагрузка на ЦПУ, т.к. процесс очистки небесплатный. Память инстанс освободить не может по какой-либо причине (баг, или и так минимально возможное
количество памяти используется и т.п.) и процесс впадает в цикл, что выражается в постоянно занятом почти на 100% одном ядре.

Если ситуация повторится, и ты заметишь, что памяти в целом на машине мало свободной, попробуй ради интереса задать минимальный объем памяти для
SQL Server хотя бы в 210 МБ и посмотри, решит ли это проблему в загрузкой ядра.

Вот ссылка на статью в блоге, которая вроде бы вполне доступно и без особого углубления в детали описывает похожий сценарий.
https://danieladeniji.wordpress.com/tag/preemptive_xe_callbackexecute/
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.