Существует ли параллельная система make, которая достаточно умна, чтобы разумно реагировать на условия нехватки памяти / подкачки?

#makefile #ram #process-management

#makefile #ОЗУ #управление процессами

Вопрос:

Я большой поклонник ускорения моих сборок с использованием «make -j8» (замена 8 на любое количество ядер на моем текущем компьютере, конечно), и параллельная компиляция N файлов обычно очень эффективна для сокращения времени компиляции… если только некоторые процессы компиляции не потребляют достаточно памяти, чтобы на компьютере закончилась оперативная память, в этом случае все различные процессы компиляции начинают заменять друг друга, и все замедляется до обхода — таким образом, сводится на нет цель выполнения параллельной компиляции в первую очередь.

Теперь очевидным решением этой проблемы является «купить больше оперативной памяти» — но поскольку я слишком дешев для этого, мне приходит в голову, что должна быть возможность иметь реализацию ‘make’ (или эквивалент), которая отслеживает доступную системную оперативную память, и когда оперативная память опустится почти до нуля и система начнет подкачку, make автоматически включится и отправит SIGSTOP одному или нескольким процессам компиляции, которые она породила. Это позволило бы полностью заменить остановленные процессы, чтобы другие процессы могли завершить свою компиляцию без дальнейшей замены; затем, когда другие процессы завершатся и станет доступно больше оперативной памяти, процесс ‘make’ отправил бы SIGCONT приостановленным процессам, позволяя им возобновить свою собственную обработку. Таким образом, можно было бы избежать большей части подкачки, и я мог бы безопасно компилировать на всех ядрах.

Кто-нибудь знает о программе, которая реализует эту логику? Или, наоборот, есть ли какая-то веская причина, по которой такая программа не будет / не смогла бы работать?

Ответ №1:

Для GNU Make есть -l опция:

    -l [load], --load-average[=load]
        Specifies  that  no  new jobs (commands) should be started if there are others jobs running and the load average is at least load (a floating-
        point number).  With no argument, removes a previous load limit.
  

Я не думаю, что для этого есть стандартный вариант.