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.