Ograniczanie użycia procesora i pamięci przez polecenia za pomocą grup dyskusyjnych Ubuntu

Jeśli jedno polecenie spowalnia pulpit Ubuntu lub powoduje, że serwerowi brakuje pamięci, umieść je wraz z procesami potomnymi w zarządzanej przez systemd grupie cgroup z limitem procesora i pamięci. W obecnych wersjach Ubuntu systemd-run --scopejest to najkrótsze praktyczne rozwiązanie: polecenie jest uruchamiane w zakresie tymczasowym, a systemd stosuje limity za pośrednictwem kontrolek grupy cgroup.

Poniższy przykład ogranicza obciążenie do połowy wydajności jednego procesora i 1 GB pamięci. Są to limity dla całego zakresu, w tym procesów potomnych; nie stanowią one gwarancji, że program będzie działał z określoną szybkością.

Dlaczego proces potrzebuje limitu cgroup

Proces o dużym obciążeniu pamięci może konkurować z aplikacjami interaktywnymi, podczas gdy proces o dużym zapotrzebowaniu na pamięć może zmusić maszynę do odzyskiwania lub do stanu braku pamięci. Grupa cgroup grupuje proces z jego potomkami, dzięki czemu jądro może uwzględnić i ograniczyć tę grupę. Systemd w Ubuntu zapewnia wygodny interfejs do tych funkcji.

Ustawienia procesora i pamięci działają inaczej. CPUQuota=50%Limituje czas procesora do połowy wydajności jednego procesora, uśredniając go w okresie planowania. Wartość 200%reprezentuje czas maksymalnie dwóch procesorów, gdy jest dostępny. Jest to pułap, a nie priorytet procesora ani rezerwacja. MemoryMax=1GUstawia sztywny limit pamięci obciążającej grupę cgroup; jeśli obciążenie nie może utrzymać się poniżej tego limitu, jądro może odzyskać pamięć lub wywołać zamknięcie procesu z powodu braku pamięci w tej grupie cgroup. Wybierz limit z zapasem dla aplikacji i jej procesów potomnych.

1. Sprawdź, czy Ubuntu używa cgroup v2

Systemy Ubuntu korzystające z systemd zazwyczaj korzystają z ujednoliconej hierarchii cgroup v2. Sprawdź aktywną konfigurację, zanim skorzystasz ze ścieżek pokazanych poniżej:

stat -fc %T /sys/fs/cgroup
systemctl --version | head -n 1

Pierwsze polecenie powinno zwrócić cgroup2fs. Jeśli zgłosi inny typ systemu plików, ścieżki plików cgroup v2 z tego artykułu nie mają zastosowania w takiej postaci, w jakiej zostały napisane. Właściwości systemd mogą być nadal obsługiwane w innej hierarchii, ale należy użyć odpowiedniej dokumentacji dystrybucji zamiast kopiować ścieżki v2.

Sprawdź również dokładną wersję systemd, jeśli właściwość zostanie odrzucona. Dokumentacja Noble w Ubuntu opisuje CPUQuota=i MemoryMax=jako ustawienia kontroli zasobów; starsze wersje Ubuntu mogą zawierać inne wersje systemd.

2. Rozpocznij obciążenie pracą w ograniczonym zakresie

Uruchom program przez systemd-run, podstawiając jego rzeczywisty plik wykonywalny i argumenty. W przypadku polecenia w bieżącym katalogu użyj ./i przekaż wszystkie argumenty po --:

systemd-run --scope \
  -p CPUQuota=50% \
  -p MemoryMax=1G \
  -- ./my-program --input data.csv
Terminal Ubuntu z uruchomionym systemem systemd-run, z CPUQuota ustawionym na 50 procent i MemoryMax ustawionym na 1 GB dla polecenia
Uruchom polecenie w przejściowym zakresie systemd z limitami procesora i pamięci.

W przypadku polecenia należącego do użytkownika, wypróbuj tę opcję bez sudowcześniejszego uruchomienia. Jeśli systemd zgłosi, że żądany kontroler lub właściwość są niedostępne, menedżer użytkowników może nie mieć uprawnień do ich delegowania; ponowienie próby jako użytkownik root może być właściwe w przypadku obciążenia całego systemu, ale zmienia kontekst bezpieczeństwa polecenia. Nie uruchamiaj przypadkowo niezaufanego programu jako użytkownik root. Jeśli wymagane jest użycie menedżera systemu jako użytkownik root, użyj tej opcji sudo systemd-run --scope ...dopiero po uwzględnieniu tej zmiany.

Terminal pozostaje podłączony do zakresu podczas wykonywania polecenia. Naciśnięcie Ctrl+Cprzerywa działanie na pierwszym planie. Zakres jest przejściowy i zazwyczaj znika po zakończeniu procesu. Jest to wygodny sposób na uruchomienie polecenia z ograniczeniami, a nie stała polityka na potrzeby przyszłych uruchomień.

