GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo detectar si isolcpus está activado?

Lo que busca debe encontrarse dentro de este archivo virtual:

/sys/devices/system/cpu/isolated

y al revés en

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

Desde drivers/base/cpu.c vemos que la fuente mostrada es la variable del kernel 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_map es exactamente lo que establece kernel/sched/core.c en 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 observaste, alguien podría haber modificado la afinidad de los procesos, incluidos los generados por demonios, cron , systemd y así. Si eso sucede, se generarán nuevos procesos que heredarán la máscara de afinidad modificada, no la establecida por isolcpus .

Así que lo anterior te dará isolcpus como lo solicitó, pero eso podría no ser útil.

Supongamos que descubres que isolcpus se ha emitido, pero no se ha "tomado", este comportamiento no deseado podría ser derivado por algún proceso que se dé cuenta de que está vinculado solo a CPU=0 , creyendo que está en modo monoprocesador por error e intentando ayudar a "arreglar las cosas" 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.


Una de las formas más fáciles de detectar si isolcpus está consultando proc para ver qué parámetros se pasaron al kernel 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 particular isolcpus=2,3 se pasó como argumento al kernel en ejecución.

También puedes usar taskset apuntó a PID 1. Como PID 1 es el PID estándar para la primera tarea lanzada por el kernel, podemos tomar como una buena indicación que reflejará si tenemos isolcpus laboral. Como en:

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

Comparando con el lscpu comando 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 puede verse, lscpu muestra 4 CPU/núcleos, mientras que taskset solo muestra 0,1, por lo que muestra isolcpus está trabajando aquí.

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


Puede verificar Cpus_allowed y Cpus_allowed_list para el proceso de shell actual para ver qué cpus se reservaron

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

por ejemplo

Cpus_allowed_list:      0-1, 3-5

significa que la cpu=2 fue reservada por isolcpus en un servidor de 6 CPU


Linux
  1. ¿Cómo detectar si el Shell está controlado desde Ssh?

  2. ¿Cómo detectar Bash> =4.0?

  3. ¿Cómo detectar el cambio de dirección IP mediante programación en Linux?

  4. ¿Cómo detectar y descubrir que un programa está en interbloqueo?

  5. ¿Cómo veo du en GB en lugar de MB en Linux?

Cómo ver las notificaciones de Android en el escritorio de Ubuntu

¿Huawei E173 en Ubuntu 12.04?

Cómo ver los usuarios registrados en Linux

Cómo detectar y administrar dispositivos en Linux

Cómo ver las estadísticas de cPanel

¿Cómo veo el documento de Python en Linux?