Изменение приоритета процесса службы (или как жить на Windows XP с WSUS)
Я думаю, все администраторы в большей или меньшей степени сталкивались с проблемами на Windows XP после установки клиента WSUS и одобрении обновлений к Microsoft Office. На одноядерных машинах с одним и не быстрым жёстким диском можно было начинать работать на ранее, чем через 15-40 минут после включения! (15 минут на загрузку с применением всех групповых политик, ещё минут 20 – уже клиент wsus не даёт жизни).
Возникает вопрос – можно ли всё-таки жить на Windows XP или единственным решением является немедленный Upgrade до windows 7?
Рассмотрим варианты решений.
Решение 1. Отложенный запуск windows update (WUAUServ)
Решение, безусловно, очевидное. Рецепт:
-
Через GPO изменяем режим старта службы wuauserv на manual.
-
Также с помощью GPO развешиваем задание в планировщик, которое и поднимет службу wuauserv в то время, когда она не будет особо мешать пользователям (например – в обед).
Подобное решение позволяет “отложить” проблему до обеда. Таким решением можно воспользоваться и для других не жизненно важных для пользователя служб.
Решение 2. Изменение приоритета службы WUAUServ
Естественно, предыдущее решение не является панацеей. А хочется красивого решения. Посему предлагаю понизить приоритет процессу службы WUAUServ. И, как Вы понимаете, штатных средств для этого нет.
Красиво и по-русски про приоритеты и многозадачность почитать можно здесь.
Итак, приступим. Первое, что нам следует сделать – выделить службу wuauserv в отдельный процесс, так как изменить “извне” мы сможем приоритет только процесса в целом, а не его потоков. Воспользуемся комментариями разработчика для выявления (для начала) процесса, к которому относится наша служба:
H:\>tasklist /svc Имя образа PID Службы ========================= ====== ============================================= System Idle Process 0 Н/Д System 4 Н/Д smss.exe 628 Н/Д csrss.exe 696 Н/Д winlogon.exe 720 Н/Д services.exe 764 Eventlog, PlugPlay lsass.exe 776 Netlogon, PolicyAgent, ProtectedStorage, SamSs svchost.exe 936 DcomLaunch, TermService svchost.exe 1028 RpcSs svchost.exe 1140 AppMgmt, AudioSrv, BITS, CryptSvc, Dhcp, dmserver, EventSystem, helpsvc, HidServ, lanmanserver, lanmanworkstation, Netman, Nla, RasMan, Schedule, seclogon, SENS, SharedAccess, ShellHWDetection, TapiSrv, Themes, TrkWks, W32Time, winmgmt, wuauserv, WZCSVC svchost.exe 1256 Dnscache svchost.exe 1412 LmHosts, RemoteRegistry, SSDPSRV ccSetMgr.exe 1452 ccSetMgr ccEvtMgr.exe 1524 ccEvtMgr SPBBCSvc.exe 1612 SPBBCSvc spoolsv.exe 1680 Spooler svchost.exe 1852 WebClient DefWatch.exe 1984 DefWatch FwcAgent.exe 264 FwcAgent UNCFATDMS.exe 336 OTFSDMS SavRoam.exe 568 SavRoam svchost.exe 196 stisvc Rtvscan.exe 904 Symantec AntiVirus wlcrasvc.exe 1104 wlcrasvc fxssvc.exe 1300 Fax CAP3RSK.EXE 1508 Н/Д CAPRPCSK.EXE 1812 Н/Д alg.exe 2488 ALG explorer.exe 2416 Н/Д proquota.exe 2396 Н/Д ctfmon.exe 2796 Н/Д msnmsgr.exe 3032 Н/Д ipoint.exe 3520 Н/Д OUTLOOK.EXE 1992 Н/Д FwcMgmt.exe 972 Н/Д wlcomm.exe 2540 Н/Д cmd.exe 3916 Н/Д mstsc.exe 544 Н/Д dmaster.exe 3228 Н/Д regedit.exe 1124 Н/Д iexplore.exe 4088 Н/Д iexplore.exe 868 Н/Д iexplore.exe 1136 Н/Д tasklist.exe 2656 Н/Д wmiprvse.exe 1372 Н/Д
видим процесс svchost.exe, один из экземпляров которого “хостит” целую группу служб: AppMgmt, AudioSrv, BITS, CryptSvc, Dhcp, dmserver, EventSystem, helpsvc, HidServ, lanmanserver, lanmanworkstation, Netman, Nla, RasMan, Schedule, seclogon, SENS, SharedAccess, ShellHWDetection, TapiSrv, Themes, TrkWks, W32Time, winmgmt, wuauserv, WZCSVC. Если мы так всё и оставим, то не понижать приоритет мы сможем только всей группе сразу, а там и lanmanworkstation, и DHCP клиент…
Итак попробуем выделить wuauserv в отдельный процесс. Для этого, как и указано в рецепте разработчика, посмотрим на ветку реестра HKLM\Software\Microsoft\Windows NT\CurrentVersion\Svchost. Видим параметр netsvcs со следующим содержимым: AppMgmt, AudioSrv, Browser, CryptSvc, DMServer, DHCP, ERSvc, EventSystem, FastUserSwitchingCompatibility, HidServ, Ias, Iprip, Irmon, LanmanServer, LanmanWorkstation, Messenger, Netman, Nla, Ntmssvc, NWCWorkstation, Nwsapagent, Rasauto, Rasman, Remoteaccess, Schedule, Seclogon, SENS, Sharedaccess, SRService, Tapisrv, Themes, TrkWks, W32Time, WZCSVC, Wmi, WmdmPmSp, winmgmt, wscsvc, xmlprov, BITS, wuauserv, ShellHWDetection, helpsvc, WmdmPmSN, napagent, hkmsvc. Содержимое этого параметра как раз и определяет группу служб, поддерживаемых одним экземпляром svchost.exe.
Создадим новый параметр (новую группу), и перенесём туда wuauserv. Создали параметр wuauserv (многострочный), указали wuauserv, BITS. Из параметра netsvcs указанные идентификаторы служб удаляем (после проверки все эти действия оформлю скриптами, всё равно потребуется всё раскидывать на весь домен :-))
Идём далее. HKLM\SYSTEM\CurrentControlSet\Services\wuauserv. Параметр ImagePath. “%systemroot%\system32\svchost.exe -k netsvcs”. Как видно, после –k указан идентификатор группы сервисов из указанного выше ключа реестра. также меняем на “%systemroot%\system32\svchost.exe -k wuauserv”. Тоже самое делаем для сервиса BITS.
Теперь очевидные:
net stop wuauserv net stop BITS net start BITS net start wuauserv
После чего снова tasklist /svc даём нам совершенно другой результат:
H:\>tasklist /svc /fi "imagename eq svchost.exe" Имя образа PID Службы ========================= ====== ============================================= svchost.exe 936 DcomLaunch, TermService svchost.exe 1028 RpcSs svchost.exe 1140 AppMgmt, AudioSrv, CryptSvc, Dhcp, dmserver, EventSystem, helpsvc, HidServ, lanmanserver, lanmanworkstation, Netman, Nla, RasMan, Schedule, seclogon, SENS, SharedAccess, ShellHWDetection, TapiSrv, Themes, TrkWks, W32Time, winmgmt, WZCSVC svchost.exe 1256 Dnscache svchost.exe 1412 LmHosts, RemoteRegistry, SSDPSRV svchost.exe 1852 WebClient svchost.exe 196 stisvc svchost.exe 968 BITS, wuauserv
Видим процесс PID=968, который хостит исключительно интересующие нас службы, как мы и хотели.
Итак, первая часть задачи выполнена. Мы выделили службы windows update (считаем, что BITS на рабочих станциях требуется исключительно для wsus клиента, не рассматриваем вырожденные случаи с IIS на рабочих станциях программистов).
Кстати, приведённый выше рецепт может помочь при изоляции службы, вызывающей утечку ресурсов (в моём случае – дескрипторов). При условии изоляции такой службы будет достаточно перезапустить её хост-процесс, и можно жить дальше без перезагрузки машины.
Кстати, уже после написания всего вышеизложенного наткнулся на статью, в которой автор также выделяет сервис в отдельный процесс тем же способом, но с целью отладки сервиса. Вот и ещё одна статья с этим же рецептом для целей отладки. При этом приведён и ещё один способ выделения одной службы в отдельный процесс (sc config wuauserv type= own), но в нашем случае мы хотим выделить группу служб в отдельный процесс. Microsoft не особо нас балует информацией о svchost.exe. Также нашёл информацию о доступных параметрах группы сервисов здесь.
Также рекомендую ознакомиться с документацией на службы от microsoft.
Вернёмся к нашей задаче. Теперь нам необходимо найти способ изменить приоритет при старте хост-процессу службы wuauserv.
К сожалению, красивых решений “через regedit” нет. Придётся таки использовать скрипт через планировщик, который сразу после старта системы обнаружит выделенный нами процесс и изменит ему приоритет через WMI. Но об этом уже завтра…
Отзывы » (7)
RSS комментарии
Обратная ссылка
Нашёл любопытную статью http://support.microsoft.com/default.aspx?scid=kb;en-us;296930. Проверю, применима ли она к Windows XP. И попробую применить это решение для понижения приоритета описанных в статье служб.
Для отладки также воспользуюсь таким вот «расширением» диспетчера задач: http://www.sibguardian.info/….
жду продолжения
(после проверки все эти действия оформлю скриптами, всё равно потребуется всё раскидывать на весь домен
Ok. В течение недели оформлю. Честно говоря, отвлёкся от данного вопроса…
Очень познавательно, но хотелось бы увидеть продолжение.
p.s. Сами страницы (без картинок и т.д.) на сайте весят более 150 кб и не gzipуются, а также сильно грузят систему. Думаю они перегружены скриптами.
Со временем они обрастут комментариями и станут совсем неподъёмными.
Над продолжением работаю, как и обещал. На текущий момент времени ищу решение, позволяющее изменить приоритет процесса (нашей службы) сразу после запуска сценарием. Как только отработаю — опишу.
P.S> Касательно сайта — согласен с Вами, тяжеловато. Тема не из лёгких Но в ближайшее время до её переработки руки точно не дойдут. В части тяжести с комментариями — не соглашусь с Вами. Пример статьи со 128 комментариями, в процессе чтения тормозит не больше, чем любая другая страница. Всё-таки дело в самой теме, скриптами в приципе перегружена, и не везде они обоснованы с точки зрения usability.
Пришло время написать небольшой комментарий. Потребовалось для борьбы с утечками дескрипторов в «больной» службе разделить сервисы по собственным процессам. Разделить группу и собрать её обратно можно сценариями, описанными здесь.
Надеюсь, эти сценарии помогут Вам в отладке.