Engflow profile¶
What is an Engflow profile and what do you need it for?¶
The Engflow profile is a build artifact that engflow automatically produces for builds running remotely. It is the server-side profile of a build: it provides granular insight into the server-side events for each action that ran remotely.
This artifact is complementary to a Bazel profile, which is the client-side profile that shows everything else in a build, like system resource consumption and critical path.
The Engflow profile is especially useful when:
- measuring resource utilization of an action (memory, CPU, IO, ...)
- measuring how much docker image sizes impact builds
- measuring costs of container bootstrap
- measuring and debugging remote-persistent-workers
- ... and much more!
Format and schema¶
The file format is the same as a Bazel profile, but it has a somewhat different schema with different events and attributes. Event can be distinguished by category as following:
worker_time
events¶
These events are used to mark an end-to-end execution of an action, grouping together the various phases of the lifecycle of an action running on remote execution. Events of this type have a very extensive list of attributes, covering an action's setup as well as its performances.
Generic attributes¶
These attributes can be found in every worker_time
event:
action_digest
: the unique identifier for an action, computed by concatenating hash and length of an action's proto.- action_mnemonic
action_pool
: the pool on which said action raninput_tree_stats
: statistics on IO throughput, size and so on of the input tree that is staged prior to action executionoutput_tree_stats
: the counterpart to input_tree_stats for the outputs generated by running an action
Process wrapper attributes¶
When running actions on remote-execution we can optionally run an action's command through Bazel's process wrapper. This allows us to capture metrics from getrusage. This isn't enabled by default and is only available on linux. Reach out to our Engflow engineers to have it enabled.
process_wrapper.execution_statistics.resource_usage.utime_sec
: user CPU time used, seconds partprocess_wrapper.execution_statistics.resource_usage.utime_usec
: user CPU time used, microseconds partprocess_wrapper.execution_statistics.resource_usage.stime_sec
: system CPU time used, seconds partprocess_wrapper.execution_statistics.resource_usage.stime_usec
: system CPU time used, microseconds partprocess_wrapper.execution_statistics.resource_usage.maxrss
: maximum resident set size (in kilobytes)process_wrapper.execution_statistics.resource_usage.minflt
: page reclaims (soft page faults)process_wrapper.execution_statistics.resource_usage.majflt
: page faults (hard page faults)process_wrapper.execution_statistics.resource_usage.inblock
: block input operationsprocess_wrapper.execution_statistics.resource_usage.oublock
: block output operationsprocess_wrapper.execution_statistics.resource_usage.nvcsw
: voluntary context switchesprocess_wrapper.execution_statistics.resource_usage.nivcsw
: involuntary context switches