Jak ustawić limit mocy procesora dla danego procesu na stałe. Cpulimit i nice nie działają


12

Jest wiele podobnych pytań, ale żadne z nich nie pomaga mi z moim problemem.

Mam Ubuntu 11.10 na serwerze (jest to wersja stacjonarna). Mam na nim działającą stronę internetową. Jest jeden proces, który jest bardzo ważny, ale nie musi być uruchamiany z wysokim priorytetem. Chcę trwale ograniczyć użycie procesora dla procesu , a nie dla użytkownika. Ten proces jest uruchamiany przez funkcję exec (jest to funkcja php, a nie proces systemowy).

Widzę więc 2 opcje: 1. Dodaj jakiś limit za każdym razem, gdy funkcja jest wykonywana. 2. Na stałe ogranicz użycie procesora dla tego procesu.

Próbowałem użyć „nice” i cpulimit, ale wydaje się, że nic nie działa. Nice nie ma żadnego efektu, a cpulimit (z -e) mówi: „nie znaleziono procesu docelowego”.

Jestem dość początkującym, więc proszę założyć, że prawie nic nie wiem.


Czy możesz nam powiedzieć, co próbowałeś. cgroups może to zrobić za Ciebie.
Panther

Jeśli chodzi o konfigurację, możesz uruchomić, cgsnapshot -saby pobrać informacje bez ręcznego zapisywania pliku konfiguracyjnego, który nie jest zalecany.
Mingliang Liu

Czy chcesz faktycznie dławić proces, tzn. Upewnić się, że nigdy nie przekroczy on określonego czasu?
Ken Sharp,

Użyłem tej metody i zadziałało to dla mnie .. ubuntuforums.org/showthread.php?t=992706
Mustafa Salman

Odpowiedzi:


19

W przypadku braku wymaganych danych ...

Oto jak używam cgroups na Ubuntu.

W tym poście musisz zmienić zmienną „USER” na użytkownika uruchamiającego proces

Dodałem informacje do pamięci, a także będzie to FAQ, jeśli nie potrzebujesz, nie używaj.

1) Zainstaluj cgroup-bin

sudo apt-get install cgroup-bin

2) Uruchom ponownie. cgroups znajduje się teraz w/sys/fs/cgroup

3) Utwórz grupę dla swojego użytkownika (właściciela procesu)

# Change $USER to the system user running your process.
sudo cgcreate -a $USER -g memory,cpu:$USER

4) Użytkownik może zarządzać zasobami. Domyślnie użytkownicy otrzymują 1024 jednostki CPU (udziały), więc aby ograniczyć się do około 10% procesorów, pamięć jest w bajtach ...

# About 10 % cpu
echo 100 > /cgroup/cpu/$USER/cpu.shares

# 10 Mb
echo 10000000 > /cgroup/memory/$USER/memory.limit_in_bytes

5) Rozpocznij proces (zmień exec na cgexec)

# -g specifies the control group to run the process in
# Limit cpu
cgexec -g cpu:$USER command <options> &

# Limit cpu and memory
cgexec -g memory,cpu:$USER command <options> &

Konfiguracja

Zakładając, że grupy pracują dla ciebie;)

Edytuj /etc/cgconfig.conf, dodaj w swojej niestandardowej grupie

# Graphical
gksudo gedit /etc/cgconfig.conf

# Command line
sudo -e /etc/cgconfig.conf

Dodaj w swojej grupie. Ponownie zmień $ USER na nazwę użytkownika będącego właścicielem procesu.

group $USER {
# Specify which users can admin (set limits) the group
perm {    
    admin {
        uid = $USER;
    }
# Specify which users can add tasks to this group
    task {
        uid = $USER;
    }
}
# Set the cpu and memory limits for this group
cpu {
    cpu.shares = 100;
    }
memory {
    memory.limit_in_bytes = 10000000;
    }
}

Możesz także określić grupy gid=$GROUP, /etc/cgconfig.conf jest dobrze skomentowany.

Teraz ponownie uruchom proces cgexec -g cpu:$USER command <options>

Możesz zobaczyć swój proces (według PID) w /sys/fs/cgroup/cpu/$USER/tasks

Przykład

bodhi @ ufbt: ~ $ cgexec -g cpu: bodhi sleep 100 &

[1] 1499

bodhi @ ufbt: ~ $ cat / sys / fs / cgroup / cpu / bodhi / tasks

1499

Aby uzyskać dodatkowe informacje, patrz: http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Resource_Management_Guide/


2
Udało mi się ukończyć część 1. Działa, ale powinieneś dodać informację, że proces jest ograniczony tylko podczas gdy inny proces potrzebuje procesora / pamięci. To nie jest oczywiste - i zajęło mi to długo rozpracowanie (jako że jestem początkujący). Czy rozumiem poprawnie, że „Konfiguracja” ma zapisywać ustawienia nawet po ponownym uruchomieniu?
Rafał

1
Cieszę się, że rozwiązałeś problem. Jest trochę krzywej uczenia się =) Tak, konfiguracja polega na zachowaniu ustawień podczas uruchamiania.
Panther

Kiedy używam cgroup z wiersza poleceń, działa dobrze. Ale kiedy wykonuję to samo polecenie z funkcji exec w php: (<? Php exec ("cgexec -g cpu: GroupHere NameOfProcess InputFile OutputFile"); to nie działa. Jedyną różnicą jest to, że z linii poleceń używam plików, które są w folder, w którym jestem i od php Używam długiej ścieżki do tych plików. Wiesz, co może być problemem? Używam tego samego użytkownika w obu przypadkach.
Rafal

1
@Rafal: Nie wydaje mi się, aby twój pierwszy komentarz był poprawny, pamięć powinna być ograniczona, nawet jeśli żadne inne procesy nie zajmują dużo pamięci.
Flimm

1
@Flimm Podczas testowania tego rozwiązania działały tylko 2 procesy - apache i proces, które powinny być ograniczone. Gdy nie było żadnego połączenia Apache lub było tylko jedno połączenie z Apache, ten ograniczony proces zajął 100% procesora. Zostało ograniczone tylko po kilku połączeniach z Apache (zrobiłem to, odświeżając stronę z przeglądarki internetowej). Może więc nie był to żaden inny proces.
Rafal
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.