Что ограничивает число активных работников в сборке Gradle? - PullRequest
1 голос
/ 05 апреля 2019

Я пытаюсь запустить тесты параллельно на моем ноутбуке, который имеет 4 физических и 8 логических процессоров.

➜  sysctl -n hw.ncpu
8
➜  sysctl hw.physicalcpu
hw.physicalcpu: 4

Это команда, которую я выполняю:

./gradlew remoteChromeTest -Pparallel=4 --continue --max-workers=8

Свойство parallel входит в maxParallelForks задачи Test.

Тем не менее, похоже, что Gradle одновременно занимает не более 4 рабочих (один из которых, по-видимому, резервируется).для самой сборки), что совпадает с количеством физических процессоров.

Вывод выглядит следующим образом:

> Task :remoteChromeTest
Running tests in parallel using 4 processes.
<============-> 92% EXECUTING [12s]
> :remoteChromeTest > 0 tests completed
> :remoteChromeTest > Executing test spec.Spec1
> IDLE
> :remoteChromeTest > Executing test spec.Spec2
> :remoteChromeTest > Executing test spec.Spec3

Итак, параллельно выполняются только 3 теста.

Что мне здесь не хватает?Документация предполагает, что это может быть запущено за пределы числа реальных процессоров.

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

1 Ответ

1 голос
/ 07 апреля 2019

- макс-работников не только для выполнения тестов, но и для параллельного выполнения проекта. Однако в этом примере вы ограничиваете параллелизм выполнения тестов до 4. Попробуйте установить maxParallelForks более 4, и вы увидите больше параллелизма при выполнении тестов. Но в любом случае оно будет ограничено минимумом между количеством тестов и --max-workers.

Вы также можете включить параллельное выполнение проекта, используя опцию - parallel . И снова параллелизм сборки, включая тестовый параллелизм, будет ограничен --max-workers:

subprojects {
    tasks.withType(Test) {
        maxParallelForks = 8
    }
}
gradle clean build --parallel --max-workers=6
...
<<===========--> 85% EXECUTING [15s]
>> :module-1:test > 4 tests completed
>> :module-2:test > 2 tests completed
>> :module-2:test > Executing test so.Module2Spec3
>> :module-2:test > Executing test so.Module2Spec1
>> :module-1:test > Executing test so.Module1Spec4
>> :module-1:test > Executing test so.Module1Spec2
>> :module-1:test > Executing test so.Module1Spec1
>> :module-1:test > Executing test so.Module1Spec3
gradle clean build --parallel --max-workers=12
...
<===========--> 85% EXECUTING [13s]
> :module-1:test > 0 tests completed
> :module-2:test > 0 tests completed
> :module-2:test > Executing test so.Module2Spec1
> :module-2:test > Executing test so.Module2Spec2
> :module-2:test > Executing test so.Module2Spec3
> :module-2:test > Executing test so.Module2Spec4
> :module-1:test > Executing test so.Module1Spec1
> :module-1:test > Executing test so.Module1Test2
> :module-1:test > Executing test so.Module1Spec4
> :module-1:test > Executing test so.Module1Test3
> :module-1:test > Executing test so.Module1Test1
> :module-1:test > Executing test so.Module1Spec3
> :module-1:test > Executing test so.Module1Spec2
> :module-1:test > Executing test so.Module1Test4
...