serac
serac copied to clipboard
Bloated binaries
Brandon mentioned to me earlier that his debugger was struggling to open up some of serac's tests. He mentioned that they either took an unusually long time to start, or would just crash the debugger altogether. Out of curiosity, I looked at the tests in my most recent build directory (Release) and I see:
sam@provolone:~/code/serac/build-Clang-Release/tests$ ls -la
...
-rwxrwxr-x 1 sam sam 141391048 Aug 10 17:08 serac_component_bc
-rwxrwxr-x 1 sam sam 141210280 Aug 10 17:08 serac_dtor
-rwxrwxr-x 1 sam sam 141065728 Aug 10 17:08 serac_error_handling
-rwxrwxr-x 1 sam sam 134437504 Aug 10 17:08 serac_input
-rwxrwxr-x 1 sam sam 133322976 Aug 10 17:08 serac_mesh_test
-rwxrwxr-x 1 sam sam 141293848 Aug 10 17:08 serac_newmark_test
-rwxrwxr-x 1 sam sam 139749704 Aug 10 17:03 serac_odes
-rwxrwxr-x 1 sam sam 141444824 Aug 10 17:08 serac_solid
-rwxrwxr-x 1 sam sam 141277456 Aug 10 17:08 serac_solid_adjoint
-rwxrwxr-x 1 sam sam 142157592 Aug 10 17:09 serac_solid_functional
-rwxrwxr-x 1 sam sam 140083584 Aug 10 17:08 serac_solid_functional_boundary
-rwxrwxr-x 1 sam sam 140348240 Aug 10 17:08 serac_solid_functional_finite_diff
-rwxrwxr-x 1 sam sam 141273528 Aug 10 17:08 serac_solid_reuse_mesh
-rwxrwxr-x 1 sam sam 141249672 Aug 10 17:08 serac_solid_sensitivity
-rwxrwxr-x 1 sam sam 141744216 Aug 10 17:08 serac_thermal_functional
-rwxrwxr-x 1 sam sam 140299368 Aug 10 17:08 serac_thermal_functional_finite_diff
-rwxrwxr-x 1 sam sam 141239552 Aug 10 15:48 serac_thermal_mechanics_functional
-rwxrwxr-x 1 sam sam 141422328 Aug 10 17:08 serac_thermal_solid_solver
-rwxrwxr-x 1 sam sam 141432040 Aug 10 17:08 serac_thermal_solver
...
Wow, every test is almost exactly the same size, 140MB. That's weird, and also really big, considering many of these are extremely basic unit tests that do almost nothing.
When I inspected the binaries, I was surprised to see
sam@provolone:~/code/serac/build-Clang-Release/tests$ bloaty -d sections,compileunits -n 5 ./serac_thermal_mechanics_functional
FILE SIZE VM SIZE
-------------- --------------
33.8% 45.5Mi 0.0% 0 .debug_loc
48.9% 22.3Mi NAN% 0 [371 Others]
20.7% 9.40Mi NAN% 0 /home/sam/code/serac_libs/builds/spack-stage-conduit-0.8.3-wqhg2i6ady424csssfpjlggcjflt42jx/spack-src/src/libs/blueprint/conduit_blueprint_mesh.cpp
12.3% 5.58Mi NAN% 0 /home/sam/code/serac_libs/builds/spack-stage-conduit-0.8.3-wqhg2i6ady424csssfpjlggcjflt42jx/spack-src/src/libs/blueprint/conduit_blueprint_mesh_partition.cpp
6.9% 3.16Mi NAN% 0 /home/sam/code/serac_libs/builds/spack-stage-conduit-0.8.3-wqhg2i6ady424csssfpjlggcjflt42jx/spack-src/src/libs/blueprint/conduit_blueprint_mesh_flatten.cpp
6.2% 2.82Mi NAN% 0 /home/sam/code/serac_libs/builds/spack-stage-conduit-0.8.3-wqhg2i6ady424csssfpjlggcjflt42jx/spack-src/src/libs/conduit/conduit_node.cpp
5.0% 2.26Mi NAN% 0 /home/sam/code/serac_libs/builds/spack-stage-conduit-0.8.3-wqhg2i6ady424csssfpjlggcjflt42jx/spack-src/src/libs/blueprint/conduit_blueprint_mpi_mesh.cpp
32.6% 43.9Mi 0.0% 0 .debug_info
55.9% 24.6Mi NAN% 0 [378 Others]
15.5% 6.83Mi NAN% 0 /home/sam/code/serac_libs/builds/spack-stage-conduit-0.8.3-wqhg2i6ady424csssfpjlggcjflt42jx/spack-src/src/libs/blueprint/conduit_blueprint_mesh.cpp
11.4% 5.03Mi NAN% 0 /home/sam/code/serac_libs/builds/spack-stage-conduit-0.8.3-wqhg2i6ady424csssfpjlggcjflt42jx/spack-src/src/libs/blueprint/conduit_blueprint_mesh_partition.cpp
6.5% 2.86Mi NAN% 0 /home/sam/code/serac_libs/builds/spack-stage-conduit-0.8.3-wqhg2i6ady424csssfpjlggcjflt42jx/spack-src/src/libs/blueprint/conduit_blueprint_mesh_flatten.cpp
6.2% 2.72Mi NAN% 0 /home/sam/code/serac_libs/builds/spack-stage-conduit-0.8.3-wqhg2i6ady424csssfpjlggcjflt42jx/spack-src/src/libs/conduit/conduit_node.cpp
4.4% 1.93Mi NAN% 0 /home/sam/code/serac_libs/builds/spack-stage-conduit-0.8.3-wqhg2i6ady424csssfpjlggcjflt42jx/spack-src/src/libs/blueprint/conduit_blueprint_mpi_mesh.cpp
12.1% 16.2Mi 73.9% 16.2Mi .text
62.4% 10.1Mi 62.4% 10.1Mi [section .text]
26.0% 4.22Mi 26.0% 4.22Mi [377 Others]
4.6% 766Ki 4.6% 766Ki /home/sam/code/serac_libs/builds/spack-stage-conduit-0.8.3-wqhg2i6ady424csssfpjlggcjflt42jx/spack-src/src/libs/blueprint/conduit_blueprint_mesh.cpp
2.6% 430Ki 2.6% 430Ki /home/sam/code/serac_libs/builds/spack-stage-conduit-0.8.3-wqhg2i6ady424csssfpjlggcjflt42jx/spack-src/src/libs/blueprint/conduit_blueprint_mesh_partition.cpp
2.3% 374Ki 2.3% 374Ki /home/sam/code/serac_libs/builds/spack-stage-hdf5-1.8.21-vi67w2sajactgflts5jbfkvjjzs3mzhg/spack-src/src/H5Tconv.c
2.2% 364Ki 2.2% 364Ki /home/sam/code/serac_libs/builds/spack-stage-conduit-0.8.3-wqhg2i6ady424csssfpjlggcjflt42jx/spack-src/src/libs/conduit/conduit_node.cpp
11.1% 15.0Mi 26.1% 5.75Mi [39 Others]
5.9% 7.96Mi 0.0% 0 .debug_line
56.4% 4.49Mi NAN% 0 [378 Others]
16.2% 1.29Mi NAN% 0 /home/sam/code/serac_libs/builds/spack-stage-conduit-0.8.3-wqhg2i6ady424csssfpjlggcjflt42jx/spack-src/src/libs/blueprint/conduit_blueprint_mesh.cpp
10.3% 843Ki NAN% 0 /home/sam/code/serac_libs/builds/spack-stage-conduit-0.8.3-wqhg2i6ady424csssfpjlggcjflt42jx/spack-src/src/libs/blueprint/conduit_blueprint_mesh_partition.cpp
6.7% 547Ki NAN% 0 /home/sam/code/serac_libs/builds/spack-stage-conduit-0.8.3-wqhg2i6ady424csssfpjlggcjflt42jx/spack-src/src/libs/conduit/conduit_node.cpp
6.1% 496Ki NAN% 0 /home/sam/code/serac_libs/builds/spack-stage-conduit-0.8.3-wqhg2i6ady424csssfpjlggcjflt42jx/spack-src/src/libs/blueprint/conduit_blueprint_mesh_flatten.cpp
4.3% 348Ki NAN% 0 /home/sam/code/serac_libs/builds/spack-stage-conduit-0.8.3-wqhg2i6ady424csssfpjlggcjflt42jx/spack-src/src/libs/conduit/conduit_data_array.cpp
4.5% 6.07Mi 0.0% 0 .debug_ranges
50.6% 3.07Mi NAN% 0 [331 Others]
17.7% 1.07Mi NAN% 0 /home/sam/code/serac_libs/builds/spack-stage-conduit-0.8.3-wqhg2i6ady424csssfpjlggcjflt42jx/spack-src/src/libs/blueprint/conduit_blueprint_mesh.cpp
13.3% 824Ki NAN% 0 /home/sam/code/serac_libs/builds/spack-stage-conduit-0.8.3-wqhg2i6ady424csssfpjlggcjflt42jx/spack-src/src/libs/blueprint/conduit_blueprint_mesh_partition.cpp
6.9% 429Ki NAN% 0 /home/sam/code/serac_libs/builds/spack-stage-conduit-0.8.3-wqhg2i6ady424csssfpjlggcjflt42jx/spack-src/src/libs/blueprint/conduit_blueprint_mesh_flatten.cpp
6.2% 387Ki NAN% 0 /home/sam/code/serac_libs/builds/spack-stage-conduit-0.8.3-wqhg2i6ady424csssfpjlggcjflt42jx/spack-src/src/libs/conduit/conduit_node.cpp
5.3% 327Ki NAN% 0 /home/sam/code/serac_libs/builds/spack-stage-conduit-0.8.3-wqhg2i6ady424csssfpjlggcjflt42jx/spack-src/src/libs/conduit/conduit_data_array.cpp
100.0% 134Mi 100.0% 22.0Mi TOTAL
There's like ~120-130 MB of debug information in this release executable. Why?
Almost all of it is from conduit, but there are other contributions (full output available here):
- 88.5MB conduit
- 17.0MB hdf5
- 10.0MB umpire
- 3MB sundials
To be clear, this is from a release build of serac using TPLs built by uberenv
+ spack
without debug. We've got dozens of tests in serac across different compilers and build configurations with this same bloat (or even worse in debug).
For reference, unit tests for tensor
, dual
are less than 1MB, and contain no such debug info (as expected):
sam@provolone:~/code/serac/build-Clang-Release/tests$ bloaty ./tensor_unit_tests
FILE SIZE VM SIZE
-------------- --------------
44.2% 254Ki 56.9% 254Ki .text
13.8% 79.5Ki 0.0% 0 .strtab
11.6% 66.5Ki 14.9% 66.5Ki .dynstr
6.3% 36.4Ki 0.0% 0 .symtab
5.9% 33.8Ki 7.6% 33.8Ki .eh_frame
4.5% 26.2Ki 5.8% 26.2Ki .dynsym
3.6% 20.5Ki 4.6% 20.5Ki .rodata
2.4% 14.1Ki 3.1% 14.1Ki .gcc_except_table
1.9% 11.1Ki 0.0% 0 [Unmapped]
1.2% 6.80Ki 1.5% 6.80Ki .gnu.hash
0.9% 5.45Ki 1.2% 5.45Ki .eh_frame_hdr
0.9% 5.45Ki 1.2% 5.45Ki .data.rel.ro
0.6% 3.23Ki 0.7% 3.23Ki .rela.plt
0.4% 2.27Ki 0.5% 2.27Ki .rela.dyn
0.4% 2.18Ki 0.5% 2.18Ki .gnu.version
0.4% 2.17Ki 0.5% 2.17Ki .plt
0.3% 2.00Ki 0.0% 0 [ELF Section Headers]
0.3% 1.69Ki 0.3% 1.32Ki [15 Others]
0.2% 1.10Ki 0.2% 1.10Ki .got.plt
0.0% 0 0.2% 1.09Ki .bss
0.1% 672 0.1% 672 .dynamic
100.0% 575Ki 100.0% 447Ki TOTAL
I don't have profiling numbers for how much time it's costing us to link all of these unnecessary symbols, but surely these incredibly bloated binaries are costing us development time, in addition to the obstacles they pose to debuggers and the file system.