I’m using absinthe with absinthe-graphql-ws and cowboy + ranch + phoenix in production. Looking at LiveDashboard, I often see that there are some websocket processes that have 10 or even 20MB of memory.
After digging further, it looks like this is non-GC’ed heap space:
Process.info(pid, [:heap_size, :total_heap_size, :stack_size, :garbage_collection])
[
heap_size: 196650,
total_heap_size: 1400899,
stack_size: 13,
garbage_collection: [
max_heap_size: %{
error_logger: true,
include_shared_binaries: false,
kill: true,
size: 0
},
min_bin_vheap_size: 46422,
min_heap_size: 233,
fullsweep_after: 65535,
minor_gcs: 49
]
]
This gets drastically reduced after running a major GC:
iex(fl-app@10.140.196.66)85> Process.info(pid, :memory)
{:memory, 11225840}
iex(fl-app@10.140.196.66)86> :erlang.garbage_collect(pid, type: :major)
true
iex(fl-app@10.140.196.66)87> Process.info(pid, :memory)
{:memory, 55648}
iex(fl-app@10.140.196.66)88> Process.info(pid, [:heap_size, :total_heap_size, :stack_size, :garbage_collection])
[
heap_size: 2586,
total_heap_size: 20331,
stack_size: 13,
garbage_collection: [
max_heap_size: %{
error_logger: true,
include_shared_binaries: false,
kill: true,
size: 0
},
min_bin_vheap_size: 46422,
min_heap_size: 233,
fullsweep_after: 65535,
minor_gcs: 4
]
]
It looks like the fullsweep_after default is way too low, which hints to me that we need something aggressively lower. Also the GenServer hibernate (triggered by default every 15”) doesn’t seem to do much in terms of GC’ing.
I know this is very niche - but has anyone else run into this? The closest thing I found on here is this discussion.






















