Summary
Using ElectricInsight to examine annotation output revealed a 'striping' pattern. Agents finished a job and then waited. Jobs that could be run were not run. At some point, all agents kicked back in and grabbed waiting jobs.
Solution
A large number of implicit (eMake-discovered) dependencies were in the makefiles, so eMake entered "history collapsing" mode, which is a mechanism for reducing the volume of history entries in a build. Essentially, it works like this: If a given job has dependencies on more than 5 jobs from any given make instance, eMake will serialize that job against the entire make instance, rather than against each of the individual jobs. Likewise, if more than 5 jobs in a given make instance have dependencies on any other given job, eMake will serialize that entire make instance against that job, rather than having individual history entries for each of the specific dependencies.
You can disable this behavior by permanently adding -emake-collapse=0
to your command-line or to the EMAKEFLAGS environment variable. Regenerate your history file by adding emake-history=create
for one iteration, then remove the -emake-history
option for subsequent builds. Disabling history collapsing might speed up your build, but also can cause your history files to become considerably larger. You will need to evaluate this tradeoff on a build-by-build basis.