Tengo 3 procesos en una máquina de un solo núcleo. Cada proceso es exactamente el mismo y quema la CPU tan rápido como puede (circuito cerrado). Dos de ellos ( A
y B
) se lanzan con cgexec en grupos separados con acciones establecidas en 512 y 512. El tercero ( C
) se lanza regularmente, no con cgexec.
Una vez que todo está en funcionamiento, C
obtiene el 66% de la CPU mientras se divide A
y el B
33%. Si mato C
entonces A
y B
obtengo el 50% cada uno (como se esperaba).
¿Por qué C
obtiene el 66%? Hubiera esperado 33% cada uno en este escenario, o quizás 50% (C), 25% (A) y 25% (B). Sin C
embargo, el 66% que va no funciona, no importa cómo haga los cálculos.
En general, quiero entender cómo los procesos iniciados sin cgexec
interactuar con los procesos iniciados cgexec
cuando se trata de compartir recursos (CPU en particular, pero se agradecería una respuesta más general si no es demasiado complejo).
top
y creo que se iniciaron simplemente desde un símbolo del sistema:cgexec -g cpu:foo myprogram
y./myprogram
. Ha pasado un tiempo, así que no recuerdo con certeza.cpu.shares
es una opción de configuración muy peculiar; Recomiendo dividir las cosas por CPU si es posible usando en sucpuset.cpus
lugar.Respuestas:
Los grupos C son jerárquicos y todos los subprocesos los heredan. Por lo tanto, todos los procesos deben estar en algún cgroup. Por defecto, es el cgroup raíz y, por defecto, tiene 1024 recursos compartidos, que es el doble que A y B en su ejemplo.
El tiempo de CPU se comparte entre los grupos de acuerdo con el peso asignado a ellos en cpu.shares.
Si A tuviera 1024 acciones y B 512 y C 256 y D 256, la distribución de tiempo de la CPU sería A - 50%, B - 25%, C y D 12,5%.
fuente
cgexec
. Por lo tanto, el nocgexec
proceso obtendría el 50% y los procesos agrupados compartirían el 50% restante. Dentro de los procesos agrupados, comparten su 50% de manera uniforme, lo que significa que ambos obtienen el 25%. Esto tendría sentido, pero no es el comportamiento que observé. Lo que vi es 66%, 33% y 33%. ¿Puedes actualizar la respuesta para incluir más detalles y quizás una distribución de ejemplo?cgexec
obtener 1024 recursos compartidos Cualquier proceso iniciado concgexec
obtiene los recursos compartidos especificados. Entonces, en este caso, un proceso obtiene 1024 acciones y los otros dos obtienen 512 cada uno, lo que resulta en la distribución que vi. ¿Le importaría actualizar su respuesta para dar un poco más de claridad, por ejemplo, con un ejemplo?1024 + 512 + 512 = 2048
.512/2048 == 25%
. No creo que esta respuesta sea correcta, al menos no en la superficie.