When I say that the app is a hello-world app, I mean that I literally have not done anything other than run
mix phx.new myapp and
mix phx.gen.auth Accounts User users. I then added the
fly.toml, etc needed for deployment and successfully deployed the app to Fly.io.
It still shows the “Welcome to Phoenix! Peace of mind from prototype to production” landing page, so I really haven’t touched anything.
Once deployed, the app appears to work fine – I can register for an account, log in, log out, change the background color and redeploy, etc.
But if I come back to the app the next day, the user registration and login system does not work. If I attempt to register a user the app will just crash. This has happened to me twice now, with two separate hello-world Phoenix apps.
This is what the logs show:
app[893322ef] maa [info] [21576.418891] Out of memory: Killed process 510 (beam.smp) total-vm:1388056kB, anon-rss:169764kB, file-rss:0kB, shmem-rss:79684kB, UID:65534 pgtables:704kB oom_score_adj:0 proxy[893322ef] iad [error] error.code=2003 error.message="App connection closed before request/response completed" request.method="POST" request.url="https://quiz-bot.fly.dev/users/register" request.id="01FGW9VXXXXXXXXXX1HVCS67DC" response.status=502 app[893322ef] maa [info] Main child exited with signal (with signal 'SIGKILL', core dumped? false) app[893322ef] maa [info] Reaped child process with pid: 570 and signal: SIGUSR1, core dumped? false app[893322ef] maa [info] Starting clean up. app[893322ef] maa [info] Process appears to have been OOM killed! runner[893322ef] maa [info] Starting instance runner[893322ef] maa [info] Configuring virtual machine runner[893322ef] maa [info] Pulling container image runner[893322ef] maa [info] Unpacking image runner[893322ef] maa [info] Preparing kernel init
The error message when I try to register a user is “App connection closed before request/response completed” and also “Process appears to have been OOM killed!”
So one thing that has occurred to me is that there is some kind of crucial difference between my development environment and my production environment that I do not understand. The most obvious candidate is the amount of RAM available.
So what I would like to do is figure out some way to run my phoenix app in the exact same docker configuration that it will have in production – i.e., with the same amount of RAM available. I guess I would call this a “staging environment”.
Is it possible to run a Phoenix app inside docker on my local machine with exactly the same amount of RAM specified as I will have in production? Also, what can I do to make my phoenix app use less RAM?
I also honestly don’t understand why the app would work correctly for a few hours before ceasing to work properly – I would think that an out-of-memory error would either appear immediately or else not appear at all – because I don’t see where I could have a slow memory leak over time, especially if the app is being used by exactly no one.