7 votos

¿Por qué cambia el número de núcleos de CPU disponibles cuando se cierra una aplicación?

Para encontrar el número de núcleos disponibles en Termux, ejecutas:

grep Cpus_allowed /proc/self/status

Este número de núcleos está limitado de manera similar a ejecutar taskset en GNU/Linux.

Estoy tratando de predecir qué retornará eso.

Según la aplicación CPU-Z, mi teléfono (Huawei Smart P) tiene 1 HiSilicon Kirin 659 con 8 núcleos. Según la aplicación CPU Info, 4 núcleos funcionan a la misma velocidad (480-1709Mhz) y 4 núcleos funcionan a la misma velocidad (1402-2362Mhz).

Después de encender el teléfono y esperar 5 minutos para asegurarme de que todas las tareas de inicio se han iniciado/completado, inicié Termux, inicié sesión a través de ssh y obtuve:

Cpus_allowed_list:       0-7

Que es exactamente lo que espero.

Pero si presiono la tecla de inicio, obtengo:

Cpus_allowed_list:      2-3

Pensé que esto podría tener que ver con la carga de los núcleos, así que volví a Termux, inicié 16 bzip2s. Esto no cambia el número de núcleos que obtengo inmediatamente. Pero después de 30 segundos obtengo 4 núcleos:

Cpus_allowed_list:     0-3

Y más tarde vuelvo a 2 núcleos:

Cpus_allowed_list:      2-3

Este comportamiento ocurre a través de ssh ya sea que Termux esté en primer plano o en segundo plano.

El efecto de la tecla de inicio solo ocurre al ejecutar Termux: Si ejecuto CPU Info, luego presiono inicio y luego inicio Termux, entonces Termux sigue teniendo 8 núcleos:

Cpus_allowed_list:       0-7

Solo cuando cambio de Termux usando la tecla de inicio, la tecla de la lista de aplicaciones, o la tecla de retroceso, cambia el número de CPUs.

El big.LITTLE controlado por software podría explicar el cambio de 8 a 4 núcleos si el límite no se aplicara inmediatamente después del arranque, sino activado más tarde. Dado que el límite no se activa 5 minutos después del arranque, creo que es seguro rechazar esto como explicación. Tampoco explica por qué se limita a 2 núcleos algunas veces al ejecutar 16 bzip2s.

¿Qué está causando que el teléfono me limite a usar 8 núcleos? ¿Cómo puedo decirle al teléfono que no lo haga? ¿Qué causa que el límite salte entre 2 y 4 núcleos en intervalos aparentemente aleatorios?

(Además de esto, esperaba que los núcleos funcionaran al 100% de velocidad, lo cual tampoco sucede).

La limitación no ocurre si no se ejecuta a través de ssh o si se ejecuta en una sesión de tmux donde la sesión de tmux se inicia a través de la terminal en el teléfono.

0 votos

La CPU es un Octa core con el concepto BIG-little. Por lo tanto, esta respuesta también se aplica a tu CPU.

0 votos

@Robert, ¿Si se trata de una CPU big.LITTLE, por qué obtengo 0-7 después de arrancar? Permanece así si no presiono inicio. top claramente muestra 8 CPUs funcionando al 100%. Además, eso no explicaría por qué a veces estoy limitado a solo 2 núcleos.

0 votos

Supongo que el dispositivo comienza sin asignaciones específicas de CPU. Esto también hace que el arranque sea lo más rápido posible. Posteriormente (quizás al inicio de un servicio especial), aplica la configuración de energía para limitar el consumo de energía. Los nuevos procesos comienzan con 2 núcleos y después de 30 segundos de alto uso de la CPU se permiten los 4 núcleos rápidos. Ten en cuenta que los teléfonos inteligentes están optimizados para la capacidad de respuesta de la interfaz de usuario, no para el rendimiento máximo de la CPU.

3voto

Jack Wade Puntos 231

¿Qué está causando que el teléfono me limite a usar 8 núcleos?

Linux Grupos de Control (cgroups). Android los utiliza para controlar cuántos recursos puede usar un proceso. En particular, los procesos de aplicaciones se asignan a diferentes cgroups dependiendo de su ciclo de vida, que suele depender de la interactividad de la aplicación con el usuario.

Por ejemplo, una aplicación que se está utilizando activamente en primer plano necesita más potencia de procesamiento que una que está inactiva en segundo plano. Por lo tanto, Android crea múltiples sub-cgroups descendientes para diferentes estados de los procesos de la aplicación (y no de la aplicación):

~# grep . /dev/cpuset/*/cpus
/dev/cpuset/background/cpus:0-1
/dev/cpuset/foreground/cpus:0-6
/dev/cpuset/restricted/cpus:0-3
/dev/cpuset/top-app/cpus:0-7

cpuset es uno de los múltiples tipos de cgroups que Android utiliza para diferentes propósitos.

Como puedes ver, las aplicaciones en segundo plano solo pueden utilizar 2 (de 8) CPUs, las que ejecutan un servicio en primer plano pueden utilizar 7 CPUs, mientras que las aplicaciones principales pueden utilizar todas las CPUs. El marco de Android cambia continuamente el PID de una aplicación entre estos sub-cgroups según la aplicación cambia de estado.

Nota que:

  • Los diferentes fabricantes pueden configurar los cgroups de manera diferente dependiendo del número de núcleos de CPU disponibles en el dispositivo.
  • La afinidad de la CPU de una tarea utilizando taskset se filtra solo a esas CPUs permitidas en el cpuset de esa tarea.

¿Cómo puedo decirle al teléfono que no lo haga?

La mejor manera sería modificar el código y reconstruir la ROM para que ya no use los cgroups (o los use como desees). O simplemente cambia los valores de la CPU en los archivos mostrados arriba, con la esperanza de que no se reviertan.

Pero para un usuario normal, esto haría más daño que bien, consumiendo más recursos y afectando gravemente el rendimiento del dispositivo.


Relacionado:

0 votos

u0_a164@localhost:~$ grep . /dev/cpuset/*/cpus da grep: /dev/cpuset/*/cpus: No se puede acceder al archivo o directorio

0 votos

@OleTange el sistema de archivos podría estar montado en otro lugar. Por ejemplo, en /sys/fs/cgroup. Verifica con mount | grep cgroup. También es posible que necesites privilegios de root o permissive SELinux para acceder al directorio.

-2voto

Sean Puntos 13

Resumen: cuantos más núcleos uses, más batería consumes, por lo que la conexión en caliente de la CPU apaga los otros núcleos, y los demás hacen el trabajo, lo que los lleva al 100% de uso de la CPU, lo que también brinda el mejor rendimiento y el más equilibrado.

Es la conexión en caliente de la CPU, enciende y apaga los núcleos cuando sea necesario o no.

Está corriendo al 100% de uso de la CPU porque es así. Imagina, hay 4 autos, y supongamos que los conductores son los núcleos. Tienes cuatro carriles y 4 autos, por supuesto. Cada uno de ellos llevará 100 pizzas. Puedes dejar que un núcleo haga todo el trabajo y eso es lo que hace la conexión en caliente. Sabiendo que un auto con 50 pizzas consume mucho menos combustible que un auto con 100 pizzas, ahora puedes ver cómo podemos tener el mismo rendimiento y ahorrar en combustible: carga dos autos con 50 pizzas y déjalos acelerar lo más rápido posible hacia el destino (gobernador de rendimiento). Llegarán tan rápido como un auto con 100 pizzas (mismo rendimiento), pero quemarán menos combustible (ahorro de batería).

Si deseas que tu teléfono funcione con 8 núcleos, entonces necesitas instalar un kernel personalizado, usar otro gobernador de CPU, utilizar una conexión en caliente de CPU personalizada, o sin instalar un kernel personalizado, utilizar un gobernador interactivo y luego ajustar sus parámetros. Puedes buscar en XDA para obtener configuraciones avanzadas del gobernador interactivo.

1 votos

Además, ¿qué crees que proporciona el "mejor rendimiento equilibrado" en una carga alta? Ciertamente no deshabilitar núcleos. Y 16 procesos bzip2 ciertamente necesitan más de 3 núcleos para un "buen rendimiento". Entonces, ¿podrías por favor explicar - y respaldar tu afirmación?

0 votos

Utiliza un gobernador interactivo y luego ajusta sus parámetros

0 votos

Es la forma en que el núcleo se enciende y apaga los núcleos según sea necesario. En el arranque, todos los núcleos están encendidos porque a veces el arranque de Android es lento, por lo que los desarrolladores intentan encender todos los núcleos para que arranque más rápido.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X