GNU Make использует только 4 потока, независимо от того, что --jobs - PullRequest
0 голосов
/ 06 февраля 2020

Независимо от того, какой аргумент --jobs я передаю, я всегда получаю 4 потока.

В течение make --jobs=1 target я вижу строки stdout, которые начинаются с make[1]:, make[2]:, make[3]: и make[4]:, когда я ожидаю только один поток.

Тот же результат, если я использую make --jobs=100 target, я получаю 4 потока вместо 100.

Я не уверен, что это является релевантным, но я запускаю make внутри docker контейнера, и docker имеет 7 доступных для меня локальных ядер.

>docker info
Operating System: Docker Desktop
 OSType: linux
 Architecture: x86_64
 CPUs: 7

и внутри Alpine Linux docker контейнера

>make --version
GNU Make 4.2.1
Built for x86_64-alpine-linux-musl

>grep -c ^processor /proc/cpuinfo
7

подтверждение того, что контейнер получает 7 ядер.

Могу ли я запустить что-нибудь, что поможет мне понять, почему make так себя ведет?

1 Ответ

5 голосов
/ 06 февраля 2020

Я думаю, что есть некоторая путаница: число после make не является номером нити. Make на самом деле не многопоточный, а однопоточный.

Это число - глубина рекурсивных процессов make, которые вызываются. Он всегда будет отображаться одинаково (с учетом тех же целей) независимо от того, насколько велико (или мало) ваше значение -j, поскольку оно представляет, сколько рекурсивных экземпляров make было вызвано.

То есть если у вас есть что-то вроде:

recurse:
        $(MAKE) ...

, то сообщения от экземпляра make верхнего уровня будут make, а сообщения от суб-make, вызванного рецептом recurse, будут make[1] и др. c.

...