Як змусити SQL Server звільнити його пам'ять?


19

Я знаю, що SQL любить ОЗУ, але випускає його, коли Windows запитує. Я знаю, що саме так повинен працювати SQL. Але у мене є адміністратор Windows, який не впевнений, що SQL насправді поверне оперативну пам’ять, і на цьому конкретному (віртуальному) сервері SQL не потрібно багато, як тільки Служби аналізу будуть закінчені, але на цьому сервері більше нічого не турбує просити SQL багато.

Тому я намагаюся запевнити адміністраторів Windows, що проблем з віртуальним середовищем не є "тому, що SQL використовує занадто багато оперативної пам'яті", але я не можу переконати SQL звільнити його без перезавантаження служби.

Обробляючи кубики, служба SQL із задоволенням займає 8 Гб оперативної пам’яті, але оскільки на неї немає тиску, вона не випускає багато цього за звичайний день. Хлопці з Windows кричать, і було б набагато приємніше випустити SQL це.

Я не хочу використовувати налаштування максимальної пам'яті, тому що я дійсно хочу, щоб SQL використовував стільки оперативної пам'яті при обробці. Я просто хочу, щоб він згодом знову знизився.

Можливо, це дублікат обох SQL Server, що не звільняє пам'ять та відновлює пам'ять з SQL Server , але мені цікаво, чи є інша відповідь. Чекаючи, коли Windows повернеться, не збирається переконувати тут хлопців Windows. Перезапуск послуги - це варіант, але я дійсно не прихильник цієї ідеї.

Я хочу знати, як змусити Windows просити його назад ...


2
Що ... sysadmin скаржиться на оперативну пам'ять, яка використовується? Мені стає гарно, коли оперативна пам'ять НЕ використовується, тому що якщо її не використовувати, вона просто витратить ...
Марк Хендерсон

Я також не розумію, якщо машині не потрібна пам'ять - де проблема? Так нормально працюють операційна система та її додатки ... враховуючи, що робоче навантаження з простою службою SQL зберігає більшість пам’яті, коли нічого іншого не потрібно, це може збільшити час відгуку та / або продуктивність для наступного завдання SQL?
Оскар Дувеборн

Адміністратор Windows вважає, що SQL підкреслює машину, оскільки процес має стільки оперативної пам'яті. Я знаю, що це поле не перебуває під напругою від SQL, і я можу це продемонструвати, перезапустивши службу SQL, показавши, що вона отримує багато оперативної пам'яті лише при отриманні даних для обробки SSAS. Тому я хочу, щоб SQL звільнив пам'ять, щоб показати кількість оперативної пам’яті, яку SQL використовує решту дня. Справа не в тому, щоб вони надавали більше оперативної пам’яті, просто змусивши їх перестати звинувачувати SQL у роботі.
Роб Фарлі

2
Погодьтеся з Farseeker, sysadmin повинен бути задоволений тим, що використовується оперативна пам'ять. Якщо це не відшкодовано, сервер цього не потребує. Можливо, попросіть sysadmin подивитися на помилки сторінки, щоб показати, що система не піддається напрузі?
Нік Кавадіас

2
Якщо ваш системний адміністратор не розуміє, що представляють помилки сторінки та чому споживається пам'ять, але реальних помилок сторінки не виникає, це не проблема, я не знаю, як вам допомогти. Ти не можеш виправити дурного. Одне, що ви можете зробити, - це використовувати sp_configure для налаштування максимальної пам'яті, коли ви не використовуєте систему, та налаштування резервного копіювання, коли вам це потрібно. Це здається досить нерозумним. sp_configureце взагалі те, що ви повинні встановити один раз і залишити в спокої.
Шматочки бекону

Відповіді:


12

Я вважаю, що ваш єдиний варіант - перезапустити службу SQL або запустити програму, яка споживає багато пам'яті, щоб змусити SQL звільнити її.

Мені подобається пропозиція @ Ніка Кавадіаса: слідкуйте за пам'яттю: Сторінка помилок / лічильник продуктивності Sec, щоб показати, що SQL не ставить пам'ять ОС під тиском.


2
Спасибі Мітч ... Дозвольте мені знайти текстовий файл 10 Гб для блокнота.
Роб Фарлі

хаха !, насправді це не погана ідея!
Мітч Пшеничний

можливо, скористайтеся файлом 2 Гб ...
Mitch Wheat

5

Один із способів показати їм, що це зробить, це змусити SQL Server пережувати всю пам'ять. Потім скопіюйте величезний файл у мережу (для цього чудово працюють великі файли резервного копіювання SQL). Це призведе до заповнення кеш-пам'яті системи, і Windows почне запитувати назад у SQL його пам'ять. SQL почне повертати пам'ять назад до ОС, поки не досягне вашого мінімального значення пам'яті.

(Вибачте, не отримали все запитання через Twitter. Мабуть, мабуть, було потрібно понад 140 символів.)


1
Я сподіваюсь на якийсь процес, який я можу використати, який попросить SQL повернути пам'ять (після того, як буфери були очищені та опущені), але не маючи каліки поле, щоб це зробити.
Роб Фарлі

Я не думаю, що існує спосіб змусити менеджер пам'яті Windows попросити повернути пам'ять, не змушуючи проблему іншим способом. Можливо, ви могли б написати щось, що потрапляє безпосередньо на API Win32, щоб це зробити, але, наскільки я знаю, єдиний спосіб запустити Windows, щоб повернути запит на пам'ять, - це змусити її мати більше пам'яті для іншого процесу. Зверніться до Боба чи Пола, вони можуть мати більше інформації.
mrdenny

3
Драйвер повітряних кульок VMware робить саме це - він просить Windows отримати більше і більше пам’яті для того, щоб SQL Server (або будь-яка інша програма) відмовитися від своєї пам’яті.
Брент Озар

Так - я сподівався, що мені не доведеться робити щось подібне.
Роб Фарлі

@BrentOzar, драйвер балона VMware відновлює пам'ять лише з кеш- пам'яті системи , а не фактичну пам'ять процесу; він розроблений як спосіб сказати ОС "не використовувати всю наявну пам'ять для дрібниць", а не збивати її.
Массімо

2

Ви згадуєте "кубики", тому незрозуміло, чи говорите ви про двигун AS або реляційний двигун. Реляційний двигун може звільнити пам'ять на вимогу:

DBCC FREESYSTEMCACHE('<cache name>');

Звідки "ім'я кеша" взято з sys.dm_os_memory_clerks . Специфікація DBCC FREESYSTEMCACHE згадує лише губернаторські пули, але багато інших кешів можна фактично виселити.

Але якщо вся пам'ять буде використана буферним пулом, то вилучення всього буферного пулу призведе до величезної деградації продуктивності та величезного навантаження вводу-виводу. Нехай SQL сам впорається з цим.


1
Привіт Ремю, кеш-реляційний буфер є великим після обробки куба. Після цього я дуже хочу, щоб кеші були очищені, випали, і пам'ять повернулася до Windows. DBCC DROPCLEANBUFFERS і FREESYSTEMCACHE спорожняють кеш, але не повертають пам'ять у Windows, тому це не зовсім те, що я хочу.
Роб Фарлі

2
Теоретично ти можеш підробити тиск пам'яті (наприклад, ти можеш батутувати QueryMemoryResourceNotification msdn.microsoft.com/en-us/library/aa366799%28VS.85%29.aspx ), але я б дійсно насправді не ходив туди. Якщо SQL не звільняє виділену пам'ять, тому що ОС її не потребує. ОС не потребує пам'яті, оскільки SQL є єдиним додатком на хості ( stackoverflow.com/questions/1401834/… ), правда? Якщо ви запускаєте якусь іншу програму разом із SQL, у вас вона з'являється.
Рем Русану

2

І з двигунами AS, і з DS ви можете поставити кришку пам'яті, щоб вони залишалися нижче безпечного порогу; це рекомендується на 64-бітних машинах з великою кількістю оперативної пам’яті та / або кількома примірниками SQL. Принаймні, двигун бази даних, якщо ви зміните кришку пам’яті на нижчу, ніж поточне використання, це зменшить об’єм пам’яті під час руху без необхідності перезапустити послугу, але не впевнений у SSAS.


З кришкою все нормально, але я думаю, що я хочу спустити максимум пам'яті після обробки, а потім відсунути її назад, коли я краще очищую буфери, опускаю їх і прошу Windows про деякий тиск пам'яті.
Роб Фарлі

1

Найпростіше, що я знайшов - це перейти до властивостей пам’яті сервера, ввести менше значення, застосувати, почекати кілька хвилин і відрегулювати резервну копію конфігурації.

Ми також виявили, що використання пам'яті sql серверів може фактично покращити продуктивність сервера, оскільки це дає Windows більше оперативної пам’яті для кешування тощо

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.