3. Znajdź zakres i sprawdź jego ograniczenia

systemd-runWyświetla nazwę utworzonej jednostki, zazwyczaj coś w stylu run-….scope. Podczas działania polecenia wyświetl drzewo cgroup:

systemd-cgls

Znajdź zakres przejściowy i upewnij się, że program docelowy i jego podrzędne znajdują się pod nim. To ważne, ponieważ program podrzędny działający poza zakresem nie będzie objęty tym samym pułapem cgroup.

Drzewo grupy terminali pokazujące zakres uruchomienia przejściowego zawierający program i dwa procesy robocze
Użyj drzewa cgroup, aby potwierdzić, czy program i jego pracownicy są zgrupowani w zakresie przejściowym.

Użyj wydrukowanej nazwy zakresu w następnym poleceniu. Zastąp ją run-abc.scoperzeczywistą nazwą:

systemctl show run-abc.scope \
  -p ControlGroup -p CPUQuotaPerSecUSec -p MemoryMax

CPUQuotaPerSecUSec=50000jest zgodny z limitem 50%, gdy okres limitu systemd wynosi 100 ms; MemoryMax=1073741824wynosi 1 GiB w bajtach. Wartości bieżące są bardziej przydatne niż założenie, że każdy host zaakceptuje każde żądanie bez zmian, ponieważ nadrzędne grupy cgroups i dostępne kontrolery mogą ograniczać efektywny wynik.

systemctl wyświetla dane wyjściowe z wartościami ControlGroup, limitu procesora i maksymalnymi wartościami pamięci dla zakresu przejściowego
Sprawdź zgłoszoną grupę kontrolną zakresu oraz skonfigurowane limity procesora i pamięci.

4. Zweryfikuj pliki cgroup jądra i dostosuj je bezpiecznie

Właściwość ControlGrouppodaje ścieżkę cgroup względem /sys/fs/cgroup. Zapisz ją w zmiennej powłoki, aby polecenia podążały ścieżką faktycznie przypisaną na Twoim komputerze:

UNIT=run-abc.scope
CG=$(systemctl show "$UNIT" -p ControlGroup --value)
printf 'Group: %s\n' "$CG"
cat "/sys/fs/cgroup$CG/cpu.max"
cat "/sys/fs/cgroup$CG/memory.max"

W cgroup v2 cpu.maxzawiera kwotę i okres w mikrosekundach. Na przykład 50000 100000oznacza 50 ms czasu procesora w każdym okresie 100 ms. memory.maxPokazuje limit pamięci w bajtach. Jeśli brakuje plików, sprawdź, czy zakres jest nadal aktywny i czy jądro używa cgroup v2.

Terminal odczytuje wartości cpu.max i memory.max z zakresu systemd w grupie cgroup sysfs v2
Przeczytaj pliki cgroup v2 jądra, aby zweryfikować skonfigurowany limit i limit pamięci.

Jeśli uruchomiłeś nazwaną, długo działającą jednostkę i musisz dostosować jej limity, systemd obsługuje zmianę właściwości zasobów w aktywnej jednostce, na przykład sudo systemctl set-property --runtime my-worker.service CPUQuota=50% MemoryMax=1G. Dotyczy to grupy cgroup tej usługi i wymaga odpowiednich uprawnień. Systemd nie dołącza żadnego, już uruchomionego procesu tylko dlatego, że znany jest jego PID; w przypadku jednorazowego procesu należy go zatrzymać i ponownie uruchomić w ograniczonym zakresie. W przypadku usługi trwałej należy skonfigurować właściwości w jednostce usługi lub w module systemd i uruchomić go ponownie w odpowiednim oknie konserwacji.

Sprawdź wynik

Utrzymuj obciążenie aktywne podczas jego inspekcji. Upewnij się, że systemd-cglsumieszcza proces i jego elementy podrzędne w zamierzonym zakresie, systemctl showraportuje żądane właściwości oraz że odpowiednie pliki cpu.maxi memory.maxistnieją ze skończonymi wartościami. Po zakończeniu procesu zakres przejściowy jest usuwany, więc jego pliki cgroup mogą zniknąć.

Limit ogranicza czas procesora, ale nie gwarantuje stałego procentu na monitorze komputera stacjonarnego, a sztywny limit pamięci może powodować awarie, jeśli aplikacja potrzebuje więcej niż wynosi limit. Jeśli obciążenie stanie się niestabilne, należy je zatrzymać i zwiększyć limit do zmierzonej, bezpiecznej wartości lub użyć łagodniejszego MemoryHigh=progu obciążenia wraz z wyższym MemoryMax=. Aby uzyskać dokładne informacje na temat działania, zapoznaj się z zainstalowaną dokumentacją systemd i jądra; wiarygodne źródła to podręcznik Ubuntu systemd-run , podręcznik Ubuntu systemd resource-control oraz dokumentacja Linux kernel cgroup v2 .

Zostaw komentarz

Jak przeliczać napięcie, prąd, kW, kVA i współczynnik mocy w sieciach trójfazowych

Jak przeliczać napięcie, prąd, kW, kVA i współczynnik mocy w sieciach trójfazowych

Poznaj zrównoważone wzory trójfazowe i przelicz krok po kroku napięcie sieciowe, prąd, kW, kVA i współczynnik mocy, korzystając z rozwiązanego przykładu i ograniczeń umożliwiających sprawdzenie.

Ograniczanie użycia procesora i pamięci przez polecenia za pomocą grup dyskusyjnych Ubuntu

Ograniczanie użycia procesora i pamięci przez polecenia za pomocą grup dyskusyjnych Ubuntu

Uruchom obciążenie w zakresie systemd z CPUQuota i MemoryMax, a następnie zweryfikuj limity za pomocą cgroup v2.

Szyfrowanie Pi-hole Upstream DNS na Ubuntu Server 24.04

Szyfrowanie Pi-hole Upstream DNS na Ubuntu Server 24.04

Skonfiguruj dnscrypt-proxy jako lokalny most DoH Pi-hole w Ubuntu 24.04, z nasłuchiwaniem tylko na hoście lokalnym, wyborem resolvera i sprawdzaniem przed przełączeniem DNS.

Uruchomienie gestów na panelu dotykowym Ubuntu 24.04 na Wayland

Uruchomienie gestów na panelu dotykowym Ubuntu 24.04 na Wayland

Przed przystąpieniem do rozwiązywania problemów z aplikacjami lub sprzętem sprawdź ustawienia touchpada w systemie Ubuntu, potwierdź działanie Wayland i przetestuj wbudowaną funkcję przesuwania w środowisku GNOME.

Zbuduj lustrzaną kopię RAID 1 systemu Debian 12 za pomocą narzędzia mdadm

Zbuduj lustrzaną kopię RAID 1 systemu Debian 12 za pomocą narzędzia mdadm

Utwórz i zweryfikuj dwudyskową macierz danych Debian 12 RAID 1, sformatuj ją bezpiecznie i skonfiguruj tak, aby można ją było zmontować i zamontować po ponownym uruchomieniu.

Szyfruj partycję wymiany systemu Debian 12 nowym kluczem przy każdym uruchomieniu

Szyfruj partycję wymiany systemu Debian 12 nowym kluczem przy każdym uruchomieniu

Skonfiguruj szyfrowanie kluczem losowym dla istniejącej partycji wymiany Debian 12, zweryfikuj aktywne mapowanie dm-crypt i poznaj kompromis związany z hibernacją.

Jak ograniczyć dostęp użytkowników SSH do określonych katalogów w systemie Ubuntu 24.04 (przewodnik po SFTP Chroot)

Jak ograniczyć dostęp użytkowników SSH do określonych katalogów w systemie Ubuntu 24.04 (przewodnik po SFTP Chroot)

Ogranicz konta SSH Ubuntu 24.04 do wyznaczonych folderów SFTP z chroot, odpowiednimi uprawnieniami, regułami dopasowania i bezpiecznymi testami — bez udzielania dostępu do powłoki.

Bezpieczne zwolnienie blokady APT w systemie Ubuntu i zakończenie aktualizacji

Bezpieczne zwolnienie blokady APT w systemie Ubuntu i zakończenie aktualizacji

Znajdź proces, który jest właścicielem blokady front-endu dpkg Ubuntu, pozwól na dokończenie pracy pakietu i napraw przerwane instalacje bez usuwania plików blokady.

Jak skonfigurować automatyczne migawki Btrfs na pulpicie Ubuntu

Jak skonfigurować automatyczne migawki Btrfs na pulpicie Ubuntu

Skonfiguruj zaplanowane migawki systemu Btrfs w systemie Ubuntu Desktop za pomocą funkcji Timeshift, zweryfikuj układ podwoluminów Ubuntu, wybierz sposób przechowywania i dowiedz się, czego migawki nie mogą chronić.

Jak przeprowadzić migrację Debiana 12 do dystrybucji testowej bez naruszania zależności

Jak przeprowadzić migrację Debiana 12 do dystrybucji testowej bez naruszania zależności

Zaplanuj bezpieczniejszą migrację z dystrybucji Debian 12 do wersji testowej: wykonaj aktualizację do wersji stabilnej, wykonaj kopię zapasową, wyczyść źródła APT, przeprowadź symulację zmian zależności i zweryfikuj, co uległo zmianie.