Jak ograniczyć wykorzystanie zasobów, aby zaoszczędzić procesor + pamięć RAM dla określonego procesu?

25

Mam serwer deweloperski, na którym sshdczasami przestaje działać, ponieważ w maszynie brakuje pamięci RAM. Tak, kończy nam się pamięć i aktualizacja nie jest obecnie realnym wyborem. Chcę powiedzieć maszynie: „Rób, co chcesz, ale pomiń 20 MB i trochę procesora sshd!”.

Jak można to zrobić?

phunehehe
źródło
Sshd nie powinien tak wybuchać, zwykle jest to bardzo dobrze zachowujący się demon. Upewnij się, że jest zaktualizowany do najnowszej / najlepszej. Co ty z tym robisz? Czy przesyłacie przez nią masowe dane?
Marcin
2
@Marcin Nie sądzę, że robię coś dużego, edycja tekstu. Nawet jeśli sshdjest dobrze wychowany, myślę, że utknąłby, gdyby nie było wystarczającej ilości procesora / pamięci RAM do użycia, prawda?
phunehehe
Kiedy linuxowi zabraknie pamięci, zaczyna zabijać procesy w celu odzyskania pamięci. Być może widzisz OOM w akcji (zabójca pamięci). Nie wiem jednak, dlaczego miałby konsekwentnie zabijać twój sshd. Czy kiedykolwiek widziałeś, jak sshd przecieka (powiększa się) okropnie, zanim wybuchnie, czy też działa dobrze w jednej chwili i jest martwy w następnej?
Marcin
@Marcin ma szanse, że jeśli jest OOM, system jest tak bardzo obciążony, że sshd po prostu nie może odpowiedzieć, to nie jest problem sshd, ale problem z jego obciążeniem. Niestety nie znam odpowiedzi na to pytanie.
Xenoterracide
@phunehehe jesteś pewien, że problemem jest brak pamięci dla ssh, a nie twój ładunek jest przez dach? czy sshd daje jakieś błędy? jakie jest obciążenie pudełka? i co powoduje brak pamięci w systemie.
Xenoterracide

Odpowiedzi:

9

Prawdopodobnie można coś takiego osiągnąć, używając cgroups z kontrolerem zasobów pamięci .

Sądzę, że umieściłbyś wszystkie swoje zadania zajmujące zasoby w ograniczonym zakresie (procesor i pamięć RAM) cgroupi pozostawiłeś sshd„na zewnątrz”, aby nie było ograniczone.

(Dodanie większej ilości wymiany, nawet w postaci pliku wymiany, może być jednak dobrą opcją).

Mata
źródło
Wciąż się waham, nie wygląda to łatwo (zepsute przez Ubuntu).
phunehehe
och, to z pewnością nie jest łatwe :-) Dodawanie zamiany jest zdecydowanie łatwiejsze.
Mat
@phunehehe Zapraszamy do bycia administratorem Sys, to nie jest łatwe. Ale teraz musisz nauczyć się, jak nie robić łatwych rzeczy.
ksenoterracid
6

Och, ale cgroups są łatwe :) Zainstaluj pakiet libcgroup. Utwórz plik /etc/cgconfig.conf:

mount {
    cpu     = /cgroup/cpu_and_mem;
    cpuacct = /cgroup/cpu_and_mem;
    memory  = /cgroup/cpu_and_mem;
}

group sshd {
        cpu {
                cpu.shares="500";
        }
        cpuacct {
                cpuacct.usage="0";
        }
        memory {
                memory.limit_in_bytes="1G";
        }
}

group nosshd {
        cpu {
                cpu.shares="500";
        }
        cpuacct {
                cpuacct.usage="0";
        }
        memory {
                memory.limit_in_bytes="1G";
        }
}

Rozpocznij cgconfigproces, który utworzy hierarchię, cgroups i ustawi ograniczenia. Jeśli to się powiedzie, masz dwie grupy, z których każda ma przypisane 50% CPU i 1G dostępnej pamięci (nie wiem, jaka jest twoja rzeczywista ilość dostępnej pamięci; zakładając, że w tym przykładzie jest to 2G). Teraz wystarczy przenieść wszystkie zadania (tj. Wszystkie procesy uruchomione w systemie) z grupy głównej do grupy nosshd:

cgroup]# cat tasks >> nosshd/tasks
cgroup]# echo > tasks

Następnie wystarczy pobrać PID sshdprocesu i przenieść go do pliku zadań sshd:

cgroup]# echo $PID >> sshd/tasks

Ta-da, gotowe. Teraz możesz mieć pewność, że sshd będzie zawsze mieć 50% procesora i 1G pamięci.

mart1n
źródło
1

Użyj, reniceaby uzyskać wyższy priorytet sshdlub sprawdzić księgowość. (acct) -> dzięki temu możesz ustawić zasoby dla użytkowników, więc uruchom sshd z s

MSpike
źródło
Dodałbym ionicedo tego i prawdopodobnie zacznę od sshd z przyjemnością, że później go nie przerabiam.
Xenoterracide
1

Bardziej ogólnym rozwiązaniem problemu wykorzystania zasobów aplikacji jest uruchamianie aplikacji w kontenerze za pomocą Dockera . Następnie można uruchamiać kontenery z limitami wykorzystania procesora i pamięci podobnymi do cgroups.

docker run -c=10 -m=1g my-container
Sean Fujiwara
źródło