Недостаточно системной памяти в пуле ресурсов "по умолчанию" для выполнения этого запроса. на sql

У меня есть работающий сервис, который получает 50-100 запросов в минуту. И это не дорогостоящие запросы. Этот сервис работает около 3-4 месяцев без каких-либо ошибок.

Внезапно несколько дней назад он начал выдавать сообщение "Недостаточно системной памяти в пуле ресурсов" по умолчанию "для выполнения этого запроса". ошибка иногда. Когда я исследовал проблему, я увидел, что sqlservr.exe использовал ~1,5 ГБ оперативной памяти и%25 процессора (все 1/4CPU). И когда я перезапустил sqlservr.exe RAM начинается с ~50 МБ и медленно увеличивается, пока не станет ~1,5 ГБ, а затем приводит к сбоям в приложениях, использующих его.

После небольшого исследования я понял, что это вызвано тем, что я использую SQL-сервер. Это было экспресс-издание, ограничивающее число до тех. Поэтому я обновил свой sql сервер с 2008r2 express до 2012 предприятия. Когда я запустил службу, я подумал, что мои проблемы наконец-то закончились, поскольку служба использует только ~60 МБ памяти, но, к сожалению, через час такая же проблема начала возникать, но на этот раз используемая память, которую я вижу в диспетчере задач Windows, по-прежнему составляет ~60 МБ, не превышать никаких ограничений.

я использую EntityFramework как ORM в сервисе wcf. И наряду с этим у меня есть SqlQueryNotification(брокер и прочее) система для некоторых операций кэширования.

Я пропускаю некоторые важные точки конфигурации? Или 6 Гб памяти и моих 4 процессоров действительно не хватает для этого? Но этого не может быть, потому что та же самая нагрузка была такой же в течение 3 месяцев, и тогда не было никаких ошибок, и не было никакого изменения кодов.

оперативная память выделена

использование оперативной памяти

4 ответа

Решение

SQL Server будет начинаться с необходимого объема памяти, а затем медленно наращивать, пока он не использует все выделенное ему в свойствах сервера:

Он не освободит эту память, пока служба не будет перезапущена; это по замыслу.

Обычно рекомендуется оставить 2 ГБ для ОС, и вам следует помнить о любой другой обработке, выполняющейся на том же сервере, что и SQL. Обычно рекомендуется иметь SQL Server на своем собственном сервере, и на нем больше ничего не работает.

Тем не менее, 1,5 ГБ оперативной памяти для SQL Server не так много. Если у вас нет больше доступных, возможно, пришло время добавить некоторые или обновить сервер.

Смотри также: Technet, Brent Ozar

Я отправляю этот ответ, потому что кому-то он может быть полезен.

Вы можете установить max server memory даже с этим запросом:

sp_configure 'show advanced options', 1;  
GO  
RECONFIGURE;  
GO  
sp_configure 'max server memory', 32768;   -- for 32 GB
GO  
RECONFIGURE;  
GO

Также вы можете использовать этот запрос для освобождения памяти без перезапуска службы, просто установив значение 2 ГБ (2048) и снова изменив значение на 32 ГБ (32768) или на желаемое значение.

Пожалуйста, не устанавливайте его ниже 1 ГБ, потому что это вызовет ошибки при выполнении запросов, и поэтому вам нужно будет перезапустить службу, чтобы иметь возможность выполнять запросы, даже этот запрос, чтобы снова увеличить память.

В нашем случае это произошло из-за типов таблиц, оптимизированных для памяти, с огромным объемом данных. Одновременно было несколько вызовов разных хранимых процедур, каждая из которых использовала один и тот же тип таблицы и загружала в нее огромное количество записей (>100 000). Для нашего приложения был способ пропустить вставку данных в тип таблицы и использовать ее только в особых случаях.

CREATE TYPE [TestType] AS TABLE (
    [TestOrder]    VARCHAR (1500)    NOT NULL,
    [TestDepartment] UNIQUEIDENTIFIER NULL,
    [TestCourse] UNIQUEIDENTIFIER NULL,
    [TestStudent] UNIQUEIDENTIFIER NULL,
    INDEX IX_Test NONCLUSTERED (TestOrder))
    WITH (MEMORY_OPTIMIZED = ON);

В моем случае это не удавалось только для определенных запросов. Поэтому я изменил «максимальное количество запросов на запрос на 2048» , и он начал работать.

Другие вопросы по тегам