jak wykryć, czy isolcpus jest aktywowany?

15

Jak wykryć, czy isolcpus jest aktywowany i na którym cpus, gdy na przykład łączysz się po raz pierwszy na serwerze. Warunki:

nie spawnuje żadnego procesu, aby zobaczyć, gdzie będzie migrowany.

Sprawa użycie jest to, że isolcpus=1-7na 6 rdzeni I7 zdaje się nie aktywować isolcpus w bagażniku, i chciałbym wiedzieć, jeśli jego możliwości z /proc/, /syslub jakieś wewnętrzne jądro, które mogą być odczytywane w przestrzeni użytkownika, aby zapewnić wyraźny status aktywacji isolcpus i których procesorów dotyczy. Lub nawet przeczytaj aktywne ustawienie harmonogramu, który jest pierwszym, którego dotyczy isolcpus.

Weź pod uwagę, że czas działania jest tak duży, że dmesgnie trzeba już wyświetlać dziennika rozruchu w celu wykrycia błędu podczas uruchamiania. Podstawowe odpowiedzi, takie jak „ spójrz na linię cmd jądra ” nie będą akceptowane :)

netmonk
źródło
1
Można użyć pidstat -C isolcpus. pidstat jest z sysstatpaczki.
Timothy Pulliam
2
Może jestem głupi, ale nie widzę żadnego związku między pidstati isolcpus. Czy możesz rozwinąć nieco więcej?
netmonk
Mówisz, że musisz wiedzieć, na jakich procesorach działa polecenie. Nie wiem, co isolcpusjest, ale pidstatmogę powiedzieć, na jakim procesorze działa proces, jeśli przekażesz -C process_nameflagę. Na przykład pidstat -C topprodukuje następujące. 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 dziękuję za odpowiedź. isolcpusjest parametrem jądra, który zmusza program planujący do samodzielnej migracji żadnego procesu, jeśli są one izolowane. Na przykład na serwerach o 8 procesorach, isolcpus=1-7w linii poleceń jądra, zmusi cały spawnowany proces do rozwidlenia przez init i wszelkie polecenia w powłoce, aby działały tylko na CPU0. Aby uruchomić zadanie na izolowanym procesorze, musisz na przykład uruchomić je tasksetza pomocą . Jeśli chodzi o to, o co pytam, wydaje się, że twoja odpowiedź jest nie na temat. W każdym razie dziękuję za próbę udzielenia odpowiedzi
netmonk
1
Coś takiego naprawdę nie powinno być trudne ...
user997112

Odpowiedzi:

17

To, czego szukasz, powinno znaleźć się w tym pliku wirtualnym:

/sys/devices/system/cpu/isolated

i odwrotnie

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

Od drivers/base/cpu.cwidzimy, że źródło wyświetlane jest zmienna 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);

i cpu_isolated_mapjest dokładnie tym, co ustawia się kernel/sched/core.cpodczas uruchamiania:

/* 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 zauważył ktoś mógł modyfikować powinowactwa procesów, w tym demona-te, zrodził cron, systemdi tak dalej. Jeśli tak się stanie, pojawią się nowe procesy dziedziczące zmodyfikowaną maskę powinowactwa, a nie tę ustawioną przez isolcpus.

Więc powyższe da ci isolcpuszgodnie z twoją prośbą, ale to może nie być pomocne.

Załóżmy, że dowiadujesz się, że isolcpuszostało wydane, ale nie zostało „odebrane”, to niechciane zachowanie może zostać wyprowadzone przez pewien proces, który zdaje sobie sprawę, że jest do tego zobowiązany CPU=0, wierząc, że jest w trybie monoprocesorowym przez pomyłkę, i pomocnie próbuje „ustawić rzeczy” w prawo ”poprzez zresetowanie maski koligacji. W takim przypadku możesz spróbować izolować CPUS 0-5 zamiast 1-6 i sprawdzić, czy tak się dzieje.

LSerni
źródło
1
Testowane na Centos 7.x, zauważ, że /sys/devices/system/cpu/possiblenie wydaje się być „odwrotnością” w zależności od tego, jak interpretujesz „odwrócenie”. Np. Jeśli .../cpu/isolatedpowróci, 2,4ponieważ zostały odizolowane, .../cpu/possiblewróci 0-191.
bgura
1
Myślę, że większość ludzi chciałaby /sys/devices/system/cpu/presentwiedzieć, które procesory istnieją, a /sys/devices/system/cpu/possiblektóre pokazują, które procesory mogłyby istnieć (ale obecnie mogą nie istnieć). W niektórych systemach są takie same, ale nawet na dość prostym pulpicie, które sprawdziłem, nie są.
John Zwinck,
@JohnZwinck good catch. zmieniająca odpowiedź
LSerni
1
Z isolcpus = 0 i 4 rdzeniami, otrzymuję / izoluję = 0 i / present = 0-3.
Stefan Reich
10

Jednym z łatwiejszych sposobów sprawdzenia, czy isolcpusjest procsprawdzenie, które parametry zostały przekazane do jądra w czasie wykonywania.

W tym celu użyłbyś:

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

Jak widać, w tym konkretnym przykładzie isolcpus=2,3został przekazany jako argument do działającego jądra.

Możesz także użyć tasksetwskazywanego na PID 1. Ponieważ PID 1 jest standardowym PID dla pierwszego zadania uruchamianego przez jądro, możemy uznać za całkiem dobrą wskazówkę, że będzie on odzwierciedlał, czy działamy isolcpus. Jak w:

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

Porównywanie z lscpupoleceniem na tym samym serwerze:

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

Jak widać, lscpupokazuje 4 procesory / rdzenie, podczas gdy tasksetpokazuje tylko 0,1, więc ten program isolcpusdziała tutaj.

Spójrz na: Jak zapewnić wyłączną dostępność procesora dla uruchomionego procesu?

Rui F. Ribeiro
źródło
Dziękuję panu za odpowiedź, ale nie zaakceptuję. podałem, że ta odpowiedź dotycząca wiersza poleceń jądra nie będzie akceptowana. oczywiście wiem, /proc/cmdlinektóra jest dokładną kopią zawartości grub.confpliku. Nie o to prosiłem! Mimo wszystko dziekuję !
netmonk
Dodałem do odpowiedzi.
Rui F Ribeiro,
1
Kim jest ktoś, kto wcześniej zmodyfikował powinowactwo procesora do zestawu zadań? co się stanie, jeśli ktoś ustawi powinowactwo inicjujące tylko na procesor 0, czy to daje mi jakąkolwiek informację o aktywacji czy nie izolacji procesora?
netmonk
1

Możesz sprawdzić Cpus_allowed i Cpus_allowed_list dla bieżącego procesu powłoki, aby zobaczyć, które cpus były zarezerwowane

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

na przykład

Cpus_allowed_list:      0-1, 3-5

oznacza, że ​​procesor = 2 został zarezerwowany przez isolcpusna serwerze 6 procesorów

walentyna
źródło
2
Właściwie nie. Pokazuje, które procesory są w masce powinowactwa odziedziczonej przez bieżący proces powłoki. Gdyby tak było, powiedzmy, sshi ktoś ręcznie ograniczył powinowactwo rodzica sshddo CPU 1, zobaczyłbyś zawsze CPU 1, niezależnie isolcpusod tego, czy „wziął”, czy nie. $$Oddział daje procesie odziedziczone wartości, a nie oryginalne systemowych.
LSerni