2

Когда я собираю материал, я обычно хочу сделать это быстро, поэтому на своей рабочей станции я выдаю

make -j16

И (gnu) make начинает компилировать с 16 ядрами. Однако, когда я вернулся на свой ноутбук, у меня там не было 16 ядер. Поэтому, когда я выполняю ту же команду, моя машина замерзает. Я не могу переключиться на альтернативные терминалы через CTRL+ALT+F1 и т.д., Но удаленный вход не будет успешным. CTRL+C, CTRL+4 ни один из них не будет рассматриваться. (Кстати: автоматическое уничтожение не удастся, например, автоматически из памяти). Мне нужно выключить компьютер. (Я использую Ubuntu 11.10 с ядром 3.0.x)

Одно из решений заключается в том, чтобы заранее получить количество ядер, доступных на текущем компьютере, с небольшой целью make, от которой зависят любые другие "параллельные" цели, и напрямую не использовать «make -j $ NUMCORES». (Я уже сделал это и реализовал с помощью небольшой программы на C ++, использующей потоки повышения). Но это не защитит меня от случайного указания «make -j16» снова.

Кроме того, "слишком много" ядер не должно быть таким же количеством ядер (включая многопоточное ядро), которое доступно, поскольку потоки +1 или +2 все равно не убьют машину.

Могу ли я использовать ulimits для смягчения проблемы? Я думал об указании установить swap-space на 0. Тогда я должен внести изменения в прерывание, я думаю.

1 ответ1

5

Вам не нужно писать никаких специальных Make-файлов для определения количества ядер; флаги по умолчанию могут быть указаны в окружении, а Linux coreutils поставляется с инструментом под названием nproc:

export MAKEFLAGS="-j$(nproc)"

Если nproc не существует в вашей системе, альтернативой (также только для Linux) является getconf:

export MAKEFLAGS="-j$(getconf _NPROCESSORS_ONLN)"

Частичная защита от полного зависания может быть выполнена путем запуска make (вместе со всем процессом сборки) с низким приоритетом CPU и IO:

alias make="nice ionice make"

Однако обратите внимание, что это замедлит компиляцию, если другие процессы одновременно используют дисковый ввод-вывод или центральный процессор.


Вы также можете написать скрипт-обертку (или функцию оболочки), которая проверяет все аргументы, переданные ему:

make() {
    local arg
    for arg; do
        [[ $arg == -j* ]] && {
            echo "Rejecting '$arg' in make args. Use 'command make ...' to bypass."
            return 1
        }
    done
    command make "$@"
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .