Відповіді:
nproc
дає кількість наявних процесорних ядер / потоків, наприклад 8 на чотирьохядерному процесорі, що підтримує двосторонній SMT.
Кількість завдань, які можна виконувати паралельно з make
використанням -j
опції, залежить від ряду факторів:
make
завданнямmake
роботи, яка пов'язана з I / O або CPUmake -j$(nproc)
це гідне місце для початку, але зазвичай ви можете використовувати більш високі значення, доки ви не вичерпаєте наявну пам'ять і не почнете молотити.
Для дійсно швидких збірок, якщо у вас є достатня кількість пам’яті, я рекомендую використовувати A tmpfs
, таким чином більшість завдань буде пов'язана з процесором і make -j$(nproc)
працюватиме якомога швидше.
tmpfs
, чи обмежуватимуся я розміром каталогу, який завжди менший за розмір фізичної оперативної пам’яті?
time
дзвінок. Очистіть результати, повторіть промивання повтором - і закінчіть сортування значень часу / j.
На жаль, навіть різні частини однієї збірки можуть бути оптимальними при суперечливих значеннях j-коефіцієнта, залежно від того, що будується, як, який із системних ресурсів є вузьким місцем на той час, що ще відбувається на машині збирання, що відбувається в мережа (якщо використовується техніка розподіленої збірки), стан / розташування / продуктивність багатьох систем кешування, що беруть участь у складанні тощо.
Складання 100 крихітних файлів C може бути швидшим, ніж компіляція одного величезного файлу або навпаки. Створення невеликого високосмугового коду може бути повільніше, ніж створення величезної кількості прямого / лінійного коду.
Навіть контекст побудови має значення - використання aj-фактора, оптимізованого для побудови на спеціалізованих серверах, які точно налаштовані на ексклюзивні, неперекриваються збірки, можуть дати дуже неприємні результати при використанні розробниками, що будують паралельно на одному спільному сервері (кожна така збірка може зайняти більше час, ніж усі вони поєднуються, якщо вони серіалізовані) або на серверах з різною конфігурацією апаратних засобів або віртуалізованими.
Існує також аспект правильності специфікації збірки. Дуже складні побудови можуть мати умови перегонів, що спричиняють періодичні збої в збірці зі швидкістю виникнення, які можуть дико змінюватися зі збільшенням або зменшенням j-фактора.
Я можу продовжувати і продовжувати. Справа в тому, що ви повинні фактично оцінити свою збірку в самому контексті, для якого ви хочете оптимізувати j-фактор. @Jeff Schaller застосовується: повторіть, поки ви не знайдете найкращу форму. Особисто я б почав із значення nproc, спробуйте вгору спочатку та вниз, лише якщо спроби вгору показують негайну деградацію.
Можливо, буде гарною ідеєю спочатку виміряти кілька однакових складових у нібито однакових контекстах, просто щоб отримати уявлення про мінливість ваших вимірювань - якщо занадто висока, це може поставити під загрозу всі ваші зусилля з оптимізації (20-відсоткова змінність повністю затьмарить 10% покращення / деградаційне зчитування в пошуку j-фактора).
Нарешті, IMHO краще використовувати сервер (адаптивний) сервіс, якщо він підтримується і доступний замість фіксованого j-фактора - він стабільно забезпечує кращу ефективність збірки у широких межах.
-j
параметра? напр.make -j
make -j
породить стільки робочих місць, скільки дозволяють залежності, як бомби вилки ( superuser.com/questions/927836/… ); збірка буде сканувати в кращому випадку витрачаючи більшість процесорів на управління процесами, ніж їх запуск ( superuser.com/questions/934685/… ), а в дуже паралельних побудовах у системи не вистачить пам’яті / swap або pid #s, і збірка не вдасться .
Найбільш прямолінійний спосіб - це nproc
так:
make -j`nproc`
Команда nproc
поверне кількість ядер на вашій машині. Загорнувши його в галочки, nproc
команда спочатку виконає, поверне число, і це число буде передано в make
.
У вас може виникнути деякий анекдотичний досвід, коли виконання підрахунку ядра + 1 прискорює час компіляції. Це більше пов'язане з такими факторами, як затримка вводу-виводу, інші затримки ресурсів та інші наявні обмеження ресурсів.
Для цього nproc+1
спробуйте:
make -j$((`nproc`+1))
Якщо ви хочете написати make
команду для використання стільки паралельних працівників, скільки у вас віртуальних процесорів, пропоную використовувати:
nproc | xargs -I % make -j%
Яка може бути записана як окрема команда, або як RUN
директива всередині Dockerfile
(оскільки Docker не підтримує вкладені команди)
ccache
для подальшого відновлення, але це OT