Ce que vous recherchez doit se trouver dans ce fichier virtuel :
/sys/devices/system/cpu/isolated
et l'inverse dans
/sys/devices/system/cpu/present // Thanks to John Zwinck
A partir du drivers/base/cpu.c
on voit que la source affichée est la variable 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 des démons, cron
, systemd
etc. Si cela se produit, de nouveaux processus seront générés en héritant du masque d'affinité modifié, et non de celui défini par isolcpus
.
Donc, ce qui précède vous donnera isolcpus
comme vous l'avez demandé, mais cela pourrait toujours ne pas être utile.
Supposons que vous découvriez que isolcpus
a é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
, pensant qu'il est en mode monoprocesseur par erreur, et essayant utilement de « réparer les choses » en réinitialisant le masque d'affinité. Si tel était le cas, vous pourriez essayer d'isoler les CPU 0-5 au lieu de 1-6, et voir si cela fonctionne.
L'un des moyens les plus simples 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 utiliserez :
$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é vers PID 1. Comme PID 1 est le PID standard pour la première tâche lancée par le noyau, nous pouvons considérer comme une assez bonne indication qu'il reflétera si nous avons isolcpus
travail. Comme dans :
$taskset -cp 1
pid 1's current affinity list: 0,1
En comparaison avec le lscpu
commande dans 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
ne montre que 0,1, donc cela montre isolcpus
travaille ici.
Consultez :Comment garantir la disponibilité exclusive du processeur pour un processus en cours d'exécution ?
Vous pouvez vérifier Cpus_allowed et Cpus_allowed_list pour le processus shell actuel pour voir quels processeurs ont été 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 processeurs