Wczoraj próbowałem skompilować pakiet ROOT ze źródła. Ponieważ kompilowałem go na 6-rdzeniowej maszynie z potworami, postanowiłem zacząć budować za pomocą wielu rdzeni make -j 6
. Kompilacja przebiegła początkowo płynnie i naprawdę szybko, ale w pewnym momencie make
zawiesiła się przy użyciu 100% procesora tylko na jednym rdzeniu.
Zrobiłem trochę googlingu i znalazłem ten post na forach dyskusyjnych ROOT. Ponieważ sam zbudowałem ten komputer, martwiłem się, że nie zastosowałem prawidłowo radiatora, a procesor się przegrzał. Niestety nie mam tu w pracy lodówki, w której mogłabym ją włożyć. ;-)
Zainstalowałem lm-sensors
pakiet i uruchomiłem make -j 6
ponownie, tym razem monitorując temperaturę procesora. Chociaż stał się wysoki (blisko 60 ° C), nigdy nie przekroczył wysokiej lub krytycznej temperatury.
Próbowałem biegać, make -j 4
ale ponownie make
zawiesiłem się podczas kompilacji, tym razem w innym miejscu.
W końcu skompilowałem tylko działający make
i działało dobrze. Moje pytanie brzmi: dlaczego zwisało? Z uwagi na fakt, że zatrzymał się w dwóch różnych miejscach, sądzę, że było to spowodowane jakimś stanem wyścigowym, ale uważam, że make
powinno być wystarczająco sprytne, aby wszystko ułożyć we właściwej kolejności, ponieważ oferuje taką -j
opcję.
-j >1
.
$(shell ...)
ostatecznie uruchomiono polecenie, które czekało na dane wejściowestdin
. Stało się tak, gdy zmienna była pusta i do komendy nie przekazano argumentów pliku.
strace -p <pid>
I sprawdzić, czy możesz dowiedzieć się, na co on patrzy / na co. strace pokaże tylko wywołania systemowe (nie wywołania funkcji), ale nadal może dostarczyć cennych informacji, jeśli obraca się podczas przeglądania lub określonego pliku.