web-dev-qa-db-fra.com

comment détecter si isolcpus est activé?

Comment détecter si isolcpus est activé et sur quels cpus, par exemple lorsque vous vous connectez pour la première fois sur un serveur. Conditions:

n'engendre aucun processus pour voir où il sera migré.

Le cas d'utilisation est que isolcpus=1-7 sur un i7 à 6 cœurs, semble ne pas activer isolcpus au démarrage, et je voudrais savoir si c'est possible à partir de /proc/, /sys ou tout interne du noyau qui peut être lu dans l'espace utilisateur, pour fournir un état clair d'activation d'isolcpus et quels processeurs sont concernés. Ou même lire le paramètre actif de l'ordonnanceur qui est le premier concerné par isolcpus.

Considérez que la disponibilité est si grande que dmesg n'affiche plus le journal de démarrage pour détecter toute erreur au démarrage. La réponse de base comme " regardez la ligne cmd du noyau " ne sera pas acceptée :)

15
netmonk

Ce que vous recherchez doit se trouver dans ce fichier virtuel:

/sys/devices/system/cpu/isolated

et l'inverse

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

De drivers/base/cpu.c on voit que la source affichée est la variable du noyau 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);

et cpu_isolated_map est exactement ce qui est défini par kernel/sched/core.c au démarrage:

/* 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;
}

Mais comme vous l'avez observé, quelqu'un aurait pu modifier l'affinité des processus, y compris ceux générés par les démons, cron, systemd et ainsi de suite. Si cela se produit, de nouveaux processus seront générés en héritant du masque d'affinité modifié, et non celui défini par isolcpus.

Donc, ce qui précède vous donnera isolcpus comme vous l'avez demandé, mais cela pourrait ne pas être utile.

En supposant que vous découvrez que isolcpus a été émis, mais n'a pas "pris", ce comportement indésirable pourrait être dérivé par un processus sachant qu'il n'est lié qu'à CPU=0, croyant qu'il est en mode monoprocesseur par erreur, et essayant utilement de "régler les choses" en réinitialisant le masque d'affinité. Si tel était le cas, vous pourriez essayer d'isoler le CPUS 0-5 au lieu de 1-6 et voir si cela se produit.

17
LSerni

L'un des moyens les plus faciles de détecter si isolcpus consulte proc pour voir quels paramètres ont été transmis au noyau lors de l'exécution.

Pour cela, vous utiliseriez:

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

Comme vous pouvez le voir, dans cet exemple particulier isolcpus=2,3a été passé en argument au noyau en cours d'exécution.

Vous pouvez également utiliser taskset pointé sur PID 1. Comme PID 1 est le PID standard pour la première tâche lancée par le noyau, nous pouvons prendre comme une assez bonne indication qu'il reflètera si nous avons isolcpus travail. Un péché:

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

Comparaison avec la commande lscpu sur le même serveur:

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

Comme on peut le voir, lscpu affiche 4 CPU/cœurs, tandis que taskset affiche seulement 0,1, donc cela montre que isolcpus fonctionne ici.

Jetez un œil à: Comment garantir la disponibilité exclusive du processeur pour un processus en cours?

10
Rui F Ribeiro

Vous pouvez vérifier Cpus_allowed et Cpus_allowed_list pour le processus Shell actuel pour voir quels cpus étaient réservés

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

par exemple

Cpus_allowed_list:      0-1, 3-5

signifie que le cpu = 2 a été réservé par isolcpus sur un serveur 6 cpus

1
valentin