gifts2017

Принудительная очистка Standby - оперативной памяти по расписанию посредством утилиты RamMap и скрипта Autoit.

Опубликовал Сергей Маслов (LexSeIch) в раздел Администрирование - Системное

Для большинства пользователей операционная система – это «черный ящик», и что происходит внутри него – это таинство. Но иногда хочется «пнуть» этот ящик, что бы он работал так, как надо… Конечно, принудительная очистка standby памяти напоминает "танец с бубном" (вроде система должна делать это сама), но в некоторых случаях она помогает...

 «Памяти мало не бывает» -  Народное правило апгрейда компьютера.

Внимание!!! Все описанное ниже относится к Windows Vista и выше…

Каждый, кто хоть раз заглядывал (кто из любопытства, кто по долгу службы)  в «Монитор ресурсов» на закладку «Память» видел подобную картинку:

Рис 1.

Причем, через некоторое время, она существенно меняется (в зависимости от используемого ПО и настройки системы):

Рис. 2

Мы видим, что память из списка «Ожидание» (Standby) – растет, свободная память – уменьшается…

В данном случае свободной памяти почти не осталось:

Рис. 3

А в Standby памяти находятся большие файлы архивов вечернего бэкапа:

Рис. 4

И самое главное, есть 100% уверенность, что нахождение их в Standby памяти не целесообразно – бэкап уже закончился.

Теоретически, Standby память содержит кэшированные данные, которые возможно, когда-нибудь будут использоваться в дальнейшем… При этом, когда системе потребуется дополнительные ресурсы, системный менеджер памяти может освободить из списка Standby необходимую память.

 На практике, иногда случаются ситуации, подобные этой

 «В тестовом режиме гоняем сервер (8x2CPU AMD 64G RAM) баз данных на MS W2008R2 KR c MSSQL 2008. Под SQL выделено 50 G. Почти месяц машина отработала нормально, но последнии несколько дней вся свободная память из free перешла в Standby и производительность снизилась ... причем система говорит что используется всего 52-53 G. После рестарта система съедает полженные 52-53 Gи начинает привращение Free to Standby. По завершению сего процесса снова начинаются "дикие тормаза". 

p.s. сервер mssql+1cv81 4 базы: 2 торговли не типовых 65G каждая, 1 ЗУП 1,5G 1 бухгалтерия 14G  Подскажите как standby превратить в free «

Конечно не факт, что «тормоза» в данном конкретном случае возникли только по этой причине, но как говорят: «осадок остался».

Я так же замечал, что при работе некоторых приложений (особенно написанных для предыдущих ОС) количество свободной памяти иногда резко уменьшается и субъективно, система начинает «подтормаживать» а некоторые приложения, например 1С 7.7 Предприятие даже «вываливались» без всяких сообщений.  Чаще всего в подобных случаях спасает перезагрузка системы.

Так как Standby память – страницы физической памяти, которые активно не используются, и могут быть при необходимости выделены менеджером памяти другим задачам, значит, не будет ничего плохого, если мы освободим их без участия системы, но, конечно, корректно.

Есть прекрасная утилита фирмы Sysinternals (www.sysinternals.com) RamMap. Одна из опций данной программы, как раз, и отвечает за очистку Standby памяти.

 Рис. 5

Результат выполнения очистки (красым отмечена свободная память):

Рис. 6

 И в мониторе ресурсов свободной памяти значительно прибавилось:

 Рис. 7

Эта утилита, написанная легендарным Марком Руссиновичем в соавторстве с Дэвидом Саломоном, она прекрасно справляется с данной задачей. Ее авторы – признанные специалисты по Windows-системам (это к корректности реализации). К слову, весь пакет программ – это «швейцарский нож» для каждого системного администратора.

Единственный недостаток, то, что выбор и запуск данной опции в программе происходит в интерактивном режиме. Автоматизировать нажатия кнопок и выбор меню нам поможет простой скрипт на AutoIT:

;----------------------------------------------------------------------------

#RequireAdmin

#Region ;**** Directives created by AutoIt3Wrapper_GUI ****

#AutoIt3Wrapper_UseX64=y

#AutoIt3Wrapper_Res_Language=1049

#AutoIt3Wrapper_Res_requestedExecutionLevel=asInvoker

#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

;----------------------------------------------------------------------------

;           SAM -- 20/11/2013

;----------------------------------------------------------------------------

;  RunRamMap -- оболочка для запуска утилиты Sysinternals RamMap

;  - после запуска программы выполняется очистка Standby памяти

;  - после 10-15 секунд работы программа закрывается...

;

Оригинальная утилита должна находиться в каталоге: C:\UTIL\RAMMap\RAMMap.exe

;----------------------------------------------------------------------------

; RamMap -- работает только для Windows Vista и выше ...

;----------------------------------------------------------------------------

Local $hWnd                         ; идентификатор окна программы

Local $ret                               ; идентификатор программы

; Если программа еще не запущена - запускаем RamMAP

If Not WinExists("[CLASS:RamMapClass]") Then

            $ret = ShellExecute('C:\UTIL\RAMMap\RAMMap.exe')

            If @error Then

                        MsgBox(4096, 'Сообщение', 'Ошибка запуска RamMap.exe.', 30)

                        Exit 1

            EndIf

EndIf

; Ожидаем появление окна программы RamMap

$hWnd = WinWait("[CLASS:RamMapClass]", "", 10)

If Not $hWnd Then

            MsgBox(4096, 'Сообщение', 'Окно RamMap не найдено, завершаем работу')

            Exit 2

Else

            WinActivate("[CLASS:RamMapClass]", "")            ; наше окно - активное

EndIf

; Выбираем пункт "Empty Standby List" в меню "Empty" программы

