Cómo detectar si isolcpus está activado y en qué cpus, cuando, por ejemplo, se conecta por primera vez en un servidor. Condiciones:
no genera ningún proceso para ver dónde se migrará.
El caso de uso es que isolcpus=1-7
en un i7 de 6 núcleos, parece que no se activa isolcpus en el arranque, y me gustaría saber si es posible /proc/
, /sys
o cualquier parte interna del núcleo que se pueda leer en el espacio de usuario, para proporcionar un estado claro de activación de isolcpus y qué CPU están interesados. O incluso lea la configuración activa del planificador, que es el primero afectado por isolcpus.
Tenga en cuenta que el tiempo de actividad es tan grande que dmesg
ya no se muestra el registro de arranque para detectar ningún error al inicio. No se aceptarán respuestas básicas como " mirar la línea cmd del núcleo " :)
pidstat -C isolcpus
. pidstat es delsysstat
paquete.pidstat
yisolcpus
. ¿Puedes elaborar un poco más?isolcpus
es, peropidstat
puedo decirte en qué CPU se está ejecutando un proceso si pasas la-C process_name
bandera. Por ejemplopidstat -C top
produce lo siguiente.10:56:52 AM PID %usr %system %guest %CPU CPU Command 10:56:52 AM 3457 0.00 0.00 0.00 0.00 6 top
isolcpus
es un parámetro del núcleo que obliga al planificador a no migrar ningún proceso por sí mismo si están aislados. Por ejemplo, en un servidor de 8 cpu,isolcpus=1-7
en la línea de comandos del kernel, forzará que todos los procesos generados por init y cualquier tipo de comando en shell se ejecuten solo en CPU0. Para ejecutar una tarea en una CPU aislada, debe iniciarlataskset
por ejemplo. Entonces, con respecto a lo que estoy preguntando, parece que su respuesta está fuera de tema. Gracias de todos modos por tratar de respondermeRespuestas:
Lo que busca debe encontrarse dentro de este archivo virtual:
y lo contrario en
De lo
drivers/base/cpu.c
que vemos es que la fuente que se muestra es la variable del núcleocpu_isolated_map
:y
cpu_isolated_map
es exactamente lo que se establecekernel/sched/core.c
en el arranque:Pero como observó, alguien podría haber modificado la afinidad de los procesos, incluidos los engendrados por demonios
cron
,systemd
y así sucesivamente. Si eso sucede, se generarán nuevos procesos heredando la máscara de afinidad modificada, no la establecida porisolcpus
.Entonces, lo anterior le dará lo
isolcpus
que solicitó, pero eso podría no ser útil.Suponiendo que descubres que
isolcpus
se ha emitido, pero no se ha "tomado", este comportamiento no deseado podría derivarse de algún proceso al darse cuenta de que solo está obligadoCPU=0
, creyendo que está en modo monoprocesador por error, e intentando ayudar a "arreglar las cosas". derecha "restableciendo la máscara de afinidad. Si ese fuera el caso, podría intentar aislar CPUS 0-5 en lugar de 1-6, y ver si esto funciona.fuente
/sys/devices/system/cpu/possible
no parece ser 'inverso' dependiendo de cómo interprete 'inverso'. Por ejemplo, si.../cpu/isolated
regresa2,4
porque habían sido aislados,.../cpu/possible
regresaría0-191
./sys/devices/system/cpu/present
qué muestra qué CPU existen, en lugar de/sys/devices/system/cpu/possible
qué muestra qué CPU podrían existir (pero que pueden no existir actualmente). En algunos sistemas son iguales, pero incluso en un escritorio bastante básico que verifiqué, no lo son.Una de las formas más fáciles de detectar si
isolcpus
es consultarproc
para ver qué parámetros se pasaron al núcleo en tiempo de ejecución.Para eso, usarías:
Como puede ver, en este ejemplo en particular
isolcpus=2,3
se pasó como argumento al núcleo en ejecución.También puede usar el
taskset
PID señalado 1. Como PID 1 es el PID estándar para la primera tarea lanzada por el kernel, podemos tomar como una muy buena indicación de que reflejará si estamosisolcpus
trabajando. Como en:Comparando con el
lscpu
comando en el mismo servidor:Como se puede ver,
lscpu
muestra 4 CPU / núcleos, mientrastaskset
que solo muestra 0,1, por lo que esto muestra queisolcpus
está funcionando aquí.Eche un vistazo a: ¿Cómo garantizar la disponibilidad exclusiva de la CPU para un proceso en ejecución?
fuente
/proc/cmdline
cuál es la copia exacta del contenido delgrub.conf
archivo. ¡Esto no es lo que pregunté! Gracias de todos modos !Puede consultar Cpus_allowed y Cpus_allowed_list para ver el proceso actual del shell para ver qué cpus estaban reservados
por ej.
significa que cpu = 2 estaba reservado
isolcpus
en un servidor de 6 cpusfuente
ssh
y uno hubiera limitado manualmente la afinidad del padresshd
a la CPU 1, vería siempre la CPU 1, ya sea que seisolcpus
haya "tomado" o no. La$$
rama le proporciona los valores heredados del proceso, no los valores originales del sistema.