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 :)
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.
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,3
a é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?
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