stefanchrobot
Elixir memory usage
I’ve been looking at my application in terms of resource usage. It’s a simple SQS consumer that calls some APIs and is under a very small load. BEAM constantly reports usage of around 70MB of memory:
I’m not sure what to think about it. Honestly, I expected a smaller footprint. I’m running with the default settings and simple MIX_ENV=prod mix run.
Is there an easy way to shave off some memory? Also, I’m wondering - why so many atoms are used?
Most Liked
jeremyjh
Each module, and every function in every module is an atom. If you are loading a few libraries hitting 22K isn’t too hard. I’m not sure what to think of the memory. Its not so bad compared to other high-level language VMs though is it? I’m sure Go or Rust would be a lot smaller but a better comparison is Ruby, Python or Java.
jeramyRR
70 MBs seems a bit high for a small app. What all libs are you loading?
The image below shows a basic Phoenix app.
jola
If you do try building a release, I’m curious to see what the memory usage turns out to be. I made a quick comparison in a project of my own and also just a plain new phoenix project, in both cases memory use was much higher in the release. Why do releases use so much more memory than `mix run`?
As I point out though, my comparison may be unfair, as not all code is necessarily loaded in the mix version when I checked memory use, while releases preload all modules. But you should be able to get an accurate comparison.
stefanchrobot
makes sense!
Here’s my app:
$ mix deps.tree
app
├── statix ~> 1.1 (Hex package)
├── gen_stage ~> 0.14.0 (Hex package)
├── jason ~> 1.1 (Hex package)
├── poison ~> 4.0 (Hex package)
├── junit_formatter ~> 3.0 (Hex package)
├── dialyxir ~> 0.4 (Hex package)
├── hackney ~> 1.9 (Hex package)
│ ├── certifi 2.5.1 (Hex package)
│ │ └── parse_trans ~>3.3 (Hex package)
│ ├── idna 6.0.0 (Hex package)
│ │ └── unicode_util_compat 0.4.1 (Hex package)
│ ├── metrics 1.0.1 (Hex package)
│ ├── mimerl ~>1.1 (Hex package)
│ └── ssl_verify_fun 1.1.4 (Hex package)
├── sweet_xml ~> 0.6 (Hex package)
├── ex_aws ~> 2.0 (Hex package)
│ ├── hackney 1.6.3 or 1.6.5 or 1.7.1 or 1.8.6 or ~> 1.9 (Hex package)
│ ├── poison >= 1.2.0 (Hex package)
│ └── sweet_xml ~> 0.6 (Hex package)
├── ex_aws_sqs ~> 2.0 (Hex package)
│ └── ex_aws ~> 2.0.0 (Hex package)
├── credo ~> 1.0 (Hex package)
│ ├── bunt ~> 0.2.0 (Hex package)
│ └── jason ~> 1.0 (Hex package)
└── tesla ~> 1.2.1 (Hex package)
├── hackney ~> 1.6 (Hex package)
├── jason >= 1.0.0 (Hex package)
├── mime ~> 1.0 (Hex package)
└── poison >= 1.0.0 (Hex package)
credo, dialyxir and junit_formatter are :dev or :test only.
Would the size of the loaded code change if I built a release instead of running plain mix run?









