From f9459092940943876dff040ee997515b96fd5d50 Mon Sep 17 00:00:00 2001
From: Rickard Green
The definition of a busy scheduler is when it is not idle and is not scheduling (selecting) a process or port, that is:
@@ -6438,15 +6443,37 @@ lists:map(The list of scheduler information is unsorted and can appear in different order between calls.
+As of ERTS version 9.0, also dirty CPU schedulers will
+ be included in the result. That is, all scheduler threads
+ that are expected to handle CPU bound work. If you also
+ want information about dirty I/O schedulers, use
+
Normal schedulers will have scheduler identifiers in
+ the range
The different types of schedulers handle + specific types of jobs. Every job is assigned to a specific + scheduler type. Jobs can migrate between different schedulers + of the same type, but never between schedulers of different + types. This fact has to be taken under consideration when + evaluating the result returned.
Using
> erlang:system_flag(scheduler_wall_time, true). false > Ts0 = lists:sort(erlang:statistics(scheduler_wall_time)), ok. ok
Some time later the user takes another snapshot and calculates - scheduler-utilization per scheduler, for example:
+ scheduler utilization per scheduler, for example:> Ts1 = lists:sort(erlang:statistics(scheduler_wall_time)), ok. ok @@ -6461,11 +6488,32 @@ ok {7,0.973237033077876}, {8,0.9741297293248656}]
Using the same snapshots to calculate a total - scheduler-utilization:
+ scheduler utilization:> {A, T} = lists:foldl(fun({{_, A0, T0}, {_, A1, T1}}, {Ai,Ti}) -> - {Ai + (A1 - A0), Ti + (T1 - T0)} end, {0, 0}, lists:zip(Ts0,Ts1)), A/T. + {Ai + (A1 - A0), Ti + (T1 - T0)} end, {0, 0}, lists:zip(Ts0,Ts1)), + TotalSchedulerUtilization = A/T. +0.9769136803764825+
Total scheduler utilization will equal
Another (probably more) useful value is to calculate + total scheduler utilization weighted against maximum amount + of available CPU time:
++> WeightedSchedulerUtilization = (TotalSchedulerUtilization + * (erlang:system_info(schedulers) + + erlang:system_info(dirty_cpu_schedulers))) + / erlang:system_info(logical_processors_available). 0.9769136803764825+
This weighted scheduler utilization will reach
As of ERTS version 9.0, the Erlang runtime system + with SMP support will as default have more schedulers + than logical processors. This due to the dirty schedulers.
The same as
+ Dirty IO schedulers will have scheduler identifiers in
+ the range
+ Note that work executing on dirty I/O schedulers
+ are expected to mainly wait for I/O. That is, when you
+ get high scheduler utilization on dirty I/O schedulers,
+ CPU utilization is not expected to be high due to
+ this work. Returns the total amount of active processes and ports in
@@ -6495,7 +6568,7 @@ ok
Returns the total length of the run queues. That is, the number
@@ -6515,7 +6588,7 @@ ok
Returns information about wall clock.