Статья размещена автором Бетке Сергей Сергеевич

Изменение приоритета процесса службы (или как жить на 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 в то время, когда она не будет особо мешать пользователям (например – в обед).

Изменение приоритета процесса службы (или как жить на Windows XP с WSUS)Изменение приоритета процесса службы (или как жить на Windows XP с WSUS)Изменение приоритета процесса службы (или как жить на Windows XP с WSUS) 

Подобное решение позволяет “отложить” проблему до обеда. Таким решением можно воспользоваться и для других не жизненно важных для пользователя служб.

Решение 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)

  1. Нашёл любопытную статью http://support.microsoft.com/default.aspx?scid=kb;en-us;296930. Проверю, применима ли она к Windows XP. И попробую применить это решение для понижения приоритета описанных в статье служб.

  2. Для отладки также воспользуюсь таким вот «расширением» диспетчера задач: http://www.sibguardian.info/….

  3. dront:

    жду продолжения
    (после проверки все эти действия оформлю скриптами, всё равно потребуется всё раскидывать на весь домен

  4. olDjeka:

    Очень познавательно, но хотелось бы увидеть продолжение.

    p.s. Сами страницы (без картинок и т.д.) на сайте весят более 150 кб и не gzipуются, а также сильно грузят систему. Думаю они перегружены скриптами.
    Со временем они обрастут комментариями и станут совсем неподъёмными.

    • Над продолжением работаю, как и обещал. На текущий момент времени ищу решение, позволяющее изменить приоритет процесса (нашей службы) сразу после запуска сценарием. Как только отработаю — опишу.
      P.S> Касательно сайта — согласен с Вами, тяжеловато. Тема не из лёгких Но в ближайшее время до её переработки руки точно не дойдут. В части тяжести с комментариями — не соглашусь с Вами. Пример статьи со 128 комментариями, в процессе чтения тормозит не больше, чем любая другая страница. Всё-таки дело в самой теме, скриптами в приципе перегружена, и не везде они обоснованы с точки зрения usability.

  5. Пришло время написать небольшой комментарий. Потребовалось для борьбы с утечками дескрипторов в «больной» службе разделить сервисы по собственным процессам. Разделить группу и собрать её обратно можно сценариями, описанными здесь.
    Надеюсь, эти сценарии помогут Вам в отладке.

Опубликовать комментарий

XHTML: Вы можете использовать следующие HTML теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Tags Связь с комментариями статьи:
RSS комментарии
Обратная ссылка