23.3.26

Интересный случай… когда нет памяти в буферном пуле и нет доступной памяти в ОС

Автор: Paul Randal, The Curious Case of… no buffer pool memory and no OS memory available

У Джонатана недавно возникла проблема у клиента: буферный пул 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 оказывается невольной жертвой первопричины!


Комментариев нет:

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