Недостаточно системной памяти в пуле ресурсов "по умолчанию" для выполнения этого запроса. на 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» , и он начал работать.