Заметил следующее:
самая эффективная загрузка ЦПУ достигается не при MAKEOPTS=“-jN” (N - количество ядер + 1), а EMERGE_JOBS=“-jN” (при этом MAKEOPTS=“-j1”). Однако это тоже малоэффективно, когда в очереди зависящие друг от друга пакеты, которые не могут быть собраны одновременно.
Логично добавить -jN и в MAKEOPTS и EMERGE_JOBS, но тогда количество тяжёлых потоков будет равно квадрату кол-ва ядер, а это далеко за пределами формулы (cores_n + 1). Однако за счёт того, что и emerge, как и make, понимает --load-average, или -l, можно и в обе переменные засунуть -jN -lN
:
# Количество доступных ядер
CPU_CORES=4
BTHREADS=$(( CPU_CORES + 1 ))
# Количество пакетов для одновременной сборки.
EMERGE_JOBS="-j${BTHREADS} -l${BTHREADS}"
#------------------------------------
# Настройки компилятора
#------------------------------------
# Количество параллельных процессов, запускаемых при установке пакета.
MAKEOPTS="-j${BTHREADS} -l${BTHREADS}"
Тогда и получится настоящая масштабируемость. При резком изменении в потребности нагрузки (например пытаясь работать в вебе пока идут обновления или пересборка мира) максимальный отклик - не больше минуты (может и меньше). При недостатке нагрузки - новые процессы появятся довольно быстро, а при избытке достаточно только дождаться, пока текущие отработают.
Думаю, такую схему стоит добавлять по дефолту. Можно даже в отдельный сниппет в /etc/portage/make.conf/
.