Co tak naprawdę ogranicza liczbę jednoczesnych zadań Home Assistant, zanim lokalne sterowanie zacznie działać gorzej?

Eva Wong jest Technicznym pisarzem i stałym majsterkowiczem w ZimaSpace. Całe życie geek z pasją do homelabów i oprogramowania open-source, specjalizuje się w tłumaczeniu skomplikowanych koncepcji technicznych na przystępne, praktyczne przewodniki. Eva wierzy, że samodzielne hostowanie powinno być zabawą, a nie czymś onieśmielającym. Poprzez swoje samouczki umożliwia społeczności rozwiewanie tajemnic konfiguracji sprzętu, od budowy pierwszego NAS po opanowanie kontenerów Docker.

Home Assistant nie ma jednej konkretnej odpowiedzi na pytanie „ile równoczesnych zadań może obsłużyć?”. Dziesięć krótkich zadań asynchronicznych może być mniej obciążających niż jedna integracja blokująca pętlę zdarzeń, a pięćdziesiąt zautomatyzowanych działań oczekujących w kolejce może pozostać nieszkodliwych, jeśli większość czasu spędzają na oczekiwaniu na niezależne operacje wejścia-wyjścia.

Praktyczny limit pojawia się wtedy, gdy dodatkowa praca powoduje powtarzalne opóźnienia w istotnej ścieżce sterowania: zdarzenie czeka dłużej na przetworzenie, kolejka automatyzacji rośnie, wywołanie usługi nie mieści się w wyznaczonym czasie albo współdzielony zasób procesora, pamięci, pamięci masowej lub sieci zaczyna być przeciążony. Współbieżność jest więc przede wszystkim problemem opóźnień i kolejek, a dopiero potem liczbą zadań.

Współbieżność Home Assistant zaczyna się od pętli zdarzeń asyncio

Home Assistant Core jest oparty na Python asyncio. Komponenty planują pracę jako zadania, a współpracujący kod asynchroniczny zwalnia wykonanie podczas oczekiwania na operacje wejścia-wyjścia, dzięki czemu inne zadania mogą robić postępy, zamiast przypisywać każdej integracji osobny wątek systemu operacyjnego.

Aktualna dokumentacja dla deweloperów Home Assistant wyjaśnia, że Core planuje zadania komponentów za pośrednictwem centralnej pętli zdarzeń i wymaga, aby zadania prawidłowo się zawieszały podczas oczekiwania. Dlatego „równoczesne” nie oznacza, że każde zadanie w tej samej chwili wykonuje instrukcje procesora.

Praktyczna analiza współbieżności wprowadza to samo rozróżnienie: zadania asynchroniczne mogą nakładać się w czasie, podczas gdy rzeczywiste wykonywanie w pętli zdarzeń pozostaje szeregowe między punktami await. Wydajność zależy od tego, jak długo każde zadanie zajmuje pętlę oraz na co czeka.

Blokujące operacje mogą jednocześnie pogorszyć działanie wielu zadań

Najpoważniejszą awarią współbieżności często nie jest „zbyt wiele automatyzacji”. Zwykle problemem jest jedna operacja, która blokuje pętlę zdarzeń na tyle długo, że niezależne aktualizacje stanów i wywołania zwrotne nie mogą się wykonać.

Home Assistant wyraźnie ostrzega, że blokujące operacje w pętli zdarzeń zatrzymują cały system na czas trwania wywołania. Dotyczy to między innymi niewłaściwie obsłużonych operacji wejścia-wyjścia na plikach, bibliotek sieciowych, funkcji uśpienia oraz ciężkich operacji synchronicznych wykonywanych wewnątrz integracji.

Zmienia to sposób interpretacji testu wydajności. Jeśli opóźnienie lokalnego sterowania rośnie przy aktywnej jednej konkretnej integracji, mimo że ogólne użycie procesora pozostaje niskie, problemem nadal może być blokowanie pętli zdarzeń, a nie niewystarczająca moc obliczeniowa.

Tryb automatyzacji określa, jak powtarzające się wyzwolenia stają się zadaniami

Automatyzacje dodają kolejną warstwę zasad współbieżności. Reguła może odrzucić drugie wyzwolenie, uruchomić bieżące wykonanie od początku, umieścić pracę w kolejce albo utworzyć równoległe wykonania. Te wybory wpływają zarówno na poprawność działania, jak i zapotrzebowanie na zasoby.

Aktualna dokumentacja trybów automatyzacji Home Assistant definiuje tryby single, restart, queued i parallel, z możliwością skonfigurowania maksymalnej liczby wykonań oczekujących w kolejce lub równoległych. Domyślna maksymalna liczba dla trybów kolejkowania i równoległego wynosi 10, ale ta wartość konfiguracyjna nie jest uniwersalnym wskaźnikiem wydajności platformy.

Automatyzacja czujnika drzwi, która czeka dwie sekundy przed wysłaniem powiadomienia, oraz automatyzacja oświetlenia wykonująca pięć wywołań sieciowych nie są równoważnymi zadaniami. Tryb automatyzacji należy ustawić najpierw na podstawie kolejności i poprawności działania, a następnie sprawdzić, czy wynikająca z niego kolejka lub nakładanie się wykonań wpływa na opóźnienie sterowania.

-15% OFF

Mierz wzrost kolejek i opóźnienia skrajne, a nie tylko procent użycia procesora

Jako sondy opóźnienia użyj jednej krytycznej lokalnej automatyzacji. Rejestruj nadejście wyzwolenia, rozpoczęcie automatyzacji, wywołanie usługi oraz reakcję fizycznego urządzenia, zwiększając za każdym razem tylko jedną zmienną współbieżności: powtarzające się wyzwolenia, klientów panelu, integracje działające w tle albo sąsiednie usługi.

Artykuł ZimaSpace o pracy sterowanej zdarzeniami i obciążeniu bezczynnego serwera przedstawia właściwy punkt odniesienia: systemy sterowane zdarzeniami są wydajne, gdy praca uruchamia się tylko wtedy, gdy jest potrzebna, ale nagłe skoki obciążenia nadal wymagają odpowiedniego zapasu mocy obliczeniowej i zasobów, aby kolejki mogły się opróżnić bez trwałego narastania.

Obserwuj medianę opóźnień oraz najwolniejsze zwykłe wykonania. System może średnio wykorzystywać 10% procesora, a mimo to podczas krótkich skoków obciążenia generować jednokundowe przestoje. Praktyczna granica wydajności pojawia się wtedy, gdy kolejki stale rosną, ostrzeżenia o osiągnięciu maksymalnej liczby wykonań pojawiają się wielokrotnie albo opóźnienia skrajne nie wracają do poziomu bazowego po zakończeniu skoku obciążenia.

Oddziel współbieżność Home Assistant od rywalizacji o zasoby hosta

Home Assistant może prawidłowo planować zadania, podczas gdy inny kontener przeciąża procesor, pamięć, pamięć masową lub sieć. W takim przypadku zwiększenie lub zmniejszenie wartości max automatyzacji może nie zmienić problemu, ponieważ współdzielony host utracił już zapas zasobów.

Powtórz test współbieżności po wstrzymaniu sąsiedniego obciążenia. Jeśli czas działania pętli zdarzeń i opóźnienie lokalnego sterowania natychmiast się poprawią, potraktuj limit jako problem wydajności współdzielonego hosta. Jeśli nie, sprawdź blokujące operacje, działanie integracji albo projekt kolejek automatyzacji wewnątrz Home Assistant.

Użyj warunku zakończenia zamiast publikować liczbę zadań

Zaobserwowany sygnał Co oznacza Następny test
Równoległe lub oczekujące wykonania osiągają skonfigurowany limit Limit kolejki na poziomie automatyzacji Sprawdź tryb, kolejność i częstotliwość wyzwoleń
Ostrzeżenie dotyczące pętli zdarzeń lub rozległe spowolnienie interfejsu i sterowania Możliwe blokujące operacje Znajdź integrację lub wywołanie synchroniczne
Opóźnienie rośnie tylko przy aktywnej innej usłudze Rywalizacja o zasoby współdzielonego hosta Zmierz obciążenie procesora, pamięci, wejścia-wyjścia i sieci
Jedna ścieżka urządzenia działa wolno, a pozostałe pozostają szybkie Limit zależny od konkretnej zależności Sprawdź tę integrację i ścieżkę sieciową
Kolejki opróżniają się, a opóźnienia skrajne pozostają w docelowym zakresie Pozostaje użyteczny zapas współbieżności Zakończ zwiększanie obciążenia przy zaplanowanym maksimum

Wydajność Home Assistant należy więc określać jako przetestowane obciążenie z docelowym opóźnieniem, a nie uniwersalną liczbę równoczesnych zadań. Właściwe pytanie brzmi: ile nakładającej się pracy obecny zestaw integracji i host mogą obsłużyć, zanim krytyczna ścieżka lokalnego sterowania przestanie mieścić się w wyznaczonym czasie.

Centrum Technologii i Sztucznej Inteligencji

Więcej do przeczytania

Get More Builds Like This

Stay in the Loop

Get updates from Zima - new products, exclusive deals, and real builds from the community.

Stay in the Loop preferences

We respect your inbox. Unsubscribe anytime.