GNU/Linux >> Znalost Linux >  >> Linux

Co by mohlo způsobit zasekávání make při kompilaci na více jádrech?

Na tento konkrétní problém nemám odpověď, ale mohu se pokusit vám napovědět, co se může stát:Chybějící závislosti v Makefiles.

Příklad:

target: a.bytecode b.bytecode
    link a.bytecode b.bytecode -o target

a.bytecode: a.source
    compile a.source -o a.bytecode

b.bytecode: b.source
    compile b.source a.bytecode -o a.bytecode

Pokud zavoláte make target vše se zkompiluje správně. Kompilace a.source se provádí (libovolně, ale deterministicky) jako první. Poté kompilace b.source se provádí.

Ale pokud make -j2 target oba compile příkazy budou spouštěny paralelně. A skutečně si všimnete, že závislosti vašeho Makefile jsou přerušené. Druhá kompilace předpokládá a.bytecode je již zkompilován, ale nezobrazuje se v závislostech. Je tedy pravděpodobné, že dojde k chybě. Správný řádek závislosti pro b.bytecode by mělo být:

b.bytecode: b.source a.bytecode

Abych se vrátil k vašemu problému, pokud nemáte štěstí, je možné, že příkaz zasekne ve 100% smyčce CPU kvůli chybějící závislosti. To se zde pravděpodobně děje, chybějící závislost nemohla být odhalena sekvenčním sestavením, ale byla odhalena vaším paralelním sestavením.


Nevím, jak dlouho máte stroj, ale moje první doporučení by bylo zkusit test paměti a ověřit, zda paměť funguje správně. Vím, že problém často není v paměti, ale pokud ano, je nejlepší ji nejprve odstranit jako příčinu, než se pokusíte vysledovat další pravděpodobné problémy.


Uvědomuji si, že je to opravdu stará otázka, ale stále se objevuje v horní části výsledků vyhledávání, takže zde je moje řešení:

GNU make má mechanismus jobserveru, který zajišťuje, že make a její rekurzivní potomci nespotřebovávají více jader, než je specifikovaný počet:http://make.mad-scientist.net/papers/jobserver-implementation/

Spoléhá na kanál sdílený všemi procesy. Každý proces, který chce rozdělit další děti, musí nejprve spotřebovat žetony z potrubí a poté je po dokončení vzdát. Pokud podřízený proces nevrátí tokeny, které spotřeboval, make-up nejvyšší úrovně zůstane navždy viset a čeká na jejich vrácení.

https://bugzilla.redhat.com/show_bug.cgi?id=654822

Na tuto chybu jsem narazil při sestavování binutilů pomocí GNU make na mém Solaris boxu, kde "sed" není GNU sed. Pohrávání si s PATH, aby sed==gsed měl přednost před systémovým sed, problém vyřešil. Nevím, proč sed spotřebovával žetony z potrubí.


Linux
  1. Linux – co dělat, když linuxová plocha zamrzne?

  2. Co používám na linuxu k vytvoření spustitelného programu python

  3. Jaký je správný způsob, jak zajistit, aby se moje aplikace PyQt ukončila při zabití z konzoly (Ctrl-C)?

  1. Co se stane, když se vlákno rozvětvuje?

  2. Co způsobuje všechny tyto řádky deklarovat -x ..., když otevřu terminál?

  3. Co dělat, když Ctrl + C nemůže zabít proces?

  1. Co se přesně stane, když spustím soubor v prostředí Shell?

  2. Jakou nejjednodušší desku s podporou Linuxu bych si mohl doma vyrobit?

  3. Co by mohlo způsobit „chybu smyslů“ při nastavování šifrování LTO?