#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.
Я не думаю, что для этого есть стандартный вариант.