Mam 3 procesy na maszynie z jednym rdzeniem. Każdy proces jest dokładnie taki sam i spala procesor tak szybko, jak to możliwe (ciasna pętla). Dwa z nich ( A
i B
) są uruchamiane z cgexec w oddzielnych grupach z udziałami ustawionymi na 512 i 512. Trzeci ( C
) jest uruchamiany regularnie, nie z cgexec.
Gdy wszystkie są już uruchomione, C
otrzymuje 66% procesora, A
a B
dzieli 33%. Jeśli zabiję C
wtedy A
i B
dostać 50% każda (zgodnie z oczekiwaniami).
Dlaczego C
dostaje 66%? W tym scenariuszu spodziewałbym się po 33%, a może 50% (C), 25% (A) i 25% (B). 66% C
nie zadziała, bez względu na to, jak robię matematykę.
Ogólnie chcę zrozumieć, w jaki sposób procesy uruchamiane bez cgexec
interakcji z procesami uruchamianymi, cgexec
jeśli chodzi o współdzielenie zasobów (w szczególności procesor, ale bardziej ogólna odpowiedź byłaby doceniona, gdyby nie była zbyt złożona).
top
i uważam, że zostały one uruchomione dość prosto z wiersza polecenia:cgexec -g cpu:foo myprogram
i./myprogram
. Minęło trochę czasu, więc nie pamiętam z całą pewnością.cpu.shares
jest bardzo osobliwą opcją konfiguracji; Polecam dzielenie rzeczy na procesory, jeśli to możliwe,cpuset.cpus
zamiast tego.Odpowiedzi:
Grupy C są hieraryczne i są dziedziczone przez wszystkie podprocesy. Więc wszystkie procesy muszą znajdować się w jakiejś grupie. Domyślnie jest to grupa główna i domyślnie ma 1024 udziały, czyli dwa razy więcej niż A i B w twoim przykładzie.
Czas procesora jest dzielony między grupami według wagi przypisanej im w jednostkach centralnych. Akcje.
Gdyby A miał 1024 udziały, a B 512, C 256 i D 256, rozkład czasu procesora wynosiłby A - 50%, B - 25%, C i D 12,5%.
źródło
cgexec
. Zatemcgexec
proces nieprocesowy uzyskałby 50%, a wszystkie procesy pogrupowane podzieliłyby pozostałe 50%. W ramach pogrupowanych procesów dzielą ich 50% równomiernie, co oznacza, że oba otrzymują 25%. To miałoby sens, ale to nie jest zachowanie, które zaobserwowałem. Widziałem 66%, 33% i 33%. Czy potrafisz zaktualizować odpowiedź, aby zawierała więcej szczegółów i być może przykładową dystrybucję?cgexec
otrzyma 1024 udziały. Każdy proces uruchamiany za pomocącgexec
pobiera określone udziały. Tak więc w tym przypadku jeden proces otrzymuje 1024 udziały, a pozostałe dwa po 512, co powoduje dystrybucję, którą widziałem. Czy mógłbyś zaktualizować swoją odpowiedź, aby dać trochę więcej jasności, na przykład na przykład?1024 + 512 + 512 = 2048
.512/2048 == 25%
. Nie sądzę, aby ta odpowiedź była prawidłowa, przynajmniej na pozór.