fhunleth
Minimizing OTP release size
I realize that most people aren’t overly concerned with OTP release sizes. I hadn’t been, but an issue came up where over-the-air updates over an LTE connection actually starts costing money. The OTP release on my device occupies about 55% of the space, not counting beam.smp. I was looking at the application sizes in a release. Here’s a sampling of the top sizes (in KB) I’m seeing:
$ du -ks * | sort -rn
4652 elixir-1.7.4
4012 stdlib-3.6
1792 kernel-6.1
1736 compiler-7.2.7
1136 ssl-9.0.3
1028 asn1-5.0.7
912 public_key-1.6.3
900 mix-1.7.4
880 ssh-4.7.1
780 distillery-2.0.10
372 sasl-3.2.1
312 iex-1.7.4
308 runtime_tools-1.13.1
204 crypto-4.3.3
200 socket-0.3.13
184 x509-0.5.0-dev
148 nerves_network-0.3.7
144 logger-1.7.4
136 nerves_runtime-0.8.0
128 system_registry-0.8.0
I’ve configured Distillery to strip debug out of the .beam files. That helped, but not as much as I hoped. As you can see, Elixir and stdlib are still over 4 MB and there are quite a few decent size ones after that. If those could be reduced, that would be a decent win for me. Has anyone tried doing this? Any ideas?
Thanks!
First Post!
michalmuskala
I’m pretty sure the majority of the size of Elixir will be the Unicode modules. The new compiler in OTP 22 might be actually better at compiling things like that, which might reduce the size somewhat. The issue is even bigger since now the Erlang’s stdlib contains another copy of unicode too.
One more thing you could try is compiling everything without line info (the option to compiler is no_line_info). This might create more opportunities for compiler passes that merge similar code together if they only differ by a line number, but that’s kind of a long shot.
Most Liked
fhunleth
Here’s the update:
- I made
distilleryaruntime: falsedependency. This also removes the need formixto be in the release. This dropped the size by 4.5%, but it felt good to not include the build tools. I’ll obviously need to reconsider if we start using the config providers - Stripping the
.beamfiles trimmed the firmware by 35%! Everything (Linux kernel,beam.smp, drivers, wifi firmware, bootloaders, and the OTP release) are now in a 15.2 MB package. - @mobileoverlord had to make some PRs to Distillery and Shoehorn, so these numbers aren’t easy to reproduce yet. They also include unreleased updates to
nerves_system_br.
I’m not out of the woods with size, but I’m going to savor this improvement over the Thanksgiving holiday here. I also want to see if I can live with the stripped beams.
Here are some stats:
After stripping the beams:
$ du -ks * | sort -nr
1632 elixir-1.7.4
1160 stdlib-3.6
668 kernel-6.1
512 compiler-7.2.7
356 asn1-5.0.7
312 ssl-9.0.3
284 ssh-4.7.1
264 public_key-1.6.3
160 iex-1.7.4
152 runtime_tools-1.13.1
148 sasl-3.2.1
132 crypto-4.3.3
104 socket-0.3.13
100 nerves_runtime-0.8.0
Post strip, here’s example contents of a .beam file (this one is the current winner on size in the Elixir app)
iex(9)> :beam_lib.info('/srv/erlang/lib/elixir-1.7.4/ebin/Elixir.Base')
[
file: '/srv/erlang/lib/elixir-1.7.4/ebin/Elixir.Base.beam',
module: Base,
chunks: [
{'Line', 20, 636},
{'AtU8', 664, 1642},
{'Code', 2316, 230760},
{'StrT', 233084, 45},
{'ImpT', 233140, 232},
{'ExpT', 233380, 400},
{'LitT', 233788, 218}
]
]
I would assume that means that line number info is still present, but it looks too small to worry about.
jola
Specifically the strip_debug_info is an option for Distillery Configuring Distillery - Distillery Documentation.
Would be cool with an article discussing the ways to reduce size.
LostKobrakai
I’m wondering if incremental updates would help you as well. I often update my releases not by uploading the whole thing, but by using rsync to just upload what’s changed.
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #security
- #hex









