26 ноября 2012 в 08:40

Странное поведение Task Manager в Windows Server 2012

Краткое содержание: история в картинках, как я «улучшал» Task Manager в Windows Server 2012

Преамбула


Началось всё с того, что я в тестовых целях (выяснить, есть ли принципиальное различие), поставил Windows Server 2012. Для тех, кто не знает, это такая Windows 8, только дороже. Ну, а ещё, от него можно оторвать GUI и поставить всякие разные роли.

Ну так вот, одна из наиболее приятных вещей в Windows 8 для меня — новый Таск Менеджер, и красивый и удобный. Какое же было моё удивление, когда я открыл его в WinServer 2012 и не увидел некоторых данных.
Вот пара картинок для понятности.


Windows 8:


Windows Server 2012


Как видно, не хватает пары вкладок, кроме того, отсутствуют столбцы с диском и сетью. Диск ещё отсутствут на вкладке Performance, но это хотя бы можно включить командой:
diskperf -y

Вооружившись гуглом, я выяснил, что проблема в следующем:
This is because disk metrics are disabled by default on Windows Server 2012 because of significant performance impact, however, it is enabled in Windows 8.Use Resource Monitor to gauge Disk and Network IO usage. — Syed Yusuf from Microsoft R&D

(тут подробнее)

Что в переводе на русский звучит как «слишком большая нагрузка на диск, поэтому мы это убрали».

Так и представляю картину: серверная, все бегают в мыле, сервер не отвечает, ужасающая нагрузка. И скромный админ в углу: «я случайно открыл таск менеджер на сервере вместо своего нетбука, я больше не буууду!».

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

В общем, меня это не устроило, и я начал исследовать проблему.

Версия 1. Реестр


Зная Microsoft и то, что всё настраивается в реестре, я начал копать taskmgr.exe с целью найти возможные ключи. Единственный подходящий ключ обнаружился в
HKLM\ System\CurrentControlSet\Services\Partmgr, EnableCounterForIoctl
Но как я уже выяснил раньше, этот ключ включается командой diskperf и интереса не представляет.

Версия 2. Неужели действительно проверка на тип системы?


Совершенно не веря, что такое может быть (Microsoft обычно просто выпиливает лишние файлы), я решил проверить, а что будет, если сказать Таск Менеджеру, что он на самом деле на клиентской системе.

Чтобы проверить версию системы из своего приложения, нужно вызвать функцию GetVersionEx. Вернётся структура OSVERSIONINFOEX, где в поле dwProductType будет указано, сервеная или клиентская версия системы.

При этом, GetVersionEx вызывает RtlGetNtProductType, которая в регистре ecx возвращает 1 для клиентской и 3 для серверной. С неё-то и начнём.

Отладчиками под Windows я пользовался мало, поэтому выбрал единственный, с которым умею обращаться в данном случае, WinDbg (прямая ссылка на не самую свежую версию). Для него есть замечательная команда, которой можно сделать автоматический брекпоинт с заменой:

bp ntdll!RtlGetNtProductType "as /x ReturnValue rcx; gu; ed ReturnValue 1; g"

(т.е. открываем наш taskmgr.exe, выполняем команду, запускаем выполнение).

И… идея сработала. Все вкладки появились, да ещё и полностью рабочие. Т.е. функционально всё присутствует, а отключено только по политическим мотивам (могли бы по тем же мотивам их просто спрятать по умолчанию).

Соответственно, нужно копать дальше в данном направлении. Ставим бряк на ntdll!RtlGetNtProductType и смотрим по Call Stack, когда нас вызовет реальный taskmgr, а не инициализационные куски. Выглядит это примерно так:


Идём по стектрейсу ставим брекпоинт на TaskMgr (или доходим вручную) и видим следующий код:


Это проверка кода возврата, тут нам делать нечего, идём чуть дальше:


Вот он, самый сок!
Сравнивается регистр на 1 и на 3, и в зависимости от ситуации идёт переход на нужную ветку.
Ставим al в 1 и наблюдаем что всё успешно работает. Половина пути пройдена. Нужно думать над решениями, как это всё оформить на постоянной основе.

  1. Можно сделать скрипт для WInDbg, который всё будет делать сам. Неспортивно
  2. Пропатчить память перед запуском TaskMgr. Вариант пришлось отбросить, потому что я не знаю как это сделать, а разбираться долго.
  3. Пропатчить сам taskmgr.exe. Самый простой вариант, только сломаем целостность файла и система может периодически его возвращать к старой версии. Но решил, что с этим можно прожить и стал думать над этим вариантом


