GNU/Linux >> Znalost Linux >  >> Linux

jak zjistit, zda je aktivován isolcpus?

To, co hledáte, by se mělo nacházet uvnitř tohoto virtuálního souboru:

/sys/devices/system/cpu/isolated

a naopak v

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

Od drivers/base/cpu.c vidíme, že zobrazený zdroj je proměnná jádra 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);

a cpu_isolated_map je přesně to, co nastavuje kernel/sched/core.c při spouštění:

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

Ale jak jste si všimli, někdo mohl upravit afinitu procesů, včetně procesů vytvořených démonem, cron , systemd a tak dále. Pokud k tomu dojde, vytvoří se nové procesy, které zdědí upravenou masku afinity, nikoli tu nastavenou isolcpus .

Výše uvedené vám tedy dá isolcpus jak jste požadovali, ale stále to nemusí být užitečné.

Předpokládejme, že zjistíte, že isolcpus byl vydán, ale „neprobral“, toto nežádoucí chování mohlo být odvozen nějakým procesem, který si uvědomí, že je vázán pouze na CPU=0 , v domnění, že je omylem v monoprocesorovém režimu, a užitečně se pokoušejí "uvést věci do pořádku" resetováním masky afinity. Pokud tomu tak bylo, můžete zkusit izolovat CPU 0-5 místo 1-6 a zjistit, zda to náhodou funguje.


Jeden ze snadnějších způsobů, jak zjistit, zda isolcpus konzultuje proc abyste viděli, které parametry byly předány jádru za běhu.

K tomu byste použili:

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

Jak můžete vidět, v tomto konkrétním příkladu isolcpus=2,3 byl předán jako argument běžícímu jádru.

Můžete také použít taskset ukázal na PID 1. Protože PID 1 je standardní PID pro první úlohu spuštěnou jádrem, můžeme považovat za docela dobrý náznak toho, že bude odrážet, zda máme isolcpus pracovní. Jako v:

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

Porovnání s lscpu příkaz na stejném serveru:

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

Jak je vidět, lscpu zobrazuje 4 CPU/jádra, zatímco taskset zobrazuje pouze 0,1, takže to ukazuje isolcpus zde pracuje.

Podívejte se na:Jak zajistit exkluzivní dostupnost CPU pro běžící proces?


Můžete zkontrolovat Cpus_allowed a Cpus_allowed_list pro aktuální proces shellu, abyste viděli, jaké procesory byly rezervovány

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

např.

Cpus_allowed_list:      0-1, 3-5

znamená, že cpu=2 bylo rezervováno isolcpus na serveru se 6 procesory


Linux
  1. Jak zjistit virtualizaci pomocí skriptu Sys::Detect::Virtualization Perl?

  2. Jak zjistit, zda je Shell řízen z Ssh?

  3. Jak zjistit únik paměti?

  1. Jak zjistit Bash>=4.0?

  2. Jak programově zjistit změnu IP adresy v Linuxu?

  3. Jak zobrazit úplnou absolutní cestu symbolického odkazu

  1. Jak zjistit spouštění programů na Linuxu?

  2. Jak zjistit a zjistit, že je program v mrtvém bodě?

  3. Jak zobrazit velikosti nainstalovaných balíčků pip?