summaryrefslogtreecommitdiff
path: root/lib/runtime_tools/doc
diff options
context:
space:
mode:
authorSverker Eriksson <sverker@erlang.org>2022-01-11 23:13:01 +0100
committerSverker Eriksson <sverker@erlang.org>2022-01-11 23:13:01 +0100
commitd33bb24ef66be325282fc75bee00dec066e6c11c (patch)
tree77a2e4904142bdeb165414609c53d8a6e40715c0 /lib/runtime_tools/doc
parenta9225fd951aec7271839cba732cb759db24a84d7 (diff)
parent3ebb48c8c8e37987f71d02633ce8020af8d3ea9e (diff)
downloaderlang-d33bb24ef66be325282fc75bee00dec066e6c11c.tar.gz
Merge branch 'sverker/scheduler_wall_time-doc' into maint
OTP-17800 OTP-17830 * sverker/scheduler_wall_time-doc: runtime_tools: Add scheduler:get_sample/0 and get_sample_all/0 runtime_tools: Fix bug in scheduler:utilization(Seconds) erts: Clarify system_flag(scheduler_wall_time,_) docs
Diffstat (limited to 'lib/runtime_tools/doc')
-rw-r--r--lib/runtime_tools/doc/src/scheduler.xml153
1 files changed, 130 insertions, 23 deletions
diff --git a/lib/runtime_tools/doc/src/scheduler.xml b/lib/runtime_tools/doc/src/scheduler.xml
index 5dd721e357..e8024e00ce 100644
--- a/lib/runtime_tools/doc/src/scheduler.xml
+++ b/lib/runtime_tools/doc/src/scheduler.xml
@@ -35,12 +35,52 @@
<module since="OTP 21.0">scheduler</module>
<modulesummary>Measure scheduler utilization</modulesummary>
<description>
- <p>This module contains utility functions for easier measurement and
- calculation of scheduler utilization, otherwise obtained from calling the
- more primitive <seeerl marker="erts:erlang#statistics_scheduler_wall_time">
- <c>statistics(scheduler_wall_time)</c></seeerl>.</p>
- <p>The simplest usage is to call <seemfa marker="#utilization/1">
- <c>scheduler:utilization(Seconds)</c></seemfa>.</p>
+ <p>
+ This module contains utility functions for easy measurement and
+ calculation of scheduler utilization. It act as a wrapper around the more
+ primitive API <seeerl marker="erts:erlang#statistics_scheduler_wall_time">
+ <c>erlang:statistics(scheduler_wall_time)</c></seeerl>.
+ </p>
+ <p>
+ The simplest usage is to call the blocking <seemfa marker="#utilization/1">
+ <c>scheduler:utilization(Seconds)</c></seemfa>.
+ </p>
+ <p>
+ For non blocking and/or continuous calculation of scheduler utilization,
+ the recommended usage is:
+ </p>
+ <list>
+ <item><p>
+ First call <seeerl marker="erts:erlang#system_flag_scheduler_wall_time">
+ <c>erlang:system_flag(scheduler_wall_time,true)</c></seeerl> to enable
+ scheduler wall time measurements.
+ </p></item>
+ <item><p>
+ Call <seemfa marker="#get_sample/0"><c>get_sample/0</c></seemfa> to
+ collect samples with some time in between.
+ </p></item>
+ <item><p>
+ Call <seemfa marker="#utilization/2"><c>utilization/2</c></seemfa> to
+ calculate the scheduler utilization in the interval between two
+ samples.
+ </p></item>
+ <item><p>
+ When done call
+ <seeerl marker="erts:erlang#system_flag_scheduler_wall_time">
+ <c>erlang:system_flag(scheduler_wall_time,false)</c></seeerl> to disable
+ scheduler wall time measurements and avoid unecessary cpu overhead.
+ </p></item>
+ </list>
+ <p>
+ To get correct values from
+ <seemfa marker="#utilization/2"><c>utilization/2</c></seemfa>, it is
+ important that <c>scheduler_wall_time</c> is kept enabled during the
+ entire interval between the two samples. To ensure this, the process
+ that called <seeerl marker="erts:erlang#system_flag_scheduler_wall_time">
+ <c>erlang:system_flag(scheduler_wall_time,true)</c></seeerl> must be
+ kept alive, as <c>scheduler_wall_time</c> will automatically be disabled
+ if it terminates.
+ </p>
</description>
<datatypes>
@@ -87,11 +127,53 @@
<funcs>
<func>
+ <name name="get_sample" arity="0" since="OTP @OTP-17830@"/>
+ <fsummary>Get scheduler utilization sample.</fsummary>
+ <desc>
+ <p>Returns a scheduler utilization sample for normal and dirty-cpu
+ schedulers. Returns <c>undefined</c> if system flag
+ <seeerl marker="erts:erlang#system_flag_scheduler_wall_time">
+ <c>scheduler_wall_time</c></seeerl> has not been enabled.</p>
+ </desc>
+ </func>
+
+ <func>
+ <name name="get_sample_all" arity="0" since="OTP @OTP-17830@"/>
+ <fsummary>Get scheduler utilization sample.</fsummary>
+ <desc>
+ <p>Return a scheduler utilization sample for all schedulers,
+ including dirty-io schedulers. Returns <c>undefined</c> if system flag
+ <seeerl marker="erts:erlang#system_flag_scheduler_wall_time">
+ <c>scheduler_wall_time</c></seeerl> has not been enabled.</p>
+ </desc>
+ </func>
+
+ <func>
<name name="sample" arity="0" since="OTP 21.0"/>
<fsummary>Get scheduler utilization sample.</fsummary>
<desc>
- <p>Return a scheduler utilization sample for normal and dirty-cpu
- schedulers.</p>
+ <p>
+ Return a scheduler utilization sample for normal and dirty-cpu
+ schedulers. Will call
+ <seeerl marker="erts:erlang#system_flag_scheduler_wall_time">
+ <c>erlang:system_flag(scheduler_wall_time,true)</c></seeerl> first if
+ not already already enabled.
+ </p>
+ <note>
+ <p>
+ This function is <em>not recommended</em> as there is no way to detect if
+ <c>scheduler_wall_time</c> already was enabled or not. If
+ <c>scheduler_wall_time</c> has been disabled between two samples,
+ passing them to <seemfa marker="#utilization/1"><c>utilization/2</c></seemfa>
+ will yield invalid results.
+ </p>
+ <p>
+ Instead use <seemfa marker="#get_sample/0">
+ <c>get_sample/0</c></seemfa> together with
+ <seeerl marker="erts:erlang#system_flag_scheduler_wall_time">
+ <c>erlang:system_flag(scheduler_wall_time,_)</c></seeerl>.
+ </p>
+ </note>
</desc>
</func>
@@ -99,8 +181,22 @@
<name name="sample_all" arity="0" since="OTP 21.0"/>
<fsummary>Get scheduler utilization sample.</fsummary>
<desc>
- <p>Return a scheduler utilization sample for all schedulers,
- including dirty-io schedulers.</p>
+ <p>
+ Return a scheduler utilization sample for all schedulers,
+ including dirty-io schedulers. Will call
+ <seeerl marker="erts:erlang#system_flag_scheduler_wall_time">
+ <c>erlang:system_flag(scheduler_wall_time,true)</c></seeerl> first if
+ not already already enabled.
+ </p>
+ <note>
+ <p>
+ This function is <em>not recommended</em> for same reason as <c>sample/0</c>.
+ Instead use <seemfa marker="#get_sample_all/0">
+ <c>get_sample_all/0</c></seemfa> together with
+ <seeerl marker="erts:erlang#system_flag_scheduler_wall_time">
+ <c>erlang:system_flag(scheduler_wall_time,_)</c></seeerl>.
+ </p>
+ </note>
</desc>
</func>
@@ -108,8 +204,15 @@
<name name="utilization" arity="1" clause_i="1" since="OTP 21.0"/>
<fsummary>Measure scheduler utilizations during a period of time.</fsummary>
<desc>
- <p>Measure utilization for normal and dirty-cpu schedulers during
- <c><anno>Seconds</anno></c> seconds, and then return the result.</p>
+ <p>
+ Measure utilization for normal and dirty-cpu schedulers during
+ <c><anno>Seconds</anno></c> seconds, and then return the result.
+ </p>
+ <p>
+ Will automatically first enable and then disable
+ <seeerl marker="erts:erlang#system_flag_scheduler_wall_time">
+ <c>scheduler_wall_time</c></seeerl>.
+ </p>
</desc>
</func>
@@ -122,11 +225,8 @@
<c>scheduler:utilization(Sample, scheduler:sample_all())</c>.</p>
<note>
<p>
- Scheduler utilization is measured as an average value over a time
- interval, calculated as the difference between two samples. To get
- good useful utilization values at least a couple of seconds should
- have passed between the two samples. For this reason, you should not
- do
+ This function is <em>not recommended</em> as it's so easy to get invalid
+ results without noticing. In particular do not do this:
</p>
<pre>
scheduler:utilization(scheduler:sample()). % DO NOT DO THIS!
@@ -137,10 +237,10 @@ scheduler:utilization(scheduler:sample()). % DO NOT DO THIS!
probably be more misleading than informative.
</p>
<p>
- Instead use <seemfa marker="#utilization/1">
- <c>scheduler:utilization(Seconds)</c></seemfa> or let some time pass
- between <c>Sample=scheduler:sample()</c> and
- <c>scheduler:utilization(Sample)</c>.
+ Instead use <seemfa marker="#utilization/2">
+ <c>scheduler:utilization/2</c></seemfa> and call
+ <seemfa marker="#get_sample/0"><c>get_sample/0</c></seemfa> to get
+ samples with some time in between.
</p>
</note>
</desc>
@@ -152,8 +252,15 @@ scheduler:utilization(scheduler:sample()). % DO NOT DO THIS!
<desc>
<p>Calculates scheduler utilizations for the time interval between
the two samples obtained from calling
- <seemfa marker="#sample/0"><c>sample/0</c></seemfa> or
- <seemfa marker="#sample_all/0"><c>sample_all/0</c></seemfa>.</p>
+ <seemfa marker="#sample/0"><c>get_sample/0</c></seemfa> or
+ <seemfa marker="#sample_all/0"><c>get_sample_all/0</c></seemfa>.</p>
+ <p>
+ This function itself, does not need
+ <seeerl marker="erts:erlang#system_flag_scheduler_wall_time">
+ <c>scheduler_wall_time</c></seeerl> to be enabled. However, for
+ a correct result, <c>scheduler_wall_time</c> must have been enabled
+ during the entire interval between the two samples.
+ </p>
</desc>
</func>