-
Notifications
You must be signed in to change notification settings - Fork 9
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add basic version of ai_su with cgroups script #9
base: summer18
Are you sure you want to change the base?
Add basic version of ai_su with cgroups script #9
Conversation
@janchorowski: O coś takiego chodziło? |
Dzięki! Raczej zakładałem że to będzie robione przez ai_su.go - to będzie setuidowa binarka, która poustawia co trzeba i zrzuci uprawnienia. Jest jakaś obsługa cgroup w go (https://github.com/containerd/cgroups) i pewnie łatwo się w niej przepisze ten algorytm. Odnośnie do działania cpu_exclusive - nie wiem jak to działa, muszę posprawdzać. |
Próbowałem to dopisać, ale zupełnie nie mogę się połapać co się dzieje w shares := uint64(100)
memory_limit := int64(6*1024*1024)
swap := int64(0)
cpus := "0"
mems := "0"
control, err := cgroups.New(cgroups.V1, cgroups.StaticPath("/ailimitgroup"), &specs.LinuxResources{
CPU: &specs.LinuxCPU{
Shares: &shares,
Cpus: cpus,
Mems: mems,
},
Memory: &specs.LinuxMemory{
Limit: &memory_limit,
Swap: &swap,
},
})
panicNonNull(err)
fmt.Println("Pid " + string(pid))
err1 := control.Add(cgroups.Process{Pid: pid}) |
Dzieki za pomoc, ai_su ma być takim ograniczonym sudu. Pomysł był żebyście mogli uruchamiać wybrane rozwiązania (dostarczone przez pracowników klub kolegów) nie mogąc podglądać ich kodu, bo to by zepsuło zawody. Do tego nie chciałem pisać webserwisu czy jakiejś innej sprawdzarki i dać maksimum możliwości w wyborze technologii. Więc ai_su.go robi z grubsza tyle:
Efekt jest taki, że ja jako pracownik mogę uruchamiać wasze programy (więc mogę zrobić konkurs), jeśli jakiś śmieszek postanowi aby program zrobił np. rm -Rf $HOME to wykasuje swoje własne pliki (programy studentów działają zawsze z uprawnieniami ich twórców) i studenci nie mogą czytać innych programów (wzorcowych lub kolegów). Na cgroupy jest miejsce tuż przed https://github.com/janchorowski/ai_validator/blob/summer18/lista5/ai_su.go#L139: już sprawdziliśmy że będziemy uruchamiać zadanie, ale jeszcze jesteśmy rootem i możemy zmieniać ustawienia systemowe. Tu trzeba:
można założyć że po zawodach ręcznie innym procesem wykasujemy cgroupy i przywrócimy innym procesom wszystkie rdzenie - więc ai_su nie musi czekać aż program gracza się skończy i może tak jak dotychczas robić exec. Mam nadzieję że to pomaga. Ja będę nad tym siedział jakoś jutro wieczorem/w czwartek, bo w piątek turnieje.. |
Co bym nie robił to dostaję: |
A tak poza tym to tu (https://godoc.org/github.com/opencontainers/runtime-spec/specs-go#LinuxMemory i https://godoc.org/github.com/containerd/cgroups) jest niezła dokumentacja . |
Znalazłem nawet miejsce gdzie pola z tych struktur są jest tłumaczone na konkretne rzeczy z cgroups, ale to mnie tylko upewnia, że to powinno działać ;/ {
name: "limit_in_bytes",
value: mem.Limit,
},
{
name: "memsw.limit_in_bytes",
value: mem.Swap,
} |
Odnośnie do tych panik, głupie pytanie: zakładam że testuje to Pan u siebie jako root? Czy jako zwykły użytkownik? |
Jako root. Trzeba być adminem, żeby tworzyć te grupy. Panic jest rzucany tylko przy próbie ograniczania swapu. Bez tego przechodzi, ale imo i tak nie działa jak powinno (wydaje mi się ze nic nie ogranicza :/ ) |
Czy może Pan zacommitować do tej gałęzi ile Pan ma - będę nad tym pracował. |
Z niewiadomych mi powodów dziś mój bot nie pisze już na stdio po wykonaniu Poza tym:
|
Goroutyn nie używamy. Tu jest duży problem z setuid: w skrócie, to tego w GO juz i tak nie można robić, a ja dodałem te asserty żeby było bezpiecznie (więcej: golang/go#1435). Być może z niedziałaniem cgroup jest podobnie - jak mamy goroutyny, to możemy wkładamy do cgroupy tylko cześc wątków? |
Ostatecznie zrobiłem to trochę inaczej - robię 4 cgroupy dla 4 agantów na komputerze - zasadniczo ai_su nie stara się znaleźć wolnego procesora (mogłoby, ale wtedy jest sporo wyścigów z innymi ai_su które będą uruchamiane). ai_su jedynie przypisuje swój proces do danej cgroupy. Swap panu panikował z dwóch powodów:
|
Dodałem wstępną wersje skryptu w bashu który odpala ./run.sh z ograniczeniami z użyciem
cgroups
.Kilka komentarzy umieściłem w skrypcie oraz poniżej.
Problemy:
cpuset.cpu_exclusive=1
działa - nie wiem jak przetestowaćDo zmiany:
cpu_set
pewnie powinien być wczytywany jako argument i walidowany w skrypciememory.limit_in_bytes
powinnobyćmemory.memsw.limit_in_byte
bo inaczej po zużyciu całego RAMu wchodzi na SWAP (w skrypcie ustawiłem ograniczenie pamięci na 6MiB więc szybko można zauważyć jak wchodzi na SWAP - docelowo powinno być6G
).