GNU/Linux >> Znalost Linux >  >> Linux

Linux – Selhání nastavení afinity k běžícímu procesu se sadou úloh?

Snažím se omezit proces na daný počet jader CPU. Podle manuálové stránky sady úloh a této dokumentace by mělo fungovat následující:

[[email protected] ~]$ taskset -pc 0 <PID>
pid 24395's current affinity list: 0-3
pid 24395's new affinity list: 0

Jednoduše řečeno – tohle nefunguje. Zatížení procesu a sledování top , sedí kolem 350% využití CPU (stejně jako bez sady úloh). Mělo by to být maximálně 100 %.

Mohu správně nastavit afinitu pomocí taskset -c 0 <cmd to start process> v době spawnování procesu. Pomocí cpulimit -p <PID> -l 99 taky docela funguje. V obou případech bude mít proces stejné zatížení za následek maximální využití procesoru na 100 %.

Co se tu děje?

Přijatá odpověď:

Aktualizace:Novější verze sady úloh mají -a /--all-tasks možnost, která „funguje na všech úlohách (vláknech) pro daný pid“ a měla by vyřešit chování, které ukazuji níže.

Napsal jsem skript v Pythonu, který jednoduše roztáčí některá vlákna a vypaluje cykly CPU. Cílem je otestovat sadu úloh proti ní, protože je to docela jednoduché.

#!/usr/bin/env python

import threading

def cycle_burner():
    while True:
        meh = 84908230489 % 323422

for i in range(3):
    thread = threading.Thread(target=cycle_burner)
    print "Starting a thread"
    thread.start()

Pouhé spuštění skriptu Python spotřebuje asi 150 % CPU.

[~/cbench]$ ./burn_cycles.py
Starting a thread
Starting a thread
Starting a thread

Spuštění mého skriptu Python se sadou úloh funguje podle očekávání. Sledování nahoře ukazuje proces Pythonu zafixovaný na 100% využití.

[~/cbench]$ taskset -c 0 ./burn_cycles.py
Starting a thread
Starting a thread
Starting a thread

Zajímavé je, že spuštění skriptu Python a následné okamžité použití taskset k nastavení afinity právě spuštěného procesu omezuje proces na 100 %. Z výstupu si všimněte, že plánovač Linuxu dokončil provádění příkazů Bash před vytvořením vláken Pythonu. Proces Pythonu byl tedy spuštěn, pak byl nastaven tak, aby běžel na CPU 0, pak vytvořil svá vlákna, která zdědila správnou afinitu.

[~/cbench]$ ./burn_cycles.py &; taskset -pc 0 `pgrep python`
[1] 8561
pid 8561's current affinity list: 0-3
pid 8561's new affinity list: 0
Starting a thread
[~/cbench]$ Starting a thread
Starting a thread

Tento výsledek je v kontrastu s touto metodou, která je úplně stejná, ale umožňuje vláknům Pythonu vytvořit se před nastavením afinity procesu Python. To replikuje výsledky „sada úkolů nedělá nic“, které jsem popsal výše.

[~/cbench]$ ./burn_cycles.py &
[1] 8996
[~/cbench]$ Starting a thread
Starting a thread
Starting a thread
[~/cbench]$ taskset -pc 0 `pgrep python`
pid 8996's current affinity list: 0-3
pid 8996's new affinity list: 0

Co se tu děje?

Vlákna vytvořená před změnou afinity nadřazeného procesu zřejmě nedědí afinitu svého nadřízeného. Pokud by někdo mohl upravit odkaz na dokumentaci, která to vysvětluje, bylo by to užitečné.

Související:přidání textu do souboru před rozšířením?
Linux
  1. Linux – Jak nastavit afinitu procesoru k procesu v Linuxu?

  2. Zpracování signálu s více vlákny v Linuxu

  3. Proč spouštět příkaz prostředí Linux s '&'?

  1. Jak zabít proces běžící na konkrétním portu v Linuxu?

  2. Nastavení subdomény s Apache na Linuxu

  3. Jak mohu nastavit afinitu procesoru k procesu v systému Linux?

  1. Jak restartovat (nebo resetovat) běžící proces v Linuxu?

  2. Nastavení afinity běžícího procesu se sadou úloh se nezdaří

  3. Proces běžící na pozadí byl v linuxu zabit