Current section
Files
Jump to
Current section
Files
lib/wobserver/system/scheduler.ex
defmodule Wobserver.System.Scheduler do
@moduledoc ~S"""
Scheduler utilization per scheduler.
Example:
```bash
Wobserver.System.Scheduler.utilization
[1.0, 0.0306945631032665, 0.03640598025269633, 0.05220935570330663,
0.04884165187164101, 0.08352432821297966, 0.11547042454628796,
0.2861211090456038]
```
"""
@table :wobserver_scheduler
@lookup_key :last_utilization
@doc ~S"""
Calculates scheduler utilization per scheduler.
Returns a list of floating point values range (0-1) indicating 0-100% utlization.
Example:
```bash
Wobserver.System.Scheduler.utilization
[1.0, 0.0306945631032665, 0.03640598025269633, 0.05220935570330663,
0.04884165187164101, 0.08352432821297966, 0.11547042454628796,
0.2861211090456038]
```
"""
@spec utilization :: list(float)
def utilization do
ensure_started()
case last_utilization() do
false ->
get_utilization()
|> Enum.map(fn {_, u, t} -> percentage(u, t) end)
last ->
get_utilization()
|> Enum.zip(last)
|> Enum.map(fn {{_, u0, t0}, {_, u1, t1}} ->
percentage((u1 - u0), (t1 - t0))
end)
end
end
defp percentage(_, 0), do: 0
defp percentage(u, t), do: u / t
defp get_utilization do
util =
:scheduler_wall_time
|> :erlang.statistics
|> :lists.sort()
:ets.insert @table, {@lookup_key, util}
util
end
defp last_utilization do
case :ets.lookup(@table, @lookup_key) do
[{@lookup_key, util}] -> util
_ -> false
end
end
defp ensure_started do
case :ets.info(@table) do
:undefined ->
:erlang.system_flag(:scheduler_wall_time, true)
:ets.new @table, [:named_table, :public]
_ ->
true
end
end
end