Mamy komputer, którego procesor ma 32 rdzenie i będzie używany do uruchamiania programów przez kilku różnych użytkowników. Czy istnieje sposób na ograniczenie liczby rdzeni, z których każdy użytkownik może korzystać w dowolnym momencie, aby jeden użytkownik nie zmonopolizował całej mocy procesora?
18
Odpowiedzi:
Chociaż jest to możliwe , jest to skomplikowane i prawie na pewno zły pomysł. Jeśli tylko jeden użytkownik korzysta obecnie z urządzenia, ograniczenie ich do N rdzeni jest marnotrawstwem zasobów. O wiele lepszym rozwiązaniem byłoby uruchomienie wszystkiego z
nice
:To świetne narzędzie, które określa priorytet procesu. Więc jeśli tylko jeden użytkownik coś uruchomi, otrzyma tyle czasu procesora, ile potrzebuje, ale jeśli ktoś inny uruchomi własną (również przyjemną) pracę, będzie miły i będzie się ze sobą dzielił. W ten sposób, jeśli wszyscy użytkownicy uruchamiają polecenia
nice 10 command
, nikt nie będzie przechwytywał zasobów (i nikt nie rzuci serwera na kolana).Zauważ, że wysoka wartość nice oznacza niski priorytet. Jest to miara tego, jak mili powinniśmy być i im milsi jesteśmy, tym więcej się dzielimy.
Należy również pamiętać, że nie pomoże to w zarządzaniu alokacją pamięci, wpływa jedynie na planowanie procesora. Jeśli więc wielu użytkowników uruchomi wiele procesów wymagających dużej ilości pamięci, nadal będziesz mieć problem. Jeśli to jest problem, powinieneś przyjrzeć się odpowiednim systemom kolejkowania, takim jak moment obrotowy .
źródło
nice
, z tego, co opisujesz , to jest dokładnie to, czego potrzebujesz.TL; DR : Z krótkich badań wynika, że można ograniczyć polecenia do określonej liczby rdzeni, jednak we wszystkich przypadkach trzeba użyć polecenia, które faktycznie wymusza ograniczenie.
grupy
Linux ma
cgroups
często używany dokładnie w celu ograniczenia zasobów dostępnych dla procesów. Z bardzo krótkich badań można znaleźć przykład w Arch Wiki z konfiguracją Matlab (oprogramowanie naukowe) w/etc/cgconfig.conf
:Aby taka konfiguracja zadziałała, musisz uruchomić proces za pomocą
cgexec
polecenia, np. Z tej samej strony wiki:zestaw zadań
Pokrewnych pytanie dotyczące ASK i Ubuntu Jak ograniczyć proces do jednego rdzenia procesora w systemie Linux? [duplikat] na stronie Uniksa i Linuksa pokazuje przykład zastosowania
taskset
ograniczenia procesorów dla tego procesu. W pierwszym pytaniu jest to osiągane poprzez analizowanie wszystkich procesów dla konkretnego użytkownikaW drugim pytaniu proces rozpoczyna się
taskset
sam:Wniosek
Chociaż z pewnością możliwe jest ograniczenie procesów, wydaje się, że nie jest to takie proste dla konkretnych użytkowników. Przykład w połączonym poście Ask Ubuntu wymagałby spójnego skanowania procesów należących do każdego użytkownika i korzystania z niego
taskset
na każdym nowym. O wiele bardziej rozsądnym podejściem byłoby selektywne uruchamianie aplikacji intensywnie wykorzystujących procesor, za pośrednictwemcgexec
lubtaskset
; nie ma również sensu ograniczanie wszystkich procesów do określonej liczby CPUS, szczególnie tych, które faktycznie korzystają z równoległości i współbieżności w celu szybszego wykonywania swoich zadań - ograniczenie ich do określonej liczby procesorów może spowolnić przetwarzanie. Dodatkowo, jak wspomniano w odpowiedzi Terdona, jest to marnotrawstwo zasobówUruchamianie wybranych aplikacji za pośrednictwem
taskset
lubcgexec
wymaga komunikowania się z użytkownikami w celu poinformowania ich, jakie aplikacje mogą uruchomić, lub tworzenia skryptów opakowujących, które uruchamiają wybrane aplikacje za pomocątasksel
lubcgexec
.Ponadto należy rozważyć ustawienie liczby procesów, które może odrodzić się użytkownik lub grupa, zamiast ustawiania limitu liczby procesorów. Można to osiągnąć za pomocą
/etc/security/limits.conf
pliku .Zobacz też
źródło
sched_setaffinity(2)
mówi maska powinowactwo jest zachowana w poprzekexecve(2)
, i że dziecko dziedziczy ją nafork(2)
. Jeśli więc ustawisz powłokę dla użytkownika (lub graficzną powłokę dla sesji X), wszystko, co zaczną od tej powłoki, domyślnie użyje tej samej maski koligacji.