Używam systemu Linux, który ma wielu użytkowników, ale czasami zdarza się nadużycie; gdzie użytkownik może uruchomić pojedynczy proces, który zużywa ponad 80% procesora / pamięci.
Czy istnieje sposób, aby temu zapobiec, ograniczając zużycie procesora przez proces (na przykład do 10%)? Zdaję sobie z tego sprawę cpulimit
, ale to niestety ogranicza limit do procesów, które nakazuję mu ograniczyć (np. Pojedyncze procesy). Więc moje pytanie brzmi: w jaki sposób mogę zastosować limit do wszystkich uruchomionych procesów i procesów, które będą uruchamiane w przyszłości bez konieczności podawania na przykład ich identyfikatora / ścieżki?
centos
command-line
cpu
limit
Giovanni Mounir
źródło
źródło
cpulimit
w połączeniu ze swoim skryptem wyszukiwania. Miej zasady i zalecaj stosowaniecpulimit
, a następnie wyszukaj ponad 10%, a następnie ogranicz do 5% (więc użytkownicy są zachęcani do korzystaniacpulimit
). Upewnij się także, że możesz wykryć wiele procesów, które stanowią ponad 10% dla jednego użytkownika.cpulimit
jest o wiele lepsza niż zwykłe zabicie procesu, ponieważ może zostać później ponownie uruchomiony przez użytkownika (jak wskazano w jednym z twoich komentarzy). Dziękuję Ci!Odpowiedzi:
Chociaż może to być nadużycie pamięci, nie dotyczy procesora: gdy procesor jest w stanie bezczynności, uruchomiony proces (przez „uruchomienie” oznacza, że proces nie czeka na operacje we / wy lub coś innego) Domyślnie 100% czasu procesora. I nie ma powodu egzekwować limitu.
Teraz możesz ustawić priorytety dzięki
nice
. Jeśli chcesz, aby miały zastosowanie do wszystkich procesów dla danego użytkownika, musisz tylko upewnić się, że jego powłoka logowania jest uruchomiona znice
: procesy potomne odziedziczą tęnice
wartość. Zależy to od sposobu logowania użytkowników. Zobacz na przykład Priorytet logowania ssh (miły) .Alternatywnie możesz skonfigurować maszyny wirtualne. Rzeczywiście ustawienie limitu na proces nie ma większego sensu, ponieważ użytkownik może uruchomić wiele procesów, nadużywając systemu. W przypadku maszyny wirtualnej wszystkie ograniczenia będą globalne dla maszyny wirtualnej.
Innym rozwiązaniem jest ustalenie
/etc/security/limits.conf
limitów; zobacz stronę podręcznika limit.conf (5). Na przykład można ustawić maksymalny czas procesora na logowanie i / lub maksymalną liczbę procesów na logowanie. Możesz także ustawićmaxlogins
na 1 dla każdego użytkownika.źródło
ładne / renice
nice
jest doskonałym narzędziem do jednorazowych poprawek w systemie.cpulimit
cpulimit
jeśli chcesz uruchomić zadanie intensywnie wykorzystujące procesor i mieć wolny czas procesora, jest niezbędny do reakcji systemu.grupy
cgroups
zastosować ograniczenia do zestawu procesów, a nie tylko do jednegoZasoby
http://blog.scoutapp.com/articles/2014/11/04/restricting-process-cpu-usage-using-nice-cpulimit-and-cgroups
źródło
cpu.cfs_quota_us
parametr (patrz instrukcja )sudo cgclassify -g cpu:cpulimited 2315444
Patrzyłeś na cgroups? Na stronie Arch Wiki znajduje się kilka informacji na ich temat. Przeczytaj sekcję o
cpu.shares
, wygląda na to, że robi to, czego potrzebujesz, i mogą działać na poziomie użytkownika, dzięki czemu możesz ograniczyć wszystkie procesy użytkownika na raz.źródło
Dla pamięci to, czego szukasz
ulimit -v
. Zauważ, żeulimit
jest dziedziczony przez procesy potomne, więc jeśli zastosujesz go do powłoki logowania użytkownika w momencie logowania, dotyczy to wszystkich jego procesów.Jeśli wszyscy użytkownicy używają
bash
jako powłoki logowania, wstawienie następującego wiersza/etc/profile
powinno spowodować, że wszystkie procesy użytkownika będą miały twardy limit 1 gigabajta (a dokładniej milion kilobajtów):Opcja
H
zapewnia, że jest to twardy limit, to znaczy, że użytkownik nie będzie mógł później ustawić go ponownie. Oczywiście użytkownik nadal może zapełnić pamięć, uruchamiając jednocześnie wystarczającą liczbę procesów.W przypadku innych powłok musisz dowiedzieć się, jakie pliki inicjujące czytają zamiast tego (i jakich innych poleceń zamiast
ulimit
używać).Wydaje mi się, że to, czego sobie życzysz, nie ma sensu. Jaki byłby użytek z pozostawienia 90% procesora nieużywanego, gdy uruchomiony jest tylko jeden proces? Myślę, że tak naprawdę chcesz
nice
(i prawdopodobnieionice
). Zauważ, że podobnieulimit
,nice
wartości są dziedziczone przez procesy potomne, więc wystarczy zastosować je do powłoki logowania w czasie logowania. Myślę, że dotyczy to również,ionice
ale nie jestem pewien.źródło
nice
będzie wystarczająco miłe, aby to zrobić? Jeśli tak, czy uważasz, że możesz pokazać mi przykład, aby to osiągnąć?Ponieważ jesteś stwierdzające, że cpulimit nie byłoby praktyczne w Twoim przypadku, to proponuję spojrzeć w Nicei , Renice i taskset , które mogą zbliżyć się do tego, co chcesz osiągnąć, chociaż taskset pozwala na ustawienie procesora powinowactwo dla procesów męska, więc może nie być natychmiast pomocny w twoim przypadku.
źródło
nice
irenice
? To miłe! Przejrzałem ich strony podręcznika, ale nadal nie sądzę, aby mogli w tym pomóc, ponieważ nadal musisz ustawić identyfikator procesu. Jeśli mógłbyś jednak podać przykład, w którym te pakiety stosują limit na wszystkie uruchomione procesy / przyszłe procesy, które byłyby niesamowite!Ponieważ Twoje tagi mają
centos
, możesz użyćsystemd
.Na przykład, jeśli chcesz ograniczyć użytkownika o identyfikatorze
1234
:sudo systemctl edit --force user-1234.slice
Następnie wpisz i zapisz to:
[Slice] CPUQuota=10%
Wpłynie to na zalogowanie się użytkownika.
Strony man:
systemctl
,systemd.slice
,systemd.resource-control
...źródło
Jeśli chcesz ograniczyć procesy, które już zostały uruchomione, będziesz musiał to zrobić jeden po drugim według PID, ale możesz mieć skrypt wsadowy, aby to zrobić tak jak poniżej:
W moim przypadku
pypdfocr
uruchamia chciwytesseract
.Również w niektórych przypadkach, gdy twój procesor jest całkiem dobry, możesz po prostu użyć
renice
takiego:źródło