I am trying to install erlang 20.3.8.23 via asdf on my droplet so I can use an elixir server for VIM (using ALE), but unfortunately the installation is failing.
Problem
10624 CC x86_64-unknown-linux-gnu/wxe_driver.o
10625 CC x86_64-unknown-linux-gnu/wxe_ps_init.o
10626 CXX x86_64-unknown-linux-gnu/wxe_main.o
10627 CXX x86_64-unknown-linux-gnu/wxe_impl.o
10628 CXX x86_64-unknown-linux-gnu/wxe_helpers.o
10629 CXX x86_64-unknown-linux-gnu/wxe_callback_impl.o
10630 CXX x86_64-unknown-linux-gnu/wxe_return.o
10631 CXX x86_64-unknown-linux-gnu/wxe_gl.o
10632 CXX x86_64-unknown-linux-gnu/wxe_funcs.o
10633
10634 cc1plus: out of memory allocating 65536 bytes after a total of 364257280 bytes
10635 Makefile:156: recipe for target 'x86_64-unknown-linux-gnu/wxe_funcs.o' failed
10636 make[3]: *** [x86_64-unknown-linux-gnu/wxe_funcs.o] Error 1
10637 make[3]: Leaving directory '/root/.asdf/plugins/erlang/kerl-home/builds/asdf_20.3.8.23/otp_src_20.3.8.23/lib/wx/c _src'
10638 /root/.asdf/plugins/erlang/kerl-home/builds/asdf_20.3.8.23/otp_src_20.3.8.23/make/otp_subdir.mk:29: recipe for ta rget 'opt' failed
10639 make[2]: *** [opt] Error 2
I understand from this log that this fails because my droplet doesn’t have enough memory. This is rather astonishing to me, as I have installed erlang 22.1 in the same machine and I didn’t have the same issue.
The other thing that jumps to my eye is the x86_64-unknown-linux-gnu. Why can’t the install figure out what version of linux I have? (is this even important?)
My droplet has the following OS:
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.3 LTS
Release: 18.04
Codename: bionic
1 GiB is usually not enough to compile programs of this size. It might help but does not necessarily have to, when you force to use not more than a single compiling job. I’m not sure if asdf gives you the possibility to so though. Something comparable to makes -j flag.
Alternatively you can try to give that machine about 4 to 8 gigs of swap. If it is only for temprary use, then just using a swap file should be enough, though compiling might take forever.
The third possibility is to scale up your droplet temporary (CPU/mem only, NO disk!) and scale down after the compile job has succeeded.
And last but not least there is number 4. Use a docker image locally which is configured very closely to your droplet to build the desired version of erlang. Extract the artifacts from the resulting image and push them to the droplet such that asdf is able to find them. I’m not sure how asdf keeps track of installed versions though. If you are out of luck, you’ll need to manually edit the database file that keeps track of installed versions.
After reading the article and @NobbZ opinion I have opted for temporarily resizing the droptlet so as to have 4GB of RAM instead of 1GB.
If this is not enough I will consider other options, although swapping is not recommended because it can make the droplet unstable.
I have also checked the RAM usage and I can confirm that at one point during the compilation, it definitely runs out of RAM. Because the machine has no Swap, it then crashes.
I am now resizing the droplet, lets see how it goes !
I have resized my droplet and compiled erlang. It worked. My droplet now has 4gb of RAM and costs 4x as much.
Initially I didn’t think this was going to be an issue, after all, this is just a temporary scale up (I thought).
Unfortunately for me, as I later found out, I’m not able to downsize the droplet as the official article mentioned. I’m stuck with a droplet that will cost me 4x as much and the only thing I can do is to scp the files I want to a smaller instance, which is incredibly disappointing.
Doing so will not only take hours(which I pay for, obviously) it also requires me to know where asdf places all the releases and scp them manually.
In hindsight, resizing the droplet was a terrible mistake, I should have simply created a 3GB swap partition and let the SSD drive take the heat.
With a temporary SWAP file of 4GB I was able to compile erlang 20.3.8.23. The compilation took around 2GB of RAM with the --without-wx option. Since droplets normally come with SSD disks, the compilation time was not that much longer than expected.
And the best thing here is that the SWAP file is only temporary, it goes away when you reboot the machine. Couldn’t be happier!
I’d only ever use asdf locally (OSX), and usually a pre-built docker image remotely, is there an issue with the erlang-solutions precompiled packages? They’re (ESL) already spending a lot of money on building/distributing.
The droplet in question is his “local” as the computer he got is suited even worse for developing elixir/Erlang. At least that’s how I understood this thread and an earlier one.