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. This option is ignored if the emulator does not have threading
- support enabled. This option is experimental and
- is supported only if the emulator was configured and built with
- support for dirty schedulers enabled (it is disabled by default).
This option is ignored if the emulator does not have threading - support enabled. This option is experimental and - is supported only if the emulator was configured and built with - support for dirty schedulers enabled (it is disabled by default).
+ support enabled.This option is ignored if the emulator does not have threading - support enabled. This option is experimental and - is supported only if the emulator was configured and built with - support for dirty schedulers enabled (it is disabled by default).
+ support enabled.The dirty NIF functionality described here
- is experimental. Dirty NIF support is available only when
- the emulator is configured with dirty schedulers enabled. This
- feature is disabled by default. The Erlang runtime
- without SMP support does not support dirty schedulers even when
- the dirty scheduler support is enabled. To check at runtime for
- the presence of dirty scheduler threads, code can use the
- Dirty NIF support is available only when the emulator is
+ configured with dirty scheduler support. As of ERTS version
+ 9.0, dirty scheduler support is enabled by default on the
+ runtime system with SMP support. The Erlang runtime without
+ SMP support does not support dirty schedulers even
+ when the dirty scheduler support is explicitly enabled. To
+ check at runtime for the presence of dirty scheduler threads,
+ code can use the
A NIF that cannot be split and cannot execute in a millisecond @@ -642,9 +642,6 @@ typedef struct {
The dirty NIF functionality described here is - experimental. You have to enable support for dirty - schedulers when building OTP to try out the functionality.
If the dirty NIF is expected to be CPU-bound, its
The dirty NIF functionality described here is - experimental. You have to enable support for dirty - schedulers when building OTP to try out the functionality.
Must be set to
The dirty schedulers functionality is experimental. - Enable support for dirty schedulers when building OTP to - try out the functionality.
-For more information, see
Notice that the dirty schedulers functionality is - experimental. Enable support for dirty schedulers when - building OTP to try out the functionality.
See also
Notice that the dirty schedulers functionality is - experimental. Enable support for dirty schedulers when - building OTP to try out the functionality.
For more information, see
This value can be set at startup by passing command-line
argument
Notice that the dirty schedulers functionality is - experimental. Enable support for dirty schedulers when - building OTP to try out the functionality.
For more information, see