Skip to Content

IT nieuczesane.

Izolacja procesów systemowych

Disclaimer: opisywane czynności nie są informacjami stricté technicznymi! jest to opis dokonany po własnoręcznych doświadczeniach „zabawy” z systemem. nieumiejętne korzystanie z edytora rejestru może spowodować, że uszkodzisz swój system!

Services

Kiedy zajrzy się do listy procesów systemowych okaże się, że usługi systemowe w w2k+ nie są uruchamiane jako oddzielne procesy. W zamian można zobaczyć, że działa kilka procesów o nazwie svchost. Osobom, które tego jeszcze nie zrobiły, polecam ściągnąć niezastąpione narzędzie, jakim jest Process Explorer. Można co prawda posłużyć się poleceniem 'tasklist /svc', aby uzyskać informacje o tym, który svchost przetrzymuje którą usługę… tylko po co?
Oto widok usług, obsługiwanych przez najbardziej przeciążonego svchosta – netsvcs:

svchost.jpg
Jak widać jest ich całkiem sporo. Kilkukrotnie szukałem dobrego wyjaśnienia, czemu procesy rozłożone są tak a nie inaczej, czy na prawdę wpływa to na wydajność lub chroni zasoby – i nie udało mi się póki co odpowiedzi na to pytanie znaleść. Generalnie svchost jest głównym procesem, uruchmiającym usługi w postaci DLL, co można porównać do programu master i pluginów. Tylko czemu są one rozłożone tak a nie inaczej?

Po co izolować?

Windows jaki jest, każdy widzi. Są osoby, które mając problem z windą – reinstalują ją. To najgorszy z możliwych sposobów, bo problemy są jak bumerangi. Nie dywagując nad sensownością tego rodzaju rozwiązywania problemu – jak pokazuje google svchost potrafi zdenerwować (ja miałem ponad 75o.ooo wyników), i często odpowiedzią jest – „trzeba najpierw sprawdzić, który konkretnie serwis jest przyczyną”.
W moim przypadku, do izolacji procesów pchnął mnie problem z zawieszającym się modemem GPRS. Po zawieszeniu się modemu, zwisały również procesy TapiSrv oraz RasMan. Oba te procesy znajdują się w obrębie przedstawionego powyżej svchosta, więc skillowanie czy restart wiązały się w restartem maszyny. O ile wyizolowanie nie rozwiązało ostatecznie mojej sytuacji [nawet po restarcie procesów nie mogłem się połączyć], o tyle bez restartu mogłem przywrócić serwisy do działania… nie wspominając o zabawie, jaką jest zawsze grzebanie w rejestrze i adrenalinka „rozleci sie ta winda, czy sie nie rozleci?” (;.

Izolacja – jak

Jeśli z jakiegoś powodu chciałbyś, drogi czytelniku, wyizolować którąś z usług systemowych, zapoznaj się najpierw z tym artem ze strony Microsoftu. Wyjaśni on kilka podstawowych kwestii dotyczących bohatera niniejszego textu, i ujawni dwie bardzo ważne informacje, które są clue do izolacji procesu systemowego do oddzielnego mastera. Informacje te, to dwa klucze rejestru, które pokazują gdzie będzie należało dokonać zmian:

A zmian należy dokonać w obu kluczach. Ale zanim się do tego przystąpi, proponuję oba wymienione klucze zbackupować – wystarczy je wyexportować do rega za pomocą regedita.

Po pierwsze trzeba stworzyć nowego svchosta, modyfikując pierwszy klucz:

Oczywistym jest, że jest to informacja jak są poprzydzielane procesy, i że niemal wszystkie usługi sieciowe zostały pchnięte do jednego procesu master, o nazwie netsvcs. Dodajmy swój własny klucz:

Następnie wszystkie 4 wartości wymienone w nowym kluczu, należy usunąć z netsvcs.

Należy się tu chwilka wyjaśnienia – czemu akurat cztery procesy a nie jeden? Otóż jak się okazło, niektóre procesy będące w obszarze innego mastera, nie potrafiły się wzajemnie komunikować [nie wiem jak bardzo to stwierdzenie odzwierciedla rzeczywisty mechanizm, ale fakt jest iż] – jeśli wyizolowało się tylko serwis TapiSrv (telephony), to Netman, który jest odpowiedzialny m.in. za wyświetlanie dostępnych połączeń seciowych (lamersko – ikonek w „network connections”), nie wyświetlał połączeń modemowych. Trzeba zatem zatem urzyć intuicji co do powiązania między procesami, lub poszukać jakiegoś stricté technicznego dokumentu opisującego te zależności. Osobiście wątpie, aby takowy istniał [jeśli znajdziesz – sprawisz mi olbrzymią radość, podsyłając linka! (:]. Z tego też powodu, niestety, nigdy nie będzie się miało pewności, czy dokonanie izolacji nie wpłynie w jakimś stopniu na funkcjonalność systemu.

Następnie trzeba dodać gałąź o nazwie stworzonego klucza, i wpisać tam dwa klucze, dokładnie tak, jak jest to w netsvc:

… tak na prawde bardziej poprawnym, byłoby stwierdzenie „wydaje mi się, iż trzeba”. Klucz o wartości 1 (ten co-cośtam) definiuje, iż ma być brany pod uwagę ten pierwszy (auth-cośtam). Ten z kolei, jest maskowym zapisem uprawnień, jakie mają procesy z niego korzystające. Szczegółów można szukać w SDK, w kodzie bibliotek. Myślę, że nawet developerzy korzystają z API, żeby niewiedzieć takich szczegółów – i ja także nie dociekałem. Czynność wykonałem „na intuicję”.

To, co pozostało do zrobienia, to zdefiniowanie w odpowiednich kluczach, odpowiedzialnych za wymienione 4 procesy, iż powinny uruchamiać się w oddzielnym svchoście. W każdej z gałęzi:

znajduje się klucz o wartości:

Nie cięzko się domyśleć, iż „netsvcs” należy zmienić na własną wartość – w opisywanym przypadku – „telephony”.

Teraz już tylko restart systemu – i voilá
svchost2.jpg

Refs