Pandemia COVID-19 kompletnie zmieniła organizację pracy biurowej – nagle okazało się, że w wielu sytuacjach telekonferencja z powodzeniem zastępuje podróż służbową i spotkanie na żywo. Popularność Zooma czy Microsoft Teams wystrzeliła w kosmos. Niestety, u wielu użytkowników programy te obciążają procesor w takim stopniu, że na komputerze nie da się robić niczego innego.
W niniejszym tekście pokazuję, jak za pomocą mało znanej funkcji „affinity” (koligacja, przynależność) można uwolnić część procesora na potrzeby innych programów. Nie uleczymy w ten sposób przypadłości Teamsów ani Zooma, ale przynajmniej podczas telekonferencji będziemy mogli względnie normalnie korzystać z pozostałych aplikacji.
Mini-Kurs Process Explorera
Niniejszy artykuł jest bonusowym rozdziałem Mini-Kursu Process Explorera. Mini-Kurs kosztuje jedynie 17 złotych, za tę śmiesznie niską cenę dostaniesz zestaw praktycznych porad, które pomogą m.in. w diagnozowaniu problemów wydajnościowych twojego komputera.
Ten tekst zaczyna się od teorii, która dla niektórych może być zbyt… przegadana. Jeśli chcesz szybko przeskoczyć do porady praktycznej, kliknij tutaj.
Mierzymy obciążenie procesora
Zanim przejdziemy do porad praktycznych, zastanówmy się, co to w ogóle jest „obciążenie procesora” i co to może znaczyć, że „zajęte jest 23% CPU” (część czytelników rozpoznaje ten tekst, bo najbliższe dwa ustępy to obszerne fragmenty drugiego rozdziału wspomnianego już Mini-Kursu Process Explorera).
Dawno temu, za czasów pecetów z systemem Microsoft DOS, takie pojęcie w ogóle nie było używane, bo DOS był systemem jednozadaniowym. Na komputerze działał tylko jeden program naraz i ten uruchomiony program kontrolował wszystkie zasoby. Miał procesor do wyłącznej dyspozycji, mógł korzystać z całej dostępnej pamięci oraz wszystkich urządzeń podłączonych do komputera.
Zmieniło się to, gdy na domowych komputerach zagościł system Windows. Dawał on złudzenie jednoczesnej pracy wielu programów, choć tak naprawdę w danej chwili wykonywany był kod tylko jednego programu. Komputer potrafi jednak bardzo szybko przełączać się między wykonywanymi programami, dzięki czemu możemy jednocześnie słuchać w przeglądarce muzyki z Youtube, podglądać dyskusję na Discordzie i pisać tekst w Wordzie. Nie mamy szans zorientować się, że aktywny program zmienia się tysiące razy na sekundę.
Od ćwierć wieku systemy operacyjne używane na domowych komputerach oferują tzw. wielozadaniowość z wywłaszczaniem. W tym modelu specjalny komponent systemowy – tak zwany planista, czy też scheduler – decyduje o kolejności przełączania programów oraz przydziale czasu dla każdego z nich. Nie musimy się martwić, że jakaś aplikacja zagarnie dla siebie całą moc obliczeniową, bo po ułamku sekundy jej wykonanie zostanie wstrzymane a planista przydzieli procesor kolejnej aplikacji czekającej w kolejce.
Aplikacja może jednak zorientować się, że nie ma za dużo do zrobienia. Jeśli nic nie piszemy w Wordzie, nie dotykaliśmy klawiatury ani myszki, to program ten nie robi nic innego oprócz mrugania kursorem, zapotrzebowanie na moc obliczeniową jest więc znikome. W takiej sytuacji program może dobrowolnie zwrócić sterowanie do planisty i dać znać, że nic się z nim nie wydarzy przez np. 1/10 sekundy, i na taki okres można wstrzymać jego wykonanie.
Planista na bieżąco monitoruje, ile cykli procesora idzie na rzeczywistą pracę, a ile przelatuje bezużytecznie. W ten właśnie sposób wyznaczane jest procentowe obciążenie procesora. 100% oznacza, że kolejka zadań jest pełna i nie ma żadnych luzów. Z kolei komputer, na którym nic nie robimy, będzie raportował obciążenie rzędu kilku procent – tylko tyle potrzebują usługi systemowe, których jednocześnie działa kilkadziesiąt.
Procesory wielordzeniowe, programy wielowątkowe
Teraz trochę skomplikujemy to wszystko, co powiedzieliśmy przed chwilą. Od dobrych 15 lat w powszechnym użyciu są procesory wielordzeniowe, wyposażone w kilka jednostek obliczeniowych pracujących równolegle. To na dobrą sprawę osobne procesory zamknięte w jednej obudowie. Tak naprawdę więc programy mogą działać jednocześnie, planista kontroluje ich wykonanie na każdym rdzeniu z osobna. Sposób liczenia obciążenia nie zmieni się, choć np. fraza „50% obciążenia czterordzeniowego CPU” nie powie nam, jakie jest obciążenie poszczególnych rdzeni. Wiemy jedynie, że sumarycznie w kolejce zadań są jeszcze pewne luzy.
To nie wszystko, komplikacji jest więcej. Gdy obciążenie procesora jest małe, obniży się częstotliwość taktowania zegara, procesor zacznie pracować wolniej. Nominalnie obciążenie może więc skoczyć z 10% do 20%, choć użytecznej pracy będzie tyle samo. Pamiętajmy więc, że procenty obciążenia to raczej miara klasy „mało / dużo”, niż precyzyjny pomiar pracy wykonywanej przez komputer.
Do objaśnienia pozostało jeszcze jedno słowo, które wystąpi niestety w dwóch znaczeniach – jest to „wątek”. Program jest wielowątkowy, gdy potrafi wykonywać swoje zadania na kilku rdzeniach jednocześnie. Nie będziemy wchodzić w szczegóły i tłumaczyć, czym różnią się wątki od procesów – to mniej-więcej to samo. Przykład zastosowania wielowątkowości: program grający w szachy może odpalić wiele wątków i na każdym z nich badać inny podzbiór potencjalnych ruchów. Drugi przykład: program generujący skomplikowaną animację może podzielić pracę na kilka wątków, z których każdy dostanie do wykonania część pracy.
Drugie znaczenie słowa „wątek” – czasem mówi się, że CPU jest „czterordzeniowy, ośmiowątkowy”. W tym kontekście chodzi o funkcję procesora znaną jako hyperthreading, dzięki której jeden rdzeń (core) może obsługiwać naraz dwa wątki specjalnie dostosowanych do tego programów. Rzeczywisty zysk wydajności to jednak kilkanaście, czasem dwadzieścia kilka procent. Kluczowym parametrem procesora pozostaje liczba rdzeni.
Narzędzia do telekonferencji są dobrym przykładem aplikacji wielowątkowych. Jeden wątek może dekodować przychodzący strumień audio, drugi – kodować sygnał z naszego mikrofonu, trzeci – obsługiwać funkcję udostępniania ekranu, czwarty – obsługiwać komunikację sieciową oraz monitorować jakość połączenia, i tak dalej. Niestety, gdy jeden komponent ma problemy, często niewłaściwie działają też pozostałe, w rezultacie „zamulając” cały komputer.
Processor affinity
System operacyjny może swobodnie zmieniać przypisanie wątków programu do rdzeni procesora. Program może przez chwilę wykonywać się na jednym rdzeniu, ale przy wznowieniu działania wybór może paść na ten sam lub dowolny inny rdzeń. Wybór zależy od wielu czynników – zużycia zasobów przez inne programy, balansowania obciążenia rdzeni, w niektórych liniach procesorów także wyłączania części jednostek wykonawczych w celu obniżenia zużycia energii.
Okazuje się, że użytkownik ma możliwość sterowania takim przydziałem. Opcja ta jest głęboko ukryta, bo nieumiejętne korzystanie z niej może doprowadzić do zawieszenia komputera lub utraty danych. Modyfikacje parametru „affinity” (koligacji) są jednak nietrwałe, restart komputera przywraca wartości domyślne. Jeśli eksperymenty z poniższymi poradami obniżą stabilność systemu, należy uruchomić go ponownie i zrezygnować z dalszych prób.
Uwalniamy połowę procesora
Krok pierwszy – diagnoza. Pobierz Process Explorera ze stron Microsoftu i uruchom go. W oknie programu kliknij kolumnę „CPU” głównej tabeli, by posortować programy według obciążenia procesora. Przy najbliższej telekonferencji, gdy komputer odczuwalnie zwolni, przełącz się na okno Process Explorera i sprawdź początek listy.
Jeśli aplikacja opisana jako zoom.exe
albo teams.exe
będzie zajmować więcej, niż 30% procesora, wykonaj poniższe kroki:
- Wciśnij spację, aby zatrzymać odświeżanie listy
- Kliknij prawym klawiszem na problematycznej pozycji, wybierz pozycję „Set affinity…”
- W nowym oknie zobaczysz zestaw pól wyboru, większość z nich będzie nieaktywna, pozostałe powinny być aktywne i zaznaczone
- Jeśli aktywne są co najmniej cztery pola wyboru, usuń zaznaczenie z połowy z nich (przy czterech aktywnych polach – dwa ostatnie, przy ośmiu – cztery ostatnie, itp.)
- Zatwierdź wybór klikając przycisk „OK”
- Wciśnij spację by wznowić odświeżanie listy
- Kontynuuj telekonferencję i sprawdź, czy poprawa jest odczuwalna.
Jeśli widzisz kilka różnych procesów zoom.exe/teams.exe istotnie obciążających procesor, powtórz powyższe operacje na każdym z nich. Taka zmiana sprawi, że planista nie będzie przypisywał wybranej aplikacji połowie dostępnych rdzeni – będą więc one wykorzystywane przez pozostałe aplikacje i serwisy systemowe.
Czy ta porada ci pomogła? Jeśli tak, wyślij link do artykułu swoim współpracownikom!
Uwaga – wpływ opisanych kroków na subiektywną szybkość działania komputera będzie zależał od wielu czynników. Mój Zoom zazwyczaj działa dobrze, ale gdy czasem zwariuje i zechce „zjeść” cały procesor, to za pomocą opisanej sztuczki jestem w stanie wyciągnąć Windows ze stanu „nieznośnie powolny” do „da się wytrzymać”.
Nie zawsze będziemy w stanie dokonać realnej poprawy. Jeśli twój procesor ma tylko jeden lub dwa rdzenie, to może być zwyczajnie za słaby do obsługi telekonferencji. Może też zdarzyć się, że problem leży po stronie zbyt dużego zużycia pamięci – o sposobach diagnozowania systemu opowiadam w Mini-Kursie Process Explorera.
Automatyzacja
Jeśli zawsze masz problem z telekonferencjami ale też i opisany trick zawsze działa, możesz użyć linii komend, by wystartować program z już zdefiniowanym parametrem affinity. Wywołanie będzie wyglądało np. tak:
start /affinity 1F zoom.exe
Zerknij na Stackoverflow, aby dowiedzieć się, w jaki sposób maska bitowa (i jej szesnastkowa reprezentacja) przełoży się na przydział rdzeni.
Podsumowanie
W niniejszym artykule opisałem ustawianie affinity przy użyciu Process Explorera, jednak jest to możliwe także w standardowym Menedżerze Zadań. Po jego uruchomieniu klikamy przycisk „Więcej szczegółów”, zmieniamy zakładkę na „Szczegóły”, tam sortujemy procesy, klikamy na wybranym prawym klawiszem myszy i wskazujemy opcję „Ustaw koligację”. Efekt będzie taki sam, oba narzędzia można stosować zamiennie lub wręcz równolegle.
Choć opisana sztuczka nie gwarantuje sukcesu, w praktyce powinna pomóc względnie często. Przestrzegam jednak przed próbami ręcznego zarządzania parametrem affinity większej liczby aplikacji – nie łudźmy się, że tym jednym parametrem poprawimy pracę planisty systemowego. Pożądany priorytet programów możemy podnosić i obniżać w kontekstowym menu „Set priority / Ustaw priorytet”, ale przestrzegam przed używaniem wartości spoza zakresu „poniżej / powyżej normalnego” czyli przedziału od 6 do 10. Tu pomyłka może skończyć się natychmiastową utratą danych lub zawieszeniem komputera.
Mini-Kurs Process Explorera
Niniejszy artykuł jest bonusowym rozdziałem Mini-Kursu Process Explorera. Mini-Kurs kosztuje jedynie 17 złotych, za tę śmiesznie niską cenę dostaniesz zestaw praktycznych porad, które pomogą m.in. w diagnozowaniu problemów wydajnościowych twojego komputera.
PS: wiem, że Teams to liczba mnoga, więc „Teamsy” nie mają sensu. Ojtam ojtam.
O autorze: zawodowy programista od 2003 roku, pasjonat bezpieczeństwa informatycznego. Rozwijał systemy finansowe dla NBP, tworzył i weryfikował zabezpieczenia bankowych aplikacji mobilnych, brał udział w pracach nad grą Angry Birds i wyszukiwarką internetową Microsoft Bing.
4 odpowiedzi na “CPU affinity czyli lekarstwo na zamulanie Zooma i Teamsów”
„Opcja ta jest głęboko ukryta, bo nieumiejętne korzystanie z niej może doprowadzić do zawieszenia komputera lub utraty danych.”
Pierwsze słyszę żeby coś takiego się mogło stać, trzeba by chyba na złość poustawiać affinity wszystkich procesów na 1 rdzeń i jeszcze dociążyć go czymś to wtedy może mocno zmulić, no ale nie zawiesić.
„Modyfikacje parametru „affinity” (koligacji) są jednak nietrwałe, restart komputera przywraca wartości domyślne.”
Nie komputera a aplikacji, affinity jest pamiętane na czas działania procesu.
Nic dziwnego że Teams zamula, jak te programy są oparte na Electron, czyli tak naprawdę to przeglądarki które wyświetlają tylko jedną stronę internetową.
Akurat programy do komunikacji, czyli takie które mają pracować w tle, np Discord, upodobały sobie tę drogę na skróty.
Może warto też rozważyć program do priorytetów https://www.prnwatch.com/prio/
Przydała by się informacja o paramerze (?) opisanym jako 'pokaż czas jądra’. Dopiero gdy wykres tego paramertu jedt na 100% to komputer freezuje.