Существует ли система параллельного изготовления, которая является достаточно умной, чтобы разумно реагировать на условия нехватки памяти / замены - PullRequest
4 голосов
/ 10 апреля 2011

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

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

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

1 Ответ

0 голосов
/ 11 апреля 2011

Для 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.

Хотя я не думаю, что есть стандартная опция для этого.

...