У нас возникли проблемы с памятью в MS Sql 2008 R2. Похоже, есть утечка памяти, которая постоянно увеличивается в использовании памяти, пока не достигает примерно 1,5 ГБ, а затем останавливается.
Мы использовали следующий сценарий, чтобы попытаться определить, какая база данных может быть причиной. Однако мы, похоже, не видим никаких доказательств с результатами, связанными с какой-либо конкретной базой данных. Каковы передовые методы поиска такой проблемы?
-- Note: querying sys.dm_os_buffer_descriptors
-- requires the VIEW_SERVER_STATE permission.
DECLARE @total_buffer INT;
SELECT @total_buffer = cntr_value
FROM sys.dm_os_performance_counters
WHERE RTRIM([object_name]) LIKE '%Buffer Manager'
AND counter_name = 'Total Pages';
;WITH src AS
(
SELECT
database_id, db_buffer_pages = COUNT_BIG(*)
FROM sys.dm_os_buffer_descriptors
--WHERE database_id BETWEEN 5 AND 32766
GROUP BY database_id
)
SELECT
[db_name] = CASE [database_id] WHEN 32767
THEN 'Resource DB'
ELSE DB_NAME([database_id]) END,
db_buffer_pages,
db_buffer_MB = db_buffer_pages / 128,
db_buffer_percent = CONVERT(DECIMAL(6,3),
db_buffer_pages * 100.0 / @total_buffer)
FROM src
ORDER BY db_buffer_MB DESC;
Если это выделенный сервер SQL Server, на котором не выполняется репликация, не выполняется DTS / SSIS и не выполняется какой-либо другой процесс, который также требует значительных байтов частного доступа (по счетчикам процессов perfmon.msc), для начала возьмите общую физическую память в МБ (запустите msinfo32.exe, если не уверены), умножьте это число на 0,8, округлите результат до целого числа и в окне запроса выполните:
EXEC sp_configure 'максимальная память сервера (МБ)', 'результат'
где «результат» - это только что вычисленное целое число.
На данный момент убедитесь, что в стартовой учетной записи SQL Server есть не получил право «Блокировать страницы в памяти» (через gpedit.msc).
Если есть другие процессы, требующие значительных байтов байтов, вам необходимо дополнительно уменьшить максимальный объем памяти сервера. Чем больше вы уменьшаете максимальный объем памяти сервера, тем меньше SQL Server может использовать память для кэширования дискового ввода-вывода (и других потребностей кэширования), таким образом, тем выше риск того, что SQL Server станет медленнее, чем считается приемлемым. Добавление дополнительной памяти может быть жизнеспособным выбором (особенно с учетом стоимости 1,5 ГБ ОЗУ).
После настройки максимального объема памяти сервера используйте perfmon.msc для отслеживания счетчиков объекта Process для байтов частного и виртуального доступа, счетчика Avail MBytes объекта Memory и счетчиков Target Server Memory и Total Server Memory объекта диспетчера памяти SQL Server. Используйте интервал опроса 5-15 секунд и оставьте perfmon запущенным до тех пор, пока проблема не будет обнаружена. После обнаружения остановите perfmon и проверьте ее результаты. Когда количество доступных МБ упадет до ~ 4-5 МБ, ожидается, что SQL Server уменьшит объем памяти целевого сервера, а общий объем памяти сервера будет следовать за этой целевой памятью.
32-разрядный процесс (например, 32-разрядный SQL Server) не может адресовать более 2 ГБ физической памяти, если не используется AWE. 64-битный SQL Server может адресовать больше памяти, чем вы можете себе позволить :).
Наконец, расскажите подробнее о том, что имеется в виду под «сбоем службы». Что сообщает журнал ошибок SQL Server во время сбоя? Что сообщает журнал системных событий Windows во время сбоя?