Очистка памяти, как связка AutoIt и RamMap
Сегодня возможно я нашел причину почему мои подконтрольные терминальные сервера сыпятся сообщениями в виде задач на нашу третью линию поддержки:
У пользователей отвалились сетевые диски, принтера, сканеры
При входе на TS висит надпись «Подождите»
При входе на TS черный экран и ничего более
Но в то же время часть пользователей которые уже подключились и работаю продолжают работать. Изучение структуры как все устроено я выявил следующую особенность.
Хотя как выявил, я уже с таким сталкивался не однократно, если говорят что не перенаправляются сетевые диски и т.д, то следует проверить что показывает «Диспетчер устройств
» по части «Физическая память (МБ)
» строка «Свободно
». В этих симптомах виновато значении ноль («0»
) или менее 1024
. Т.е. попросту терминальные пользователи отжали всю память себе и система просто напросто испытывает нехватку ресурсов. Диспетчер задач в этом случае ни под административным пользователем не под вхожем в группу локальных администраторов домена ничего вразумительного не покажет.
Что обычно делается:
- Смотрится что есть на системе из установленного и загруженного
ПО
- Смотрится можно ли добавить еще оперативной памяти (у меня
Windows Server 2008 R2 Standard = 32Gb максимум
)
и это помогает лишь отчасти, пользователей же много (если контора большая)
Есть еще выход — это задействовать утилиту rammap.exe в таком ключе:
Шаг №1: В систему скачиваю https://download.sysinternals.com/files/RAMMap.zip
, распаковываю и копирую исполняемый файл RAMMap.exe
в %systemroot%\system32
Шаг №2: Создаю каталог где будет располагаться скрипт созданный через AutoIt: C:\test\killram.au3
следующего вида:
1234567891011121314151617181920212223242526272829303132 | #RequireAdmin#Region ;**** Directives created by AutoIt3Wrapper_GUI ****#AutoIt3Wrapper_Outfile_x64=C:\test\killram.exe#AutoIt3Wrapper_UseX64=y#AutoIt3Wrapper_Res_Language=1049#AutoIt3Wrapper_Res_requestedExecutionLevel=asInvoker#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****;—————————————————————————- Local $hWndLocal $ret If Not WinExists(“[CLASS:RamMapClass]”) Then $ret = ShellExecute(‘C:\Windows\system32\RAMMap.exe’) If @error Then MsgBox(4096, ‘Message’, ‘Error Run RamMap.exe.’, 30) Exit 1 EndIfEndIf $hWnd = WinWait(“[CLASS:RamMapClass]”, “”, 10)If Not $hWnd Then MsgBox(4096, ‘Message’, ‘Windows RamMap not found, shutdown work’) Exit 2Else WinActivate(“[CLASS:RamMapClass]”, “”)EndIfWinMenuSelectItem($hWnd, ”, ‘&Empty’, ‘Empty S&tandby List’)Sleep(5000)Send(“{F5}”)Sleep(5000)WinClose($hWnd) |
Шаг №3: Затем преобразую данный au3
файл в exe
-файл:
Tools — Compile — вкладка AutoIt3/Aut2Exe
AutoIt3 version to use: Production (ver: 3.3.14.5)
Source: C:\test\killram.au3
Output type: exe
Target x64: C:\test\killram.exe
FileInstall Compression: Normal
Output arch: Compile x64 version
и нажимаю Compile Script
На заметку: в скрипте au3 нужно указывать точный путь до файла RAMMap.exe с соблюдение регистра, переменные окружения Windows не работают, ну или у меня не сработали. |
По итогу получаю скомпилированный exe
-файл который будет дергать исполняемый файл RAMMap.exe
в частности пункт настроек:
Empty Standby List – избавится, в свою очередь, от страниц из списка Standby, добавляя в свободную память (список Free)
Какие опции есть если просто запустить утилиту RAMMap.exe:
Empty Working Sets – очистит работающие наборы. Освобождает память в системных и пользовательских наборах (процессы ядра останутся нетронутыми – система “не упадёт”), перенося высвободившуюся память на страницы Stanby и Modified.
Empty System Working Set – очистит только системный кэш
Empty Modifed Page List – очистит память из страниц списка Modifed, записывая не сохранённые данные на жёсткий диск и сразу перенесёт их на страницы Standby
Empty Standby List – избавится, в свою очередь, от страниц из списка Standby, добавляя в свободную память (список Free)
Empty Priority 0 Standby List – очистит страницы памяти из списка страниц для процессов с низким приоритетом, отправляя их в список Free.
Вот такое решение я пока вижу для терминальных серверов не важно под какой ОС они работают, будь-то Server 2008 R2 Standard & Server 2012 R2 Standard и другие Windows системы.
Шаг №4: Так exe
—файл есть, остается довершить автоматизацию, настройкой задания на автоматический запуск killram.exe
каждый час и ожидать нового проявления падения или действительно данное псевдо-решение имеет место быть.
Я же настроил задание через «Планировщик заданий
» на двух системах и одна уже показала себе, заявка: «Не работает перенаправление дисков, не идет печать
». Задача отработала и указав первой линии чтобы проверили, а может ли удаленный сотрудник зайти на терминальный сервер и все ли у него хорошо — ответ, да все работает! Вот и не потребовалась перезагрузка сервера с целью очистки задействованной оперативной памяти, как делалось раньше по любому поводу без выяснения причины.
Посмотрим. А пока на этом у меня всё, с уважением автор блога Олло Александр aka ekzorchik.