WinMenuSelectItem($hWnd, '', '&Empty', 'Empty S&tandby List')

; ждем выполнение очистки 5 сек... (ориентировочно...)

Sleep(5000)

; обновляем экран

Send("{F5}")

; Ждем 5 секунд, чтобы увидеть результат и выйти...

Sleep(5000)

; Закрываем программу.

WinClose($hWnd)

;----------------------------------------------------------------------------

Скрипт компилируем в исполняемый файл. После чего, в Планировщике заданий можно создать системное задание по расписанию, которое, например, перед началом рабочего дня, очищает память, тем самым освобождая так необходимые пользователю ресурсы.

Еще раз повторюсь – эта утилита (RamMap) работает на Windows Vista и выше…

В архивном файле находится исходный текст скрипта и скомпилированные модули для запуска в 32 и 64 разрядных системах. Свежую версию утилиты RamMap лучше загрузить с сайта автора: http://live.sysinternals.com/rammap.exe

PS: Для тех, кто  любит разбираться в деталях – ссылка на статью по организации управления памяти в Windows: Here be dragons: Управление памятью в Windows как оно есть 

Мир Вашему дому!

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
RunRamMap.zip
.zip 824,03Kb
28.09.16
50
.zip 824,03Kb 50 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Алекс Одинэсник (Alex1Cnic) 25.11.13 08:19
Интересно, а как бы такую штуку rammap для win XP сделать или существуует подобная утилита??
2. Сергей Маслов (LexSeIch) 25.11.13 10:43
К сожалению RamMap, только начиная с Vista - в XP видимо - другая модель управления памятью.
3. Alex (AlexBugs) 27.11.13 08:23
А для сервера с MS W2008R2 64 bit эта утилитка подойдет? кайф от ее использования будет?
4. DAnry (DAnry) 27.11.13 19:26
Спасибо. Интересная статья.
5. Сергей Маслов (LexSeIch) 28.11.13 04:06
(3) AlexBugs,
Да, подойдет - скриншоты в примере, как раз сняты в такой системе. RamMap - очень полезная утилита, подробнее с ней можно ознакомиться в книге Руссиновича, Маргозиса: "Утилиты Sysinternals. Справочник администратора". А на счет кайфа - все зависит зависит от ПО, которое у Вас запущено. По крайней мере хуже не будет.
6. Дмитрий Конаков (dkonakov) 21.04.14 10:54
Очень полезная статья! Решила многие мои проблемы на сервере терминалов.
7. Сергей Маслов (LexSeIch) 21.04.14 18:27
(6) dkonakov,
Если можно, немного подробнее о проблемах. В моей практике, например, наблюдалось некоторое замедление работы программ, после запуска некоторых приложений в течении дня (поэтому утром, перед началом рабочего, дня принудительно очищаю память). А какие проблемы были у Вас?
8. Divisi0n_by_zer0 11.05.15 15:16
супер скрипт! на сервере 16 гигов памяти, после ночного бэкапа вся standby была загажена кусками файловых бэкапов... а теперь всё хорошо )
10. Игорь Масилюк (mas76) 13.07.15 17:24
скомпилировал скрипт, но не работает сброс стенбая и закрытие программы
11. Игорь Масилюк (mas76) 13.07.15 17:46
все отбой все получилось, спасибо
12. Виктор Потапов (Vic_V) 11.08.15 07:59
Статья полезная. Ручное использование утилиты помогает., но полностью Standby память не очищается, из 1600 осталось около 700 К занято.
Сам скомпилировать скрипт не могу, а специально зарабатывать $m не буду.
13. Капитан Немо (capitan) 11.08.15 11:37
На самом деле, существует определенное количество специализированных менеджеров памяти - пример Cacheman.
По моим ощущениям на порядок возрастает дисковая активность.
И к тому же, у меня есть подозрение - windows сам разруливает как standby превратить в free.
В любом случае автору респект за интересную статью.
14. Богдан Суконнов (bogdan_sukonnov) 15.10.15 18:05
В заголовке ошибка - утилита называется RAMMAP. А вообще, только она и помогла, тоже сервер через некоторое время выедал free память и начинал тормозить. Перезагрузка, конечно помогала, и во многих отношениях она лучше. Но если перезагрузить никак, а память освободить нужно - эта утилита просто спасение!
LexSeIch; +1 Ответить
15. Сергей Косячков (KSV53) 11.12.15 21:45
каждый раз не поперезагружаешь, а выкидывать каждый раз пользователей не вариант
16. Дмитрий Конаков (dkonakov) 17.01.16 16:15
(7) LexSeIch, у меня проблемы начинались, когда свободная память приходила к нулю. А на текущем этапе, когда перешли на управляемые формы, приходится делать раза 2-3 в день, 32 Гигобайта на 2008 сервере не хватает.
17. Сергей Маслов (LexSeIch) 20.01.16 06:09
(16) dkonakov,
Не пробовали, при недостатке памяти, утилитой RamMap проверить на каких процессах, файлах "уходит" память.
18. nick e (nick_e) 12.05.16 09:43
Полезная статья. Хотел запускать RAMMap.exe без указания пути, не работает при запуске из планировщика задач.
Чтобы каждый раз скрипт не перекомпилировать когда папку хранения программы меняешь, сделал так:
$ret = ShellExecute(@ScriptDir &'\RAMMap.exe')
gabriel20; LexSeIch; +2 Ответить
19. Влад Верпетов (gabriel20) 31.08.16 07:21
(3) AlexBugs, на сервере 2012R2 работает на ура
20. Tomov Alex (almot77) 07.10.16 17:50
Есть утилита CLI называется EmptyStandbyList.exe
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа