Почему несколько процессов начинают мешать друг другу на многоядерном процессоре (28 ядер)?
Есть в распоряжении jenkins на мощной тачке (28 ядер/56 логических процессора, 128Gb оперативы, hdd-диски)
В нём гоняются тесты rails-приложения.
Одна сборка запускает 12 паралелльных поток для прогона тестов. Проц при этом загружается на 25%. Памяти уходит 10Gb. Сборка выполняется за ~6 минут. Утилизация дисков вырастает только при сборке docker-образов (~30сек от общего времени сборки), а во время запуска тестов - минимальная.
И тут возникает непонятная ситуация. Казалось бы, что ресурсов CPU еще достаточно для запуска еще как минимум 3 билдов. Но при добавлении дополнительных сборок, растет время сборки всех билдов. Так, 4 одновременных билда собираются 12! минут.
Кто-нибудь может объяснить почему процессы, которые вроде бы не должны влиять на друг друга и которым хватает ресурсов, так себя ведут?
А почему это не будут влиять?
Начнем с того что при частичной загрузке может работать динамический разгон частоты процессора. А при полной опускаться до базовой частоты.
Далее пропускная способность оперативной памяти и дисков тоже имеет лимит.
Ну и в конце концов кеш начинает работать менее эффективно.
Еще и про то что гипертреды работают медленнее и соответственно половина начинает просто медленнее считаться забыл.
"не должны влиять" - это в Вашей голове или в коде Дженкинса?
да и rails-приложение такое впечатление что это Ruby on Rails со своим GILом и этим вот всем
> "не должны влиять" - это в Вашей голове или в коде Дженкинса?
Конечно очевидно что они как-то влияют на друг друга. В этом и вопрос, "как?".
Я исхожу из того что каждая сборка изолирована в своём docker-контейнере через docker-compose. И между ними нет каких-то общих ресурсов.
> да и rails-приложение такое впечатление что это Ruby on Rails со своим GILом и этим вот всем
Безусловно, GIL там есть. Но я для этого и распаралелил тесты на 12 потоков внутри сборки.
Получилось что одна сборка забирает себе 12 виртуальных ядра. Но остаются ведь еще свободные ядра, которые должны использоваться другими сборками.