Итак, нам нужно заменить данный код. Способов заменить его множество: сравнить al не с 1, а с 3, заменить jne, на je, изменить адрес джампа. В общем, я выбрал самый дубовый способ, заменить jne на пару nop'ов. Так что в результате, будет бессмысленное сравнение, затем прыжок куда надо. Делается это просто. Запоминаем нужную последовательность байт: 8a84244a0100003с01, находим её в вашем любимом Hex-редакторе и меняем на что надо. В данном случае 750c на 9090.

Сохраняем и…


Выясням, что мы сломали цифровую подпись файла (ну, кто бы сомневался). Значит её надо убить. Вариантов много, но мы на хабре, поэтому воспользуемся программой design от хабраюзера DnV.

Запускаем… и ничего. Те же проблемы с повреждённой подписью. Откуда он её берёт? Не буду утомлять рассказом про то, как я пытался с этим разобраться, подписывал файл самостоятельно, готов был бросить всё это дело, а оказалось…

(это скриншот из программы Stud_PE).

Заценили шутку от Microsoft? Целостность файла проверяется флагом в самом файле. Тайный смысл этого мне не понять, если только защита от глупых вирусов.
Как я дошёл до этого флага, сам не понимаю, но в общем, снимаем его, сохраняем, и… всё работает!

После этого заменяем оригинальный (не забывая раздать себе права на это действие), и пользуемся продвинутым Таск Менеджером.

Ну и бонусом пишем статью на хабр :) Надеюсь, что вам она была интересна.

Если кто захочет повторить в образовательных целях, то для проверки корректности результата вот вам файл.
+61
25868
106
force 89,3

Комментарии (50)

НЛО прилетело и опубликовало эту надпись здесь
+1
ozver, #
Всё зависит от того что вам нужно.
P. S. а на MetroTwit вы внимание не обратили? Ясно же что это не рабочая лошадка, а так для экспериментов.
0
denis_g, #
Вопрос не по теме: а что, в серверной версии тоже MetroUI есть?
0
force, #
Да, куда же без него. Только приложений изначально ни одного не стоит. Только Microsoft Store.
+2
denis_g, #
Да, вы правы — пожалуй, сервер без него будет работать процентов на 40 хуже :) Спасибо за инфу.
+6
force, #
Для начала зачем на серверной винде Opera и Chrome?

Сервер для тестов. Соответственно проверяется работа всего.

наличие или отсутствие вкладок вообще не должно интересовать

Если вы с UNIX больше знакомы, то представьте, что в команде top убрали пару столбцов, объяснив, что они много кушают и пользуйтесь альтернативами.
+11
Andrusha, #
Зачем в винде юзать консоль для того, для чего есть вполне удобный GUI, и он является не каким-то костылём, а штатным средством. Я тоже линуксы люблю, но, как говорится, кесарю — кесарево…
Это мог быть терминальный сервер, а опера с хромом — для его пользователей.
0
pauelstv, #
кмк хром ставится в узердир пользуна, не?
0
Andrusha, #
Можно скачать установщик для всех аккаунтов. Если пользователь уже поставил себе отдельно, то его копия автоматически удалится при следующем запуске Хрома (профиль сохранится).
support.google.com/installer/bin/answer.py?hl=ru&answer=126299
+1
Napseg, #
Например скачать на сервер какой-нибудь патч или вообще любой другой файл. Сделать это с ИЕ, который в режиме пришибленного параноика, весьма проблематично.
0
Doomsday_nxt, #
Режим «пришибленного параноика» отключается в пару кликов…
+1
cepera_ang, #
Да вы что! Проще оперу поставить.
0
Doomsday_nxt, #
Ну может кому-то опера больше нравиться, но установка её не проще :-)
+4
mihmig, #
Целостность файла проверяется флагом в самом файле

Б_я. Аааа, хотя понятно, это ж бизнес — система, т.е. надо и компаньонам (антивирусным компаниям) дать заработать.
+2
Antelle, #
Зачем вообще нужен этот говённый таск-менеджер? Есть же ProcessExplorer или ProcessHacker.
+4
Veider, #
Затем, что в Win8/2012 он перестал быть говённым.
+2
Antelle, #
Да? То есть, теперь там можно узнать, кто открыл файл или другой дескриптор по части его имени, и заставить закрыть его? Можно посмотреть stack trace? Поменять I/O Priority, page priority, кастомные права безопасности процессу или треду? В самом деле, надо его посмотреть. Возможно, он и стал лучше. Может я просто не в курсе.
0
xforce, #
В этом плане он стал скорее хуже :) Кастомные поля в нем например не выводятся больше. Т.е. показывает всё что видите на скриншоте и ни одним столбцом больше.
+2
force, #
Там во вкладке Details всё на месте. Можно выбрать поля.
+1
VenomBlood, #
Старое представление с настраиваемыми столбцами переехало в «Details».
0
Aux, #
Насчет всего перечисленного сходу не уверен, но многое точно умеет.
+1
MichaelBorisov, #
Странно, что Микрософт вообще не отказался от таск менеджера после того, как они купили с потрохами Sysinternals, и теперь тот же Process Explorer разрабатывается на деньги Microsoft.
+7
AStahl, #
А ведь некоторые над нами, линуксоидами, смеются: «Да кому, мол, нужны эти ваши открытые исходники».
Вот он красивый ответ кому и зачем.
0
Aux, #
Как мы наглядно видим — исходники не нужны. К тому же некоторый ОСС так написан, что только дебаггером его и лечить…
+1
develop7, #
Как мы наглядно видим — исходники не нужны
Научите тогда task manager, скажем, показывать скорость I/O каждого процесса в (К|M|Г)б/сек рядом с процентиками. «вот тогда мы и похохочем»©
некоторый ОСС так написан
А некоторый — не так. Но это хотя бы можно увидеть. А вот как написаны виндавсы — тайна за семью печатями.
+1
Aux, #
В винде есть dll injection, я в былые годы виндовый софт многому научить успел. Самый весёлый мой проект был — второй скайп с табами. Исходники? Не, не слышал.
+2
develop7, #
Я не отрицаю принципиальную невозможность допиливания софта без исходников. Я лишь постулирую, что при наличии исходников допиливать его намного проще. И будь исходники виндового task manager открыты, содержимое этого поста поместилось бы в твит.
0
Aux, #
Я как-то раз прикручивал флеш-плеер к Android 2.1 (офф. поддержка с 2.2), сначала я скачал несколько гигов исходников, потом я четыре часа собирал дебажный билд, потом я неделю воевал с премапом, а потом ещё неделю изучал исходники вебкита, сопровождая процесс трёх-часовыми рекомпиляциями.

Если бы под армовый линух были бы тулзы типа Hiew, я бы это запилил часа за два-три.

Исходники полезны только в виде библиотек (;
+4
cepera_ang, #
А значит открыть соседнюю вкладку Performance и оттуда вызвать Resource Monitor — куда сложнее :)
0
force, #
Да. 2 лишних клика и уже в ресурс-мониторе разбираться. А тут всё под рукой, просто и понятно.
+3
cepera_ang, #
Ну конечно, это windows server, нафига виндовс админу разбираться в рабочих инструментах.
0
force, #
Если есть простой и удобный инструмент, которого хватает, зачем использовать более продвинутый? Вот если не хватит, тогда да, можно и ресурс-монитор использовать.
0
adic3x, #
Мне некогда приходилось писать т. н. launcher, т. е. программу, которая модифицировала другую программу и передавала управление ей.

Подробности
Собственно, у нас есть малюсенькая программа, которая запускает процесс, пишет ему в память, и тихонечко уходит со сцены.
// Все писалось под x32 систему, совершенно не в курсе, есть-ли проблемы при использовании 64.

— Зовем CreateProcessW и в аргументе dwCreationFlags передаем CREATE_SUSPENDED, это создаст приостановленный процесс
— GetFileVersionInfoSizeW — я использовал для того, чтобы быть уверенным, что я работаю с нужным мне кодом, а не с чем попало. Можно для душевного спокойствия проверить и hash исполняемого файла целевой программы, и проверить, какие инструкции находятся по address, по которому планируется писать
— WriteProcessMemory, переписываем в целевом то, что Вы делали в hex редакторе. Я вот не помню, нужен ли VirtualProtect предварительный на данную память с фагом «ПишуЧитаюИсполняю»?
— Пускаем процесс (он же у нас замороженный)

Все это ассемблируется, и запускается наша программа, которая создает процесс уже целевой и запускает ея.
0
force, #
— WriteProcessMemory, переписываем в целевом то, что Вы делали в hex редакторе. Я вот не помню, нужен ли VirtualProtect предварительный на данную память с фагом «ПишуЧитаюИсполняю»?

А как мы узнаем адрес памяти, куда надо писать? С учётом ASLR как-то не очень понятно.
0
adic3x, #
Интересно! Я, сказать по правде делал это все для XP, хотя в Vista и 7 у других пользователей это работало прекрасно. Суть фишки, насколько я понял в том, что Image Base случаен (в таком случае компилятор также должен создавать код без абсолютных аддрессов, только с относительными?).

Первое, что приходит на ум — после того, как был создан процесс мы делаем VirtualAllocEx, пишем туда наш код, который с помощью GetModuleHandle узнает базовое смещение и от него будет плясать. Не осложнит ситуацию и то, что память, в которой происходит необходимая проверка может находиться в dll или памяти, выделенной динамически, но тогда необходимо будет колдовать со сплайсингом. С другой стороны я не знаю, одинаковы-ли аддресса внешних win32api (наверное уже 64) процедур для разных процессов. В XP я просто читал нужные мне аддресса из секции импорта своего процесса и напрямую писал их в выделенную через VirtualAllocEx память целевого процесса. Ах да, после WriteProcessMemory нашего кода по аддрессу, полученному от VirtualAllocEx мы делаем туда CreateRemoteThread и ждем WaitForSingleObject (что ждем не помню, точнее ясно, что завершении веточки, но какой там флаг — не помню) и только после этого пускаем процесс.
0
adic3x, #
added:
Нашел на wasm.ru упоминание о том, что Руссинович писал в своем блоге, что по крайней мере в Vista SP3 аддресса процедур из ядра системы одинаковы для всех процессов в рамках одной сессии (technet, сам топик не читал, поверил на слово). Следовательно, можно из секции импорта загрузчика импортировать любые аддресса процедур в целевой процесс, и с их помощью, действуя уже от имени целевого процесса искать базовый отступ.
0
force, #
С Vista прошло уже 2 операционные системы, вполне может быть что и рандомизировали и библиотеки. Хотя мало вероятно. Тут ещё по идее DEP может сыграть свою роль, если будем пробовать код править. Хотя если просто подменить вызов функции GetVersionEx, то может и прокатит.

В любом случае, задача эта более теоретическая в данный момент, и если заниматься, то нужно писать сразу более или менее универсальный патчер для любых систем.
0
adic3x, #
> Эта функция впервые появилась во 2-м пакете обновлений для Windows XP
Так пишет Википедия о DEP. Следовательно нас должен спасти virtual protect.

> и если заниматься, то нужно писать сразу более или менее универсальный патчер для любых систем.
Я не разбираюсь в серверных системах и технологиях вообще, но может лучше ничего не писать, а использовать просто другую программу для мониторинга или что то такое?
+10
YuriSerpinsky, #
Прочитал статью, но так и не понял, зачем сравнивать десктопную и серверную операционные системы, особенно, если для вас разница только в том, что «это такая Windows 8, только дороже».

А теперь, внезапно, новость №1 — мониторинг iops'ов реально нагружает дисковую подсистему и, в отличие, от планшета, сервер из-за этого может потерять определенный % производительности.
А новость №2 заключается в том, что серверная архитектура может быть виртуальной, облачной, сегментированной, распределенной, при этом, использовать локальные диски, FC-СХД, iSCSI-СХД, DFS и прочее. Часть из того, что я сейчас перечислил (оборудование), умеет считать утилизацию своих ресурсов, но сервер об этом может не знать.

Так же не следует забывать, что подобная ситуация как у Вас — смотреть определенные показатели в таскменеджере на сервере — это редкость. Для мониторинга серверов есть SCOM.

Отличная бонусная статья, но о чем она?
+1
force, #
Прочитал статью, но так и не понял, зачем сравнивать десктопную и серверную операционные системы, особенно, если для вас разница только в том, что «это такая Windows 8, только дороже».

Это была ирония.

Так же не следует забывать, что подобная ситуация как у Вас — смотреть определенные показатели в таскменеджере на сервере — это редкость. Для мониторинга серверов есть SCOM.

Статья о том: дайте нам выбор, а мы уж сами разберёмся. Именно потому что, таск менеджер запускается редко, смысла урезать функциональность не вижу никакого. Изменяются настройки только в нём, а не во всей системе, значит незапущенный не влияет не на что.
И такой вопрос — SCOM 2012 работает с новым сервером? Насколько я знаю, сервис пак для него ещё в бете, так что надо ждать релиза.
+1
MichaelBorisov, #
А это такой тренд последних лет — урезать функциональность жестко, без настроек. С легкой руки Apple. Чтобы пользователям не нужно было разбираться в этих настройках.
0
YuriSerpinsky, #
| Это была ирония.

А сходу не понял ;)

| Статья о том: дайте нам выбор, а мы уж сами разберёмся.

Ну вы же понимаете, что если инструмент может влиять на производительность, но зачем он нужен такой, особенно в серверной ОС, где каждый показатель может быть узким местом? В случае с Task Manager, для отображения iops'ов, необходимо, чтобы в фоне постоянно крутился счетчик производительности. Есть специальный инструменты, работающие ondemand, а именно — Performance Monitor.

| И такой вопрос — SCOM 2012 работает с новым сервером? Насколько я знаю, сервис пак для него ещё в бете, так что надо ждать релиза.

Да, вы правы, пока еще Beta с поддержкой WS2012 и W8, но смысл здесь в другом. Я пытался сказать, что для мониторинга серверов (а их, как правило, всегда больше одного) рекомендуется использовать решения, позволяющие мониторить показатели «по умному» — централизованно и автоматизированно. Иначе администраторы начинают взрывать себе мозг от бесчисленных ковыряний с серверами 1 на 1. ;)
+1
kost_bebix, #
Ну вы же понимаете, что если инструмент может влиять на производительность, но зачем он нужен такой, особенно в серверной ОС, где каждый показатель может быть узким местом? В случае с Task Manager, для отображения iops'ов, необходимо, чтобы в фоне постоянно крутился счетчик производительности. Есть специальный инструменты, работающие ondemand, а именно — Performance Monitor.


Что за подход «может влиять», «может быть узким местом»? Еще раз, автор топика поменял лишь (насколько я понял) отрисовку столбцов, то есть «счетчики производительности» как крутились так и крутятся. Скрыты они были примерно так же, как закрыть глаза ладонями.

Единственно возможный сценарий, где сокрытие действительно оправдалось бы — это если в дальнейшем коде системный монитор действительно будет включать какие-то системные службы, следящие за производительностью. Но тогда это и есть «on demand», о котором вы говорили.
+1
iavael, #
В случае с Task Manager, для отображения iops'ов

Э… Не то, чтобы я был большим специалистом в вопросе, но когда IOPS начали измеряться в процентах? И почему, например, в каком-нибудь linux ведение статистики дисковых операций не считается чем-то нагружающим сервер?
0
essential55, #
Подпишусь под каждым словом. Даже больше скажу, на 2003 при включении счетчиков и логировании этой информации, у меня юзеры на терминальнике, заметили, что просела производительность. И этот сервак не самый нагруженный.

А теперь для автора на серваке есть Resource Manager и Performance Monitor. Если у вас проблемы с производительность опытный админ всегда найдет узкое место. Вы вроде человек не глупый, но видно что с Windows вы не очень близко знакомы.
0
force, #
Ещё раз напишу:
Если есть простой и удобный инструмент, которого хватает, зачем использовать более продвинутый? Вот если не хватит, тогда да, можно и ресурс-монитор использовать.
Как пример, представьте что на сервере крутятся 10 одинаковых сервисов (со своими настройками). Вы замечаете, что есть проблема, быстро открываете таск менеджер и видите виновника сожравшего сеть/диск. И уже идёте с ним разбираться.
Да, можно запустить Performance Monitor, но это лишние действия, которые в принципе не нужны в данном случае.

Даже больше скажу, на 2003 при включении счетчиков и логировании этой информации
Может я не правильно вас понял, но логгирование IO влечёт за собой IO, что логично просаживает производительность.
0
alexxxst, #
А если просто включить режим совместимости для экзешника соответствующий?
0
force, #
Не помогает.
+2
kostik450, #
>сервер из-за этого может потерять определенный % производительности

Скорее всего, MS отказались от этого столбца не из-за производительности, а потому что на сервере он перестал показывать реальное состояние дел.

>представьте, что в команде top убрали пару столбцов, объяснив, что они много кушают и пользуйтесь альтернативами.

Представьте, что top стал показывать галиматью, и тогда ему отключили пару столбцов, чтобы сисадмины не названивали в саппорт и не говорили, что «наш сервер сошел с ума».
0
Dexif, #
Тут нельзя не вспомнить старое доброе… «Как пропатчить KDE под FreeBSD?»

Только зарегистрированные пользователи могут оставлять комментарии.
Войдите, пожалуйста.