¿Cómo detectar si isolcpus está activado?

15

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-7en un i7 de 6 núcleos, parece que no se activa isolcpus en el arranque, y me gustaría saber si es posible /proc/, /syso 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 dmesgya 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 " :)

netmonk
fuente
1
¿Se puede utilizar pidstat -C isolcpus. pidstat es del sysstatpaquete.
Timothy Pulliam el
2
Puede que sea tonto, pero no veo ningún vínculo entre pidstaty isolcpus. ¿Puedes elaborar un poco más?
netmonk
Dices que necesitas saber en qué CPU se ejecuta el comando. No sé qué isolcpuses, pero pidstatpuedo decirte en qué CPU se está ejecutando un proceso si pasas la -C process_namebandera. Por ejemplo pidstat -C topproduce 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
Timothy Pulliam el
2
Ok, gracias por tu respuesta. isolcpuses 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-7en 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 iniciarla tasksetpor ejemplo. Entonces, con respecto a lo que estoy preguntando, parece que su respuesta está fuera de tema. Gracias de todos modos por tratar de responderme
netmonk
1
Algo así realmente no debería ser difícil ...
user997112

Respuestas:

17

Lo que busca debe encontrarse dentro de este archivo virtual:

/sys/devices/system/cpu/isolated

y lo contrario en

/sys/devices/system/cpu/present    // Thanks to John Zwinck

De lo drivers/base/cpu.cque vemos es que la fuente que se muestra es la variable del núcleo cpu_isolated_map:

static ssize_t print_cpus_isolated(struct device *dev,
    n = scnprintf(buf, len, "%*pbl\n", cpumask_pr_args(cpu_isolated_map));
...
static DEVICE_ATTR(isolated, 0444, print_cpus_isolated, NULL);

y cpu_isolated_mapes exactamente lo que se establece kernel/sched/core.cen el arranque:

/* Setup the mask of cpus configured for isolated domains */
static int __init isolated_cpu_setup(char *str)
{
    int ret;

    alloc_bootmem_cpumask_var(&cpu_isolated_map);
    ret = cpulist_parse(str, cpu_isolated_map);
    if (ret) {
            pr_err("sched: Error, all isolcpus= values must be between 0 and %d\n", nr_cpu_ids);
            return 0;
    }
    return 1;
}

Pero como observó, alguien podría haber modificado la afinidad de los procesos, incluidos los engendrados por demonios cron, systemdy así sucesivamente. Si eso sucede, se generarán nuevos procesos heredando la máscara de afinidad modificada, no la establecida por isolcpus.

Entonces, lo anterior le dará lo isolcpusque solicitó, pero eso podría no ser útil.

Suponiendo que descubres que isolcpusse 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á obligado CPU=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.

LSerni
fuente
1
Probado en Centos 7.x, tenga en cuenta que /sys/devices/system/cpu/possibleno parece ser 'inverso' dependiendo de cómo interprete 'inverso'. Por ejemplo, si .../cpu/isolatedregresa 2,4porque habían sido aislados, .../cpu/possibleregresaría 0-191.
bgura
1
Creo que la mayoría de la gente querría /sys/devices/system/cpu/presentqué muestra qué CPU existen, en lugar de /sys/devices/system/cpu/possiblequé 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.
John Zwinck
@JohnZwinck buena captura. respuesta rectificativa
LSerni
1
Con isolcpus = 0 y 4 núcleos, obtengo / isolated = 0 y / present = 0-3.
Stefan Reich
10

Una de las formas más fáciles de detectar si isolcpuses consultar procpara ver qué parámetros se pasaron al núcleo en tiempo de ejecución.

Para eso, usarías:

$cat /proc/cmdline 
BOOT_IMAGE=/boot/vmlinuz-4.8.0-1-amd64 root=/dev/sda1 ro isolcpus=2,3 quiet

Como puede ver, en este ejemplo en particular isolcpus=2,3se pasó como argumento al núcleo en ejecución.

También puede usar el tasksetPID 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 estamos isolcpustrabajando. Como en:

$taskset -cp 1
pid 1's current affinity list: 0,1

Comparando con el lscpucomando en el mismo servidor:

$lscpu | grep CPU.s
CPU(s):                4
On-line CPU(s) list:   0-3
NUMA node0 CPU(s):     0-3

Como se puede ver, lscpumuestra 4 CPU / núcleos, mientras tasksetque solo muestra 0,1, por lo que esto muestra que isolcpusestá funcionando aquí.

Eche un vistazo a: ¿Cómo garantizar la disponibilidad exclusiva de la CPU para un proceso en ejecución?

Rui F Ribeiro
fuente
Gracias señor por su respuesta, pero no lo aceptaré. especifiqué que la respuesta que habla sobre la línea de comando del núcleo no será aceptada. Obviamente, sé /proc/cmdlinecuál es la copia exacta del contenido del grub.confarchivo. ¡Esto no es lo que pregunté! Gracias de todos modos !
netmonk
He agregado a la respuesta.
Rui F Ribeiro
1
¿Qué es alguien que modificó previamente la afinidad del proceso con el conjunto de tareas? ¿Qué pasa si alguien establece la afinidad init a cpu 0 solamente, me da alguna información sobre la activación o no de la CPU isol?
netmonk
1

Puede consultar Cpus_allowed y Cpus_allowed_list para ver el proceso actual del shell para ver qué cpus estaban reservados

cat /proc/$$/status|tail -6

por ej.

Cpus_allowed_list:      0-1, 3-5

significa que cpu = 2 estaba reservado isolcpusen un servidor de 6 cpus

valentin
fuente
2
En realidad no. Muestra qué CPU están en la máscara de afinidad heredada por el proceso de shell actual. Si lo fuera, digamos, sshy uno hubiera limitado manualmente la afinidad del padre sshda la CPU 1, vería siempre la CPU 1, ya sea que se isolcpushaya "tomado" o no. La $$rama le proporciona los valores heredados del proceso, no los valores originales del sistema.
LSerni el