Jak ograniczyć użycie procesora i pamięci RAM przez proces za pomocą Cgroups w systemie Ubuntu

W Ubuntu najbezpieczniejszym, ogólnym sposobem ograniczenia obciążenia za pomocą cgroups jest umożliwienie systemd utworzenia i zarządzania grupą kontrolną. Użyj systemd-runjej do polecenia, które aktualnie uruchamiasz, lub skonfiguruj usługę systemd, gdy limit musi przetrwać restarty. Ustaw CPUQuota=sztywny limit czasu procesora i wybierz pomiędzy MemoryHigh=obciążeniem a MemoryMax=sztywnym limitem pamięci. Limity te dotyczą jednostki i jej procesów potomnych.

Grupa cgroup (grupa kontrolna) to mechanizm jądra Linuksa, który organizuje procesy, aby system mógł rejestrować i kontrolować wykorzystanie zasobów. Systemd w Ubuntu umieszcza usługi w grupach cgroup, więc większość użytkowników nie musi ręcznie tworzyć katalogów /sys/fs/cgroup. Poniższe przykłady wykorzystują interfejs kontroli zasobów systemd i należy je porównać z wersją systemd zainstalowaną w systemie Ubuntu.

Makieta terminala w stylu Ubuntu sprawdzająca wersję systemd i typ montowania cgroup2fs przed ustawieniem limitów zasobów
Ilustracyjny model terminala do sprawdzania systemu systemd i montowania cgroup v2. Wyświetlana wersja i dane wyjściowe są przykładami, a nie wynikami testu.

Wybierz kontrolę odpowiadającą problemowi

MetodaCo kontrolujeNajlepiej pasujeGłówny kompromis
systemd-runzakres przejściowyLimity procesora i pamięci dla nowo uruchomionego polecenia i jego potomkówKompilacja, skrypt, import lub jednorazowe zadanie wsadoweZakres ma charakter tymczasowy i kończy się wraz z obciążeniem pracą; nie jest on powiązany z żadnym procesem, który już działa.
ustawienia usługi systemdZasoby dla grupy cgroup usługi, w tym procesy podrzędneDemon lub aplikacja, która powinna zachować te same limity po ponownym uruchomieniuWymaga konfiguracji usługi i zazwyczaj ponownego uruchomienia w celu zastosowania nowych ustawień.
Bezpośrednie pliki cgroup v2Kontrolery na poziomie jądra, takie jak cpu.maximemory.maxŚrodowiska wykonawcze kontenerów, delegowani menedżerowie cgroup lub specjalistyczna administracjaWięcej instrukcji; systemd zarządza dużą częścią hierarchii Ubuntu, a zapisywanie do jego zarządzanego drzewa może powodować konflikty z systemd lub kończyć się niepowodzeniem z powodu uprawnień i delegowania.
niceLubCPUWeight=Względny priorytet procesora w przypadku rywalizacji grupUtrzymanie niższego priorytetu pracy w tle przy jednoczesnym wykorzystaniu bezczynnego procesoraNie jest to sztywny limit procesora i nie ogranicza pamięci.

W przypadku większości interaktywnych maszyn Ubuntu, zakres przejściowy jest najszybszym odwracalnym rozwiązaniem. W przypadku usługi produkcyjnej należy użyć jednostki usługi, aby polityka była dokumentowana i przywracana podczas rozruchu. Używaj plików bezpośrednich cgroup tylko wtedy, gdy celowo zarządzasz delegowaną hierarchią lub budujesz przepływ pracy kontenera/środowiska wykonawczego.

Sprawdź system Ubuntu przed ustawieniem limitów

Najpierw sprawdź, czy systemd jest dostępny i czy system plików cgroup jest zunifikowany w wersji 2:

systemctl --version
stat -fc %T /sys/fs/cgroup

Wynik cgroup2fsdrugiego polecenia wskazuje na zunifikowany system plików cgroup v2. Wersje Ubuntu i systemy niestandardowe mogą się różnić, dlatego nie należy zakładać, że każdy komputer ma tę samą hierarchię lub funkcje systemd. Można również sprawdzić bieżącą wersję systemd za pomocą pierwszego polecenia. Jeśli montowanie cgroup jest inne niż v2, niektóre właściwości zasobów lub zachowanie kontrolera mogą się różnić; przed skopiowaniem konfiguracji należy zapoznać się z podręcznikiem Ubuntu dla zainstalowanej wersji.

Wybierz wartości po zmierzeniu obciążenia. Zostaw miejsce na resztę systemu i pamiętaj, że limity ustawione dla usługi użytkownika są również ograniczone przez wszelkie limity na jej nadrzędnym segmencie. Podrzędna grupa cgroup nie może otrzymać więcej zasobów, niż pozwala jej przodek.

Ogranicz polecenie, które chcesz uruchomić

Aby uruchomić polecenie w sesji użytkownika, uruchom je w zakresie przejściowym za pomocą systemd-run --user --scope. Na przykład:

Makieta terminala w stylu Ubuntu uruchamiająca pracownika Pythona z 50-procentowym limitem procesora i progami pamięci 700 MB i 900 MB
Ilustratywny przykład terminala jednorazowego polecenia systemd-run z limitem procesora, progiem wykorzystania pamięci i sztywnym limitem pamięci.
systemd-run --user --scope --unit=worker-capped \
  -p CPUQuota=50% \
  -p MemoryHigh=700M \
  -p MemoryMax=900M \
  -- python3 /opt/worker.py

Zastąp polecenie Pythona programem, który faktycznie chcesz uruchomić. Ten przykład nadaje cgroup maksymalną przepustowość procesora równą połowie jednego procesora, rozpoczyna obsługę obciążenia pamięci na poziomie około 700 MiB i ustawia maksymalną wartość pamięci stałej na 900 MiB. Wartości pamięci są oparte 100%na jednostkach bazowych systemd 1024. Kwota reprezentuje czas pracy jednego procesora; 200%może wykorzystać czas pracy dwóch procesorów, jeśli jest dostępny. Nie oznacza to procentowego udziału wszystkich rdzeni w komputerze.

Polecenie działa na pierwszym planie, ponieważ jest to zakres. Po jego zakończeniu jednostka przejściowa znika. Usuń --usertylko wtedy, gdy zamierzasz używać menedżera systemu i masz wymagane uprawnienia; w przypadku jednostki przejściowej obejmującej cały system, uruchom polecenie z parametrem sudoi użyj odpowiednich opcji polecenia. Ustawienia zasobów mogą zostać odrzucone, jeśli menedżer lub kontroler grupy cgroup ich nie obsługuje.

Ustaw limity dla trwałej usługi systemd

W przypadku usługi takiej jak worker.service, utwórz drop-in zamiast edytować plik jednostki dostawcy. Uruchom sudo systemctl edit worker.servicei dodaj:

Makieta konfiguracji usługi systemd zawierająca ustawienia CPUQuota, MemoryHigh i MemoryMax
Przykładowa konfiguracja usługi systemd z trwałymi kontrolami procesora i pamięci. Użyj prawdziwej nazwy usługi i wartości odpowiednich do Twojego obciążenia.
[Service]
CPUQuota=50%
MemoryHigh=700M
MemoryMax=900M

Zapisz zmiany, a następnie ponownie załaduj definicje jednostek systemd i uruchom ponownie usługę, aby proces rozpoczął się zgodnie ze zmienioną polityką:

sudo systemctl daemon-reload
sudo systemctl restart worker.service

Należy ostrożnie określić limit pamięci. Jeśli usługa nie jest w stanie odzyskać wystarczającej ilości pamięci poniżej limitu MemoryMax, jądro może wywołać komendę „out-of-memory killer” w obrębie tej grupy cgroup. Może to zakończyć jeden lub więcej procesów w grupie usług i przerwać pracę. Bezpieczniejszym rozwiązaniem jest często ustawienie MemoryHighlimitu na poziomie, na którym odzyskiwanie i ograniczanie przepustowości są akceptowalne, a następnie ustawienie MemoryMaxwyższej granicy jako ostatecznej. Przed wdrożeniem ścisłych limitów należy przeprowadzić testy przy realistycznych obciążeniach szczytowych.

Sprawdź jednostkę i obserwuj jej zachowanie

W przypadku zakresu przejściowego sprawdź jego status, korzystając z podanej nazwy jednostki:

Makieta terminala pokazująca status systemctl i systemd-cgtop monitorujący przejściowy zakres obciążenia
Ilustracyjny widok statusu i monitora cgroup. Przykładowe dane dotyczące procesora i pamięci pokazane tutaj nie pochodzą z rzeczywistych pomiarów.
systemctl --user status worker-capped.scope
systemd-cgtop

W przypadku usługi systemowej należy pominąć ten parametr --userw poleceniu status. Widok statusu potwierdza istnienie i aktywność jednostki; systemd-cgtoppokazuje bieżące wykorzystanie zasobów przez grupę kontrolną. Aby sprawdzić skonfigurowane właściwości, należy bezpośrednio wysłać zapytanie do jednostki, na przykład:

systemctl --user show worker-capped.scope \
  -p CPUQuotaPerSecUSec -p MemoryHigh -p MemoryMax

Pamięć raportowana dla grupy cgroup niekoniecznie jest taka sama, jak wartość pamięci rezydentnej jednego procesu: uwzględnia ona pamięć obciążającą grupę i może obejmować potomków obciążenia. Monitorowanie należy traktować jako dowód zachowania się obciążenia w czasie, a nie jako pojedynczą wartość do optymalizacji na ślepo.

A co jeśli proces już działa?

systemd-runUruchamia nowe polecenie w nowej jednostce; nie pobiera dowolnego istniejącego PID i nie przenosi go do tego zakresu. Jeśli proces należy do usługi systemd, zastosuj ustawienia do tej usługi za pomocą polecenia drop-in lub, w przypadku tymczasowej zmiany, użyj polecenia sudo systemctl set-property --runtime worker.service CPUQuota=50% MemoryHigh=700M MemoryMax=900M. Ten --runtimeformularz jest tymczasowy i nie zastępuje trwałej konfiguracji usługi.

Jeśli proces jest zwykłym programem w sesji pulpitu, bezpieczną i prostą metodą jest zazwyczaj jego zatrzymanie i ponowne uruchomienie w [brakuje kontekstu] systemd-run. Zastosowanie właściwości do szerszego wycinka, takiego jak cały wycinek użytkownika, może mieć wpływ na wiele niepowiązanych aplikacji. Przeniesienie procesu poprzez zapisanie jego identyfikatora PID do pliku cgroup wymaga kontroli nad odpowiednią delegowaną hierarchią i musi być zgodne z zasadami rozmieszczania procesów cgroup v2; nie zapisuj do katalogów zarządzanych przez systemd na zasadzie zgadywania.

Jak wybrać politykę procesora i pamięci

  • Potrzebujesz sztywnego limitu procesora? Wybierz CPUQuota=. Niższe wartości zmniejszają szczytowe zużycie procesora, ale mogą spowolnić ukończenie zadania i wydłużyć czas oczekiwania w kolejce.
  • Potrzebujesz tylko niższego priorytetu? Rozważ CPUWeight=raczej limit. Waga współdzieli zasoby procesora w stosunkowo niewielkim stopniu; nie rezerwuje stałego procentu ani nie zapobiega wykorzystaniu bezczynnego procesora.
  • Potrzebujesz obciążenia pamięci bez natychmiastowego, twardego zatrzymania? Ustaw MemoryHigh=główny próg obciążenia i obserwuj opóźnienie oraz zachowanie odzyskiwania.
  • Potrzebujesz ostatecznej granicy ograniczającej? Dodaj ją MemoryMax=z zapasem na normalne szczyty. Przygotuj się na brak koncentracji (OOM), gdy granica nie będzie mogła zostać zachowana.
  • Już korzystasz z kontenera? Wolisz flagi procesora i pamięci obsługiwane przez menedżera kontenerów, które konfigurują grupy cgroups dla danego kontenera i dopasowują się do jego cyklu życia.

Nie ma jednego idealnego limitu dla każdego obciążenia. Zadanie wsadowe na komputerze stacjonarnym może tolerować niski limit i umiarkowany limit pamięci; usługa wrażliwa na opóźnienia może wymagać większej rezerwy mocy obliczeniowej procesora i wyższej, MemoryHighaby uniknąć przerw związanych z odzyskiwaniem. Zacznij ostrożnie, monitoruj jednostkę w reprezentatywnym okresie szczytowym i dostosowuj ustawienia po kolei.

Odniesienia

Zostaw komentarz

Jak bezpiecznie odzyskać utracone partycje i dane z dysku twardego

Jak bezpiecznie odzyskać utracone partycje i dane z dysku twardego

Dowiedz się, jak odzyskać utracone partycje i pliki za pomocą TestDisk i PhotoRec. Zabezpiecz dysk źródłowy, przeskanuj go bezpiecznie i zapisz odzyskane dane na innym dysku.

Jak skanować kody QR na komputerze stacjonarnym z systemem Linux

Jak skanować kody QR na komputerze stacjonarnym z systemem Linux

Skanuj kody QR w systemie Linux za pomocą CoBang, używając kamery internetowej lub pliku obrazu. Zobacz opcje instalacji, kroki konfiguracji i poprawki dotyczące dostępu do kamery Flatpak.

Jak zmienić ustawienia kamery internetowej w systemie Linux za pomocą Cameractrls

Jak zmienić ustawienia kamery internetowej w systemie Linux za pomocą Cameractrls

Zmień ustawienia kamery internetowej w systemie Linux za pomocą narzędzia Cameractrls: dostosuj ekspozycję, kolor, redukcję migotania i inne obsługiwane elementy sterujące, a następnie sprawdź zgodne tryby wideo.

Jak zainstalować PhpStorm na Linuksie: Toolbox, Tar.gz, Snap i AUR

Jak zainstalować PhpStorm na Linuksie: Toolbox, Tar.gz, Snap i AUR

Zainstaluj PhpStorm na Linuksie za pomocą JetBrains Toolbox lub samodzielnego archiwum tar.gz, a także opcji Snap i Arch AUR. Java jest już dołączona.

Jak wyciąć obraz w systemie Linux za pomocą programu GIMP

Jak wyciąć obraz w systemie Linux za pomocą programu GIMP

Usuń tło zdjęcia w systemie Linux za pomocą programu GIMP: narysuj obiekt, usuń wybrane tło, zachowaj przezroczystość i wyeksportuj plik PNG, który można ponownie wykorzystać.

Jak wykonać kopię zapasową płyty CD-ROM w postaci obrazu ISO w systemie Linux

Jak wykonać kopię zapasową płyty CD-ROM w postaci obrazu ISO w systemie Linux

Utwórz obraz ISO płyty CD-ROM w systemie Linux za pomocą GNOME Disks lub dd. Zidentyfikuj napęd optyczny, monitoruj kopiowanie, zweryfikuj obraz i dowiedz się, kiedy uszkodzona płyta lub płyta audio wymaga użycia innego narzędzia.

Jak skonfigurować dwa panele w środowisku XFCE 4

Jak skonfigurować dwa panele w środowisku XFCE 4

Utwórz oddzielny panel XFCE 4 dla każdego wyświetlacza, przypisz drugi panel do odpowiedniego wyjścia, określ jego położenie i rozmiar, a następnie dodaj potrzebne elementy uruchamiające i statusu.

Jak zainstalować Cisco Packet Tracer w systemie Linux

Jak zainstalować Cisco Packet Tracer w systemie Linux

Pobierz Cisco Packet Tracer 9.0.1 dla systemu Ubuntu 64-bit, zainstaluj pakiet DEB za pomocą APT, zaakceptuj licencję w terminalu i zaloguj się, aby rozpocząć laboratorium.

Pobierz FlightGear za darmo: Oficjalny przewodnik instalacji

Pobierz FlightGear za darmo: Oficjalny przewodnik instalacji

Pobierz FlightGear za darmo z oficjalnej strony. Porównaj pakiety dla systemów Windows, macOS i Linux, zainstaluj pliki danych i rozpocznij swój pierwszy lot.

OKSampler: darmowy, prosty sampler muzyczny do rytmów klawiszowych

OKSampler: darmowy, prosty sampler muzyczny do rytmów klawiszowych

OKSampler mapuje klipy MP3 na klawisze klawiatury i umożliwia zapętlanie dźwięku. Dowiedz się, co robi ten starszy, darmowy program, gdzie kończą się jego stare funkcje i co sprawdzić przed pobraniem.