Очистка памяти, как связка 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.