GNU/Linux >> Znalost Linux >  >> Linux

Proč je úroveň Nice ignorována? (mezi různými relacemi přihlášení – respektováno, pokud je zahájeno ze stejné relace.)?

Když spustím dva procesy požírající CPU s různou úrovní nice, např.

Proces 1:

nice -19 sh -c 'while true; do :; done'

Proces 2:

sh -c 'while :; do true; done'

(Změnil jsem pořadí : a true stačí rozlišit procesy ve výstupech ps nebo top ),

zdá se, že úroveň nice je ignorována a obě využívají stejné množství CPU.

Výstup top je jako

  PID USER      PR  NI    VIRT    RES %CPU %MEM     TIME+ S COMMAND
 8187 <user>    39  19   21.9m   3.6m 45.8  0.0   0:20.62 R sh -c while true; do :; done
 8188 <user>    20   0   21.9m   3.5m 45.6  0.0   0:20.23 R sh -c while :; do true; done
 [...]

(samozřejmě %CPU -hodnoty se mírně liší vzorek od vzorku, ale v průměru se zdají být stejné).

top ukazuje, že oba procesy běží s různými pěknými hodnotami, ale přesto se zdá, že zabírají stejné množství času CPU.

Oba příkazy byly spuštěny stejným uživatelem z různých terminálů (oba jsou přihlašovací shelly).

Pokud jsou spouštěny ze stejného terminálu, chovají se podle očekávání:Lepší proces uvolňuje místo tomu nepříliš pěknému.

Jaký je důvod? Jak udělat hezkou práci globálně na celém stroji?

Na tom samém stroji to bylo před časem jiné, kde se zdálo, že se ctí pěkné hodnoty.

Jedná se o jeden procesor/jednojádrový stroj.

Pro informaci:

  • Jádro:Verze 4.4.5 (skladové jádro Arch Linuxu); uname -r :4.4.5-1-ARCH ,
  • /proc/cpuinfo je:

    processor       : 0
    vendor_id       : GenuineIntel
    cpu family      : 6
    model           : 23
    model name      : Intel(R) Core(TM)2 Solo CPU    U3500  @ 1.40GHz
    stepping        : 10
    microcode       : 0xa0c
    cpu MHz         : 1400.000
    cache size      : 3072 KB
    physical id     : 0
    siblings        : 1
    core id         : 0
    cpu cores       : 1
    apicid          : 0
    initial apicid  : 0
    fpu             : yes
    fpu_exception   : yes
    cpuid level     : 13
    wp              : yes
    flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts nopl aperfmperf pni dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 xsave lahf_lm dtherm tpr_shadow vnmi flexpriority
    bugs            :
    bogomips        : 2794.46
    clflush size    : 64
    cache_alignment : 64
    address sizes   : 36 bits physical, 48 bits virtual
    power management:
    

Přijatá odpověď:

Aha, není to funkce systemd-logind, kde každý uživatel získá svou vlastní cgroup. Myslím, že změna, která je zde zodpovědná, je starší; jsou jen zmateně podobné. (Hledal jsem „process group fair scheduling“ a myslel jsem si, že by to mohlo být něco založeného na „process group“ unixu, kterému nikdy moc nerozumím). Wikipedie:

Linuxové jádro obdrželo opravu pro CFS v listopadu 2010 pro jádro 2.6.38, díky kterému je plánovač spravedlivější pro použití na desktopech a pracovních stanicích.

Když úloha volá __proc_set_tty(), je zrušen odkaz na výchozí skupinu celého procesu, je vytvořena nová skupina úloh a proces je přesunut do nové skupiny úloh. Děti poté zdědí tuto skupinu úkolů a zvyšují její počet. Při ukončení je odkaz na aktuální skupinu úloh zrušen, když je vypuštěn poslední odkaz na každou strukturu signálu. Skupina úkolů je zničena, když je uvolněna poslední struktura signálu, která na ni odkazuje. V době výběru runqueue IFF úloha nemá přiřazení cgroup, použije se její aktuální autogroup.

Funkce je ve výchozím nastavení povolena při spouštění, pokud je vybrána možnost CONFIG_SCHED_AUTOGROUP, ale lze ji deaktivovat pomocí možnosti spouštění noautogroup a lze ji také zapnout/vypnout za chodu [přes /proc/sys/kernel/sched_autogroup_enabled :Zápis tam jej deaktivuje pro nově vytvořené úlohy zápisem 1 umožňuje.]

Primární problémy, které to řeší, se týkají vícejádrových systémů a systémů s více procesory (SMP), které zažívají zvýšenou dobu interaktivní odezvy při provádění jiných úloh, které v těchto úlohách využívají mnoho vláken. Jednoduchým vysvětlením je, že při kompilaci linuxového jádra nebo podobném procesu, jako je kódování videa, budete moci stále sledovat video, číst e-maily a provádět další typické činnosti na ploše bez závad nebo sekání. Proti tomuto tvrzení však existují námitky.


Linux
  1. Proč není Sigint propagován do podřízeného procesu, když je odeslán jeho nadřazenému procesu?

  2. Připojit k různým oknům v relaci?

  3. Začít proces na jiném Tty?

  1. Kdy je setsid() užitečné nebo proč potřebujeme seskupovat procesy v Linuxu?

  2. Je možné sdílet soubory mezi 2 různými operačními systémy na stejném počítači?

  3. Jak nainstaluji 2 různé verze javy na stejný stroj od EPEL

  1. Proč není CD program?

  2. Grep – Proč závorky ve vzoru Grep odstraňují proces Grep z výsledků PS?

  3. Proč je znak divoké karty * tak odlišný mezi příkazy Zip a Rm?