¿Cómo interactúan los cgroups con los procesos no agrupados?

12

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 ( Ay 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, Cobtiene el 66% de la CPU mientras se divide Ay el B33%. Si mato Centonces Ay Bobtengo el 50% cada uno (como se esperaba).

¿Por qué Cobtiene el 66%? Hubiera esperado 33% cada uno en este escenario, o quizás 50% (C), 25% (A) y 25% (B). Sin Cembargo, el 66% que va no funciona, no importa cómo haga los cálculos.

En general, quiero entender cómo los procesos iniciados sin cgexecinteractuar con los procesos iniciados cgexeccuando se trata de compartir recursos (CPU en particular, pero se agradecería una respuesta más general si no es demasiado complejo).

Micah Zoltu
fuente
En primer lugar, me pregunto cómo se mide el porcentaje de uso de la CPU. ¿Cuáles son las prioridades que ejecuta A, B y C?
KWubbufetowicz
Creo que estaba midiendo el uso de la CPU topy creo que se iniciaron simplemente desde un símbolo del sistema: cgexec -g cpu:foo myprogramy ./myprogram. Ha pasado un tiempo, así que no recuerdo con certeza.
Micah Zoltu
¿Puede darse el caso de que myprogram use más de un solo hilo / proceso? Por cierto, ¿todavía estás interesado en resolver este problema?
KWubbufetowicz
El programa era una aplicación de prueba escrita solo para probar este comportamiento. Fue intencionalmente un solo subproceso para reducir los resultados. Todavía estoy interesado en una respuesta a esta pregunta.
Micah Zoltu
Esta página de RedHat puede ser de ayuda aquí. cpu.shareses una opción de configuración muy peculiar; Recomiendo dividir las cosas por CPU si es posible usando en su cpuset.cpuslugar.
Comodín

Respuestas:

3

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%.

Lazy404
fuente
Por lo tanto, cualquier proceso que no se inicie con cgexec está en el cgroup raíz con 1024 recursos compartidos, dividido equitativamente entre todos los elementos secundarios inmediatos. Uno de esos hijos inmediatos es el cgroup generado al llamar cgexec. Por lo tanto, el no cgexecproceso 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?
Micah Zoltu
Oh, creo que ya veo. Cualquier proceso en el SO iniciado sin cgexecobtener 1024 recursos compartidos Cualquier proceso iniciado con cgexecobtiene 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?
Micah Zoltu
En realidad, eso todavía no cuadra. 1024 + 512 + 512 = 2048. 512/2048 == 25%. No creo que esta respuesta sea correcta, al menos no en la superficie.
Micah Zoltu
¿Tienes otros cgroups? Puede afectar los números. También puede consultar documentos de redhat, hay un ejemplo similar access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/…
Lazy404
No se ejecutó nada más importante, la caja estaba inactiva antes y después de la ejecución de la prueba. Todos los ejemplos solo muestran lo que sucede cuando todos los procesos se inician con la configuración de cgroups. No discute lo que sucede cuando algunos procesos no usan cgroups, que es lo que estoy tratando de resolver.
Micah Zoltu