serac icon indicating copy to clipboard operation
serac copied to clipboard

Bloated binaries

Open samuelpmishLLNL opened this issue 1 year ago • 0 comments

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.

samuelpmishLLNL avatar Aug 11 '22 00:08 samuelpmishLLNL