Packages
wobserverfork
0.1.9
Web based metrics, monitoring, and observer (a temporary fork, not recommended for public use)
Current section
Files
Jump to
Current section
Files
lib/wobserver/util/allocator.ex
defmodule Wobserver.Allocator do
@moduledoc ~S"""
Handles memory allocators and their block and carrier size.
"""
@doc ~S"""
Lists memory allocators and their block and carrier size.
The returned maps contain the following information:
- `type`, the type of the memory allocator.
- `block`, the block size of the memory allocator. (summed over all schedulers)
- `carrier`, the carrier size of the memory allocator. (summed over all schedulers)
"""
@spec list :: list(map)
def list do
:alloc_util_allocators
|> :erlang.system_info
|> info()
end
defp info(type) do
{:allocator_sizes, type}
|> :erlang.system_info
|> Enum.map(&sum_data/1)
|> Enum.filter(&non_zero?/1)
end
defp non_zero?(%{carrier: c, block: b}), do: c != 0 && b != 0
defp sum_data({type, data}) do
data
|> Enum.map(fn {_, _, d} -> Keyword.get(d,:mbcs) end)
|> Enum.map(&block_and_carrier_size/1)
|> Enum.reduce({0,0}, fn {x, y}, {a, b} -> {a + x, y + b} end)
|> (fn {x, y} -> %{type: type, block: x, carrier: y} end).()
end
defp block_and_carrier_size([{_, x, _, _}, {_, y, _, _}]), do: {x, y}
end