comment détecter si isolcpus est activé?

15

Comment détecter si isolcpus est activé et sur quels processeurs, 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-7sur un i7 à 6 cœurs, semble ne pas activer isolcpus au démarrage, et je voudrais savoir si c'est possible à partir de /proc/, /sysou tout interne du noyau qui peut être lu dans l'espace utilisateur, pour fournir un statut 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 le temps de disponibilité est si grand, qu'il dmesgn'y a plus d'affichage du 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 :)

netmonk
la source
1
Pouvez-vous utiliser pidstat -C isolcpus. pidstat fait partie du sysstatpaquet.
Timothy Pulliam
2
Peut être im idiot, mais je ne vois aucun lien entre pidstatet isolcpus. Pouvez-vous élaborer un peu plus?
netmonk
Vous dites que vous devez savoir sur quels processeurs la commande s'exécute. Je ne sais pas ce que isolcpusc'est, mais pidstatje peux vous dire sur quel processeur un processus s'exécute si vous passez le -C process_namedrapeau. Par exemple, pidstat -C topproduit ce qui suit. 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
2
Ok merci pour votre réponse. isolcpusest un paramètre du noyau qui oblige le planificateur à ne migrer aucun processus seul s'il est isolé. Par exemple, sur un serveur à 8 processeurs, isolcpus=1-7dans la ligne de commande du noyau, tous les processus générés par init et tout type de commande en shell seront exécutés uniquement sur CPU0. Pour exécuter une tâche sur un processeur isolé, vous devez le lancer avec tasksetpar exemple. Donc, en ce qui concerne ce que je demande, il semble que votre réponse soit hors sujet. Merci quand même d'avoir essayé de me répondre
netmonk
1
Quelque chose comme ça ne devrait vraiment pas être difficile ...
user997112

Réponses:

17

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.cnous voyons 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_mapc'est exactement ce qui est défini par kernel/sched/core.cau 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 avez observé, quelqu'un aurait pu modifier l'affinité des processus, y compris les démons donné naissance, cron, systemdet 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 ce isolcpusque vous avez demandé, mais cela pourrait ne pas être utile.

En supposant que vous découvriez qui isolcpusa été émis, mais n'a pas "pris", ce comportement indésirable pourrait être dérivé par un processus réalisant 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". à droite "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.

LSerni
la source
1
Testé sur Centos 7.x, notez que /sys/devices/system/cpu/possiblecela ne semble pas être le «reverse» selon la façon dont vous interprétez le «reverse». Par exemple, si .../cpu/isolatedrevient 2,4parce qu'ils avaient été isolés, .../cpu/possiblereviendrait 0-191.
bgura
1
Je pense que la plupart des gens voudraient /sys/devices/system/cpu/presentqui montre quels processeurs existent, plutôt que /sys/devices/system/cpu/possiblequels spectacles quels processeurs pourraient éventuellement exister (mais peuvent ne pas exister actuellement). Sur certains systèmes, ils sont les mêmes, mais même sur un bureau assez basique, j'ai vérifié, ils ne le sont pas.
John Zwinck
@JohnZwinck bonne capture. modification de la réponse
LSerni
1
Avec isolcpus = 0 et 4 cœurs, j'obtiens / isolated = 0 et / present = 0-3.
Stefan Reich
10

L'un des moyens les plus faciles de détecter si isolcpusconsulte est procde 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 a isolcpus=2,3été passé comme argument au noyau en cours d'exécution.

Vous pouvez également utiliser tasksetpointé vers le 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 isolcpustravaillé. Un péché:

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

Comparaison avec la lscpucommande 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, lscpuaffiche 4 CPU / cores, alors qu'il tasksetne montre que 0,1, donc cela montre que isolcpusça fonctionne ici.

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

Rui F Ribeiro
la source
Merci monsieur pour votre réponse, mais je ne l'accepterai pas. j'ai spécifié que la réponse parlant de la ligne de commande du noyau ne sera pas acceptée. je sais évidemment quelle /proc/cmdlineest la copie exacte du contenu du grub.conffichier. Ce n'est pas ce que j'ai demandé! Merci quand même !
netmonk
J'ai ajouté à la réponse.
Rui F Ribeiro
1
Qu'est-ce qui a déjà modifié l'affinité du processus avec l'ensemble de tâches? que se passe-t-il si quelqu'un définit l'affinité init pour cpu 0 uniquement, cela me donne-t-il des informations sur l'activation ou non d'isol cpu?
netmonk
1

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 isolcpussur un serveur 6 cpus

Valentin
la source
2
En fait non. Il montre quels CPU sont dans le masque d'affinité hérité par le processus shell actuel. Si c'était le cas, par exemple, sshet que l'on avait limité manuellement l'affinité du parent sshdau CPU 1, vous verriez toujours le CPU 1, qu'il isolcpusait "pris" ou non. La $$branche vous donne les valeurs héritées du processus, pas celles du système d'origine.
LSerni