У Джонатана недавно возникла проблема у клиента: буферный пул SQL Server был принудительно уменьшен до абсурдно маленького размера — всего несколько сотен мегабайт, но при этом в операционной системе также практически не было свободной памяти. Page Life Expectancy (ожидаемое время жизни страницы) был равен нулю! Что же происходило?
В ходе исследования использования памяти SQL Server менеджер памяти показал, что целевой и общий объём памяти совпадают и составляют всего 1,2 ГБ, а параметр «lock pages in memory» был установлен правильно. Следующим шагом была проверка на наличие «баллонирования» (ballooning) в VMware — частой причины проблем с памятью, — но и это не было проблемой.
Затем запрос к sys.dm_os_sys_memory показал почти 100 ГБ в пуле не страничной памяти ядра (kernel non-paged pool). Джонатан сразу предположил, что это утечка памяти в драйвере ядра — основываясь на своём опыте написания драйверов с намеренно внесёнными ошибками, — поэтому следующим шагом было выяснить, какие фильтр-драйверы установлены в системе.
Это можно сделать с помощью команды fltmc на любой машине с Windows. Например, в командной строке, запущенной от имени администратора, на ноутбуке с Windows 10 отображается:
C:\WINDOWS\system32>fltmc
Filter Name Num Instances Altitude Frame
------------------------------ ------------- ------------ -----
bindflt 1 409800 0
UCPD 11 385250.5 0
WdFilter 11 328010 0
storqosflt 0 244000 0
wcifs 1 189900 0
dbx 5 186500 0
CldFlt 5 180451 0
FileCrypt 0 141100 0
luafv 1 135000 0
npsvctrig 1 46000 0
RsFx0800 1 41008.00 0
Wof 8 40700 0
FileInfo 11 40500 0
Затем вы можете исследовать каждый драйвер, с использованием Выделенных высот фильтрации, назначенных Microsoft (поскольку Microsoft назначает позицию в стеке фильтр-драйверов каждому из них), начиная с тех, у которых наивысшая высота. После этого можно доказать, что именно потребляет память, с помощью инструмента PoolMon из Windows Driver Development Kit (см. Использование PoolMon для поиска утечки памяти в режиме ядра).
Оказалось, в случае с клиентом это был драйвер от старого инструмента, который не был удалён — проблема решена!
Суть в следующем: не стоит мыслить шаблонно, что проблема, проявляющаяся в SQL Server, всегда является проблемой самого SQL Server. Иногда проблема кроется в окружении, а SQL Server оказывается невольной жертвой первопричины!

Комментариев нет:
Отправить комментарий