Вчера я пытался скомпилировать пакет ROOT из исходного кода. Поскольку я собирал его на 6-ядерном компьютере-монстре, я решил пойти дальше и собрать с использованием нескольких ядер make -j 6
. Поначалу компиляция прошла гладко и очень быстро, но в какой-то момент make
зависала, используя 100% CPU только на одном ядре.
Я немного погуглил и нашел этот пост на досках объявлений ROOT. Поскольку я сам собрал этот компьютер, я беспокоился, что неправильно применил радиатор, а процессор перегрелся или что-то в этом роде. К сожалению, у меня нет холодильника на работе, чтобы я мог его вставить. ;-)
Я установил lm-sensors
пакет и make -j 6
снова запустил , на этот раз следя за температурой процессора. Несмотря на то, что он достиг высокой температуры (около 60 ° С), он никогда не превышал высокую или критическую температуру.
Я попытался запустить, make -j 4
но снова make
завис во время компиляции, на этот раз в другом месте.
В итоге я скомпилировал только что запущенный make
и все заработало нормально. Мой вопрос: почему он завис? Из-за того, что он остановился в двух разных точках, я бы предположил, что это было из-за какого-то состояния гонки, но я думаю, что он make
должен быть достаточно умным, чтобы все расставить в правильном порядке, поскольку он предлагает такую -j
возможность.
-j >1
.
$(shell ...)
конечном счете, выполнялась команда, которая ожидала ввода отstdin
. Это было вызвано тем, что переменная была пустой, и никакие аргументы файла не были переданы команде.
strace -p <pid>
и посмотреть, сможете ли вы узнать, на что он смотрит. strace покажет вам только системные вызовы (не вызовы функций), но он все равно может дать вам ценную информацию, если он вращается при просмотре или для определенного файла.