Чому люди рекомендують варіант -j3 для виготовлення, коли є двоядерний процесор?


18

У Gentoo Linux можна встановити MAKEOPTSзмінну, /etc/portage/make.confщоб сказати, makeскільки завдань вона повинна виконуватися паралельно при складанні пакетів. Оскільки у мене двоядерний процесор, я наївно вирішив використовувати -j2варіант: по одній роботі на ядро, тому обом потрібно щось робити. "Проблема" полягає в тому, що існує багато посилань, які говорять користувачам, які мають двоядерний процесор, -j3замість цього встановити параметр. Деякі з них:

Наприклад, у посібнику Gentoo сказано:

Хороший вибір - кількість процесорів (або процесорних ядер) у вашій системі плюс один, але це керівництво не завжди є ідеальним.

Але що обґрунтовує правило "CPU + 1"? Чому зайва робота?

Сторінка man.conf (5) навіть говорить:

Запропоновані налаштування знаходяться між CPU + 1 та 2 * CPU + 1.

Я також читав розділ 5.4 (Паралельне виконання) на makeінформаційній сторінці та makeпоясненні для цієї сторінки -j, але здається, що відповіді там немає.



Відповіді:


13

Не існує простого правила, яке завжди працює. Люди можуть рекомендувати певну фігуру, оскільки вони експериментували з певною компіляцією на певній машині, і це було найкращим налаштуванням, або тому, що вони дотримувались певних міркувань, які можуть мати, а можуть і не мати певного відношення до реальності.

Якщо у вас є багато оперативної пам’яті, то обмежуючим фактором у довгій компіляції буде час процесора. Тоді одне завдання на центральний процесор, плюс одне очікуване завдання для тих випадкових блоків вводу-виводу - це гарне налаштування. Це робить його -j3для двоядерного процесора (а точніше, для машини з двома процесорами - якщо кожне ядро ​​буде гіперточеним, це було б 4 процесора -j5).

Якщо у вас дуже мало оперативної пам’яті, то обмежуючим фактором може бути те, що у вас не може бути багато одночасних завдань, інакше вони продовжуватимуть обмінюватися між собою. Наприклад, якщо ви не можете зручно помістити два екземпляри компілятора в пам'ять, це make -j2може бути вже повільніше, ніж make. Оскільки це залежить від того, скільки процесів компіляції ви можете помістити в оперативну пам’ять одночасно, немає можливості отримати загальну цифру.

Між ними може бути вигідніше мати більше робочих місць. Якщо кожен процес компіляції невеликий, але збірка в цілому стосується великої кількості даних, то диск-введення / вивід може бути фактором блокування. У цьому випадку вам потрібно відразу кілька завдань на центральний процесор, так що завжди є одна робота, яка використовує кожен процесор, а інші чекають вводу / виводу. Знову ж таки, це дуже залежить від роботи збірки та наявної оперативної пам’яті, тут про те, що доступно для кешу даних (є оптимум, після якого занадто багато завдань занадто забруднює кеш).


Я не знав, що якщо ядра процесора гіперточені, то кожне з них вважається двома. У будь-якому випадку, схоже, мій процесор не підтримує Hyper Threading.
Франческо Турко

Я прийняв цю відповідь. У будь-якому випадку я вирішив дотримуватися -j2своєї системи. Це тому , що я спробував виникають як gccі firefoxз установками від -j1до -j5(в цілому 10 команд виходять), і здається , що в той час -j2, безумовно , швидше , ніж -j1інші три налаштувань на одному рівні з -j2.
Франческо Турко

7

Я думаю, що це свого роду евристично - дозволяючи makeзапускати CPUs + 1процеси, це переконатися, що:

  1. не було б розриву між робочим процесом, який щойно закінчився, і робітником, який ще запущений, - дещо як черга черги попереднього заповнення.
  2. не буде занадто багато конкуруючих процесів, щоб привести помітні накладні витрати з попереднім заповненням черги запуску.

Але, знову ж таки, це евристично, і посібник з FreeBSD все ще рекомендує make -j4 для єдиного процесора.


5

Як правило, є причини почати працювати більше, ніж кількість ядер. Для компіляції C за допомогою gcc, якщо -pipe не визначена у параметрах gcc, вона виконує свої дії (попередня обробка, перший запуск, оптимізація та складання) послідовно, використовуючи тимчасові файли; -pipe змінює це, використовуючи труби між підпроцесами. (Додавання -pipe за замовчуванням, наприклад, для FreeBSD, але це не традиційно для Linux.) Отже, якщо у вас є 2 ядра і паралельно дозволяють 2 завдання, вони витратять деякий час на введення / виведення диска. Рекомендація щодо додавання 1 роботи, схоже, пов'язана з цією специфікою. Але щоб отримати остаточну відповідь, ви повинні знайти, хто і коли додав цю рекомендацію, і запитайте його :) або запитайте у списку розсилки Gentoo devels.


2

В основному, це число - це те, що автори називають здоровим глуздом. У кращому випадку це гарна здогадка. Наскільки я знаю, процес створення, який породжується, коли ви вводите make, вже підраховується, тож -j3ви можете закінчити основний процес очікування, тоді як два інших збираються.

Однак тоді, коли я використовував Gentoo, було правилом <#cpus>*2 + 1.

Все залежить від того, які ваші курячі стежки, чайні листя або чарівний кулька 8 розповідають про дисковий введення / вивід, який повинен відбутися, і планування вашого поточного ядра Linux. [почати основу цієї публікації] З мого особистого досвіду ( -jне специфічно для Gentoo), все між #cpus + 1 і #cpus * 2 +1 дає прекрасні результати [закінчуйте основу цієї публікації], і в середньому ви навряд чи відзначите будь-які відмінності. Процесори та ядра в ці дні непогані.

Але все це змінюється, коли: а) ви фактично використовуєте більше одного поля для компіляції (du'h) або b) розробляєте власний код

Більш високий -jатрибут швидше показує невідомі раніше залежності.

І на зауваження: не йдіть за кількістю ядер, а за кількістю одночасних потоків, які приймають процесори. (Hypertheading!)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.