2016-11-08 1 views
0

Мы работаем над нашим проектом с помощью scons as build system в течение нескольких лет. Scons является удивительным и значительно улучшил наш процесс разработки. Исходные файлы ~ 15000 C++ изначально и по мере того, как проект развивает исходные файлы на других языках (Java/Scala), также добавляются в базу кода. Затем мы разработали собственные разработчики, которые управляют зависимостями и вызывают внешний инструмент (javac, scalac) для создания этих источников, который работает очень хорошо. Недавно я работал над оптимизацией существующей системы сборки и обнаружили разницу в производительности между C++ и Java процесса сборки:Сконс ​​Производительность сборки для C++ в большой кодовой базе

Окружающая среда установки: сборки сервера с 24 ядрами, Python 2.7.3, 2.2.0 Scons
Команда: SCons --duplicate = мягкий копия -j8

При создании кода Java, использование процессора легко высоким наблюдаются из верхних и охватывающих нескольких ядер: Java Build

Однако при создании C++ кода, использование процессора всегда ~ 4% и не работает только на 1 ядре независимо от того, сколько рабочих мест в SCons: C++ Build

Я погуглить много в Интернете, но не мог найти что-то полезное. Я поражаю проблему GIL в Python? Я считаю, что каждая команда gcc/g ++ должна запускаться в отдельном подпроцессе, как javac в наших собственных сборщиках, поэтому здесь не должно быть GIL. Существует ли какое-либо обходное решение для полного использования нескольких ядер, ускоряющих работу над C++? Спасибо заранее.

+0

Возможно, вам нужно установить флаг '-j': http://stackoverflow.com/questions/414714/compiling-with-g-using-multiple-cores – doctorlove

+0

Возможно ли, что ваши неявные зависимости для части C++ (заголовки и lib) просто не позволяют далее строить шаги сборки? У самих SCons не должно быть никаких проблем с большими сборками или параллельной обработкой (см., Например, [Почему SCons Is Not Slow] (https://bitbucket.org/scons/scons/wiki/WhySconsIsNotSlow)), а его процессорные показатели показывают полный 100 % на скриншоте. Сконды могут свободно вращаться, пытаясь найти новые задачи для появления, но текущие зависимости запрещают это. Другие крупные проекты (например, MongoDB), похоже, не имеют проблем в этой области ....;) – dirkbaechle

+0

@dirkbaechle Спасибо за ваш ответ, разумно предположить, что ширина DAG не более N (N <8) , Но мне все еще интересно, что есть сотни целей, которые нужно построить, и среди них есть много программ, которые, безусловно, являются конечной точкой графика зависимости. Тем не менее, использование процессора все еще составляет ~ 100% ** только на 1 ядре ** .... По контрасту Java-здание работает на нескольких ядрах. – WindLeeWT

ответ

0

Как пояснил WindLeeWT в одном из своих комментариев, причиной наблюдаемого поведения было то, что ccache был установлен и настроен на соответствующем сервере. Похоже, что большая часть использования ЦП во время сборки C++ была взята на этапе компиляции, чего полностью избегали из-за ccache. Вот почему никакое использование ЦП для нескольких ядер не было видно в пределах top.

Как только они запустили «построить с нуля» на другом сервере без ccache, несколько ядер работали на 90% с «cc1plus -o ...», как и ожидалось.

Были задействованы штрафные санкции за исполнение (GIL и т. Д.), И ни Python, ни SCons не ухудшали производительность каким-либо значительным образом.

+0

Спасибо, дирк. Извините, что я был немного занят в последнее время и забыл обновить вопрос с нашей дискуссией и причиной проблемы – WindLeeWT

Смежные вопросы