Všechny procesy jen na jednom CPU jádře z osmi

Při testovací zátěži serveru (sto requestů paralelně na Apache a PHP-FPM) jsem zjistil, žehtop ukazuje zátěž pouze na jednom jádře CPU z osmi.

Zkusil jsem poté přímo na serveru pustit několik procesů, každý na jednom jádře, ale výsledek stejný - vše htop i top ukazovaly pouze na prvním jádře

taskset --cpu-list 0 sha512sum /dev/urandom &
taskset --cpu-list 1 sha512sum /dev/urandom &
taskset --cpu-list 2 sha512sum /dev/urandom &
taskset --cpu-list 3 sha512sum /dev/urandom &

pro jistotu jsem si to samé pouštěl lokálně, ale tam se procesy pouštěly poslušně každý v daném jádře.

Je to chybka v upraveném VPSfree Linux jádře a ve skutečnosti procesy vytěžují všechna CPU jádra? Nebo opravdu moje VPS ignoruje sedm jader?

Díky za pomoc.

edit: Naše VPS jede na node23.prg kde je kernel 6.6.13, ve VPS máme Ubuntu 22.04.4 LTS (GNU/Linux 6.6.13 x86_64)

Myslím, že se jedná o chybu v jádře. Na node22(kernel 6.6.1) mi to reportuje vytížení i jiných jader(je jedno jaký jádro nastavím tak to začiná na jádře 0 a na playground(6.6.10) to ukazuje vytížení jen jednoho(v top i třeba 3000%).
Někdo kdo o tom ví víc se určitě ozve. :slight_smile:
Podle mě to je nějaká větší chybka(která se nese už delší dobu, jen s posledníma verzema to je ještě horší) a reportuje to špatný jádra (na tom starším jádře) který jsou vytížený.
V KVM který má vlastní jádro to reportuje dobře.
použil jsem toto pro testování

taskset --cpu-list 3 sha512sum /dev/urandom
taskset --cpu-list 4 sha512sum /dev/urandom
taskset --cpu-list 5 sha512sum /dev/urandom

Zde je jak to vypadá na PLAYGROUND


Zde je jak to vypadá na VPS
vps
Zde je jak to vypadá na KVM

Díky.

Zkoušel jsem teď ještě nmon a ten ukazuje zátěž na všech jádrech.

Zřejmě jde o nějakou kombinaci kernelu a (h)top sbírání statistik.

Moje hlavní obava, že VPS používá jen jedno jádro CPU, se nenaplnila, takže jsem spokojený.

Taskset hlavne na nasem kernelu nema vubec zadny efekt, proces si bude vesele cestovat mezi jadry dal. U nas neni zadna moznost pinovat procesy nikam, je to tak naschval, protoze je to sdilena masina, nikdo nema zadna dedikovana jadra a pinning tak muze akorat prinest problemy, ale nic pozitivniho.

1 Like

Na ten bug se podivam (btw je to mensi! chyba! :smiley: - kotatka to nezere, vsiml si toho nekdo az po hm, pul roce v produkci, minimalne, cili se to netyka vsech, jenom kdyz se snazi nekdo delat takovyhle chytrystiky, co na sdilenych masinach nedavaji smysl tak, jako tak :D)

Jeste dodam, ze je to tak hlavne proto, ze ten pinning (treba, ale ne jenom) Java dela automaticky a tak vsechny javy na celem stroji byly pinned na prvnich 8mi jadrech a zbytek o JVM neslysel, to byl primarni duvod, proc jsme cpu pinning modifikovali tak, ze nic nedela. Jadro si zapamatuje cpu masku, ktera byla procesu nastavena a tu pak na vyzadani vraci zpatky, ale treba v /proc/pid/stat to cislo jadra, kde proces bezel naposled, virtualizovane neni. I v tom topu, kdyz se prida kolonka na posledni CPU jadro, je to pak videt, ze jich ten proces navstivi o dost vic, nez co ma pinned.

To virtualizovani spotrebovaneho casu je docela netrivialni zalezitost, zrejme mi tam unikl nejaky edge-case, co se poji prave s tim pinovanim. Cili diky za report, tohle by mi melo uplne stacit, abych prisel na to, cim to je. My to sice v jadre mame uz nejakou dobu, ale jelikoz to v prvnim levelu namespaces/cgroups krylo LXCFS, bylo to videt az v dalsich (Dockerech a jinych vnorenych kontejnerech), kde si toho asi moc lidi nevsimlo.

To virtualizovani statistiky zatizeni CPU ted funguje tak, ze v momente, kdy se userspace proces dotaze na vyuziti CPU pres /proc/stat, se vezmou statistiky z cpuacct cgroupy, ktera je korenova pro to VPS, spocte se vsechen vyuzity cas a pak se podeli casem od posledniho vycitani, cim dostaneme cislo, ktere vyjadruje, za kolik plne obsazenych CPU jader na tu danou periodu to bylo casu. Potom se jde po tech virtualnich jadrech od nuly a pripocitava se jim ten vyuzity cas rozdeleny v pomeru %usr a %sys, v kterem to bylo podle cpuacct cgroup spotrebovane, az se dojde k poslednimu jadru, kteremu se pripocita zbytek.

Ze se pripocte nejak hodne k prvnimu jadru musi znamenat, ze jsem tam budto ted nekdy zanesl nejakou zmenu, ktera mi zbourala predchozi predpoklady, nebo je tam jeste nejaky faktor, o kterem zatim nevim. Dosnidam a podivam se na to.

LOL a misto toho resim corrupted zpool na develu, nekdo rozbil zfs_rename funkci v upstreamu :smiley:

chybu uz jsem nasel, mam opravu, ted budu resit, jak ji aplikovat na bezici masiny

tak uz jsem dobojoval i s rozbitym live-patchingem, oprava uz je loaded na stagingu a playgroundu; muzete prosim mrknout, jestli je to vyresene?

Teď jsem to zkusil na playground a už to ukazuje vytížení i jiných jader.

1 Like

Strelil jsem se do nohy sam, no… v predchozich verzich toho CPU-schovavajiciho patche jsem zmenil semantiku fake_cpumask tak, ze jsem znemoznil pouziti na zjisteni nastavene affinity masky zpatky; tak jsem to ted splitnul, aby bylo jasne, co ktera z nich dela, fake_online_cpumask dava jadra 0 az N podle cpulimitu, fake_affinity_cpumask vraci masku nastavenou pres sched_setaffinity().

Taky jsem poznal live-patching o kus detailneji, uz si ta nase kpatch-build-based masinerie ve vpsAdminOS poradi s __init sekcemi tak, ze nevyErroruje, ale proste to preskoci (tenhle patch treba by bylo potreba zasadne prekopat, aby nezasahnul do zadnych funkci marked jako __init).