Użyj cgroup, aby ograniczyć wykorzystanie pamięci przez virtualbox

9

Próbuję użyć cgroup(Grupa kontrolna), aby ograniczyć wykorzystanie pamięci przez virtualbox, ale wydaje się, że to nie działa.

Moja maszyna to:

$ uname -a
Linux fc.bgi 2.6.40-4.fc15.i686 #1 SMP Fri Jul 29 18:54:39 UTC 2011 i686 i686 i386 GNU/Linux

Starałem się, aby działał w ten sposób:

  1. Tworzenie nowych grup w hierarchii pamięci:

    $ cgcreate -g memory:vbox
    
  2. Ustawienie memory.limit_in_bytes dla vbox:

    $ cgset -r memory.limit_in_bytes=512M vbox
    
  3. Grupowanie vbox z uruchomionym pid do vbox:

    $ cgclassify -g memory:vbox 20015
    

Czy ktoś może wyjaśnić, dlaczego to nie działa?

Gilles „SO- przestań być zły”
źródło

Odpowiedzi:

3

możesz ograniczyć użycie pamięci za pomocą /etc/security/limits.conf w tym pliku, który umieściłeś:

domain type item value

gdzie domainjest @groupname, typejest hardlub softgdzie hardjest limit, którego nie można przekroczyć w żadnych okolicznościach.

itemto pole przedmiotu określa, jaki rodzaj przedmiotu jest ograniczony. Przykłady obejmują rdzeń (rozmiar plików podstawowych), dane (rozmiar obszaru danych programu), fsize (rozmiar plików utworzonych przez użytkownika), nofile (liczba otwartych plików danych), rss (zestaw rezydentny) size), stos (rozmiar stosu), procesor (czas pracy procesora w minutach), nproc (liczba równoczesnych procesów), maxloginy (liczba jednoczesnych logowań) i priorytet (priorytet procesu). Dane, rss i elementy stosu odnoszą się do pamięci zajętej przez program. Te i inne miary pojemności danych są mierzone w kilobajtach.

i valuejest odnosić się do itempola, które trzeba wybrał, na przykład, jeśli masz wybrał cpuw itempolu i umieścić 2w valueto w przypadku tej domain(ty grupie VirtualBox) jest wziąć więcej niż 2czasu procesora zostanie ona zakończona.

Możesz także użyć ulimit, ale ogranicza się to tylko do powłoki bash.

Mam nadzieję, że pomoże ci to w osiągnięciu celu, chociaż nie jest to zrobione za pomocą metody, o którą prosiłeś.

Hanan N.
źródło
1

Zgaduję, że coś jest nie tak z twoim /etc/cgconfig.confplikiem. Ta konfiguracja działa dla mnie:

[root@localhost cgroup]# cat /etc/cgconfig.conf
mount {
    memory  = /cgroup/memory;
}

[root@localhost cgroup]# service cgconfig start
Starting cgconfig service:                                 [  OK  ]
[root@localhost cgroup]# ls
memory
[root@localhost cgroup]# ls memory/
cgroup.event_control  memory.limit_in_bytes        memory.memsw.max_usage_in_bytes  memory.soft_limit_in_bytes  memory.use_hierarchy
cgroup.procs          memory.max_usage_in_bytes    memory.memsw.usage_in_bytes      memory.stat                 notify_on_release
memory.failcnt        memory.memsw.failcnt         memory.move_charge_at_immigrate  memory.swappiness           release_agent
memory.force_empty    memory.memsw.limit_in_bytes  memory.oom_control               memory.usage_in_bytes       tasks
[root@localhost cgroup]# cgcreate -g memory:vbox
[root@localhost cgroup]# cgset -r memory.limit_in_bytes=512M vbox
[root@localhost cgroup]# cgclassify -g memory:vbox 11727
[root@localhost cgroup]# cat memory/vbox/tasks 
11727

Chociaż zamiast używania poleceń cgreatei cgsetradzę po prostu utworzyć /etc/cgconfig.confplik zawierający te ustawienia, abyś nie musiał powtarzać procesu po każdym ponownym uruchomieniu. W twoim przypadku plik wyglądałby tak:

[root@localhost cgroup]# cat /etc/cgconfig.conf
mount {
    memory  = /cgroup/memory;
}

group vbox {
    memory {
        memory.limit_in_bytes="536870912";
    }
}

Teraz, za każdym razem, gdy uruchomisz cgconfigusługę, będziesz mieć gotową grupę vbox. Wszystko, co jest potrzebne, to przenieść PID wirtualnego pudełka do /cgroups/memory/vbox/taskspliku za pomocą jednego cgclassifylub tylko echonumeru w tym pliku.

mart1n
źródło