Структура Runtime Metrics
pub struct RuntimeMetrics { /* private fields */ }
rt.Дескриптор метрик среды выполнения.
Этот дескриптор внутри использует подсчёт ссылок, и его можно свободно клонировать. Дескриптор RuntimeMetrics получается с помощью метода Runtime::metrics.
Реализации
impl RuntimeMetrics
pub fn num_workers(&self) -> usize
Возвращает количество рабочих потоков, используемых средой выполнения.
Количество рабочих потоков задаётся настройкой worker_threads для runtime::Builder. При использовании среды выполнения current_thread возвращаемое значение всегда равно 1.
Примеры
use tokio::runtime::Handle;
let metrics = Handle::current().metrics();
let n = metrics.num_workers();
println!("Runtime is using {} workers", n);pub fn num_alive_tasks(&self) -> usize
Возвращает текущее количество активных задач в среде выполнения.
Этот счётчик увеличивается при запуске задачи и уменьшается при её завершении.
Примечание. При использовании многопоточной среды выполнения это значение может быть несогласованным, то есть задачи могут не выполняться, хотя метрика показывает обратное.
Примеры
use tokio::runtime::Handle;
let metrics = Handle::current().metrics();
let n = metrics.num_alive_tasks();
println!("Runtime has {} alive tasks", n);pub fn global_queue_depth(&self) -> usize
Возвращает количество задач, запланированных в данный момент в глобальной очереди среды выполнения.
Задачи, запущенные или получившие уведомление из потока, не принадлежащего среде выполнения, помещаются в глобальную очередь среды выполнения. Эта метрика возвращает текущее количество ожидающих задач в глобальной очереди. Поэтому возвращаемое значение может увеличиваться или уменьшаться по мере планирования и обработки новых задач.
Примеры
use tokio::runtime::Handle;
let metrics = Handle::current().metrics();
let n = metrics.global_queue_depth();
println!("{} tasks currently pending in the runtime's global queue", n);pub fn worker_total_busy_duration(&self, worker: usize) -> Duration
target_has_atomic=64.Возвращает время, в течение которого указанный рабочий поток был занят.
Отсчёт времени занятости рабочего потока начинается с нуля при создании среды выполнения и увеличивается, пока поток обрабатывает задачи. Это значение позволяет оценить нагрузку на указанный поток. Если поток занят большую часть времени, значит, он испытывает нагрузку и будет реже проверять наличие входящих событий.
Таймер монотонно увеличивается. Он никогда не уменьшается и не сбрасывается до нуля.
Аргументы
worker — индекс рабочего потока, для которого выполняется запрос. Значение должно находиться в диапазоне от 0 до num_workers(). Индекс однозначно идентифицирует один рабочий поток и остаётся неизменным в течение всего времени существования экземпляра среды выполнения.
Паника
Метод вызывает панику, если worker обозначает недопустимый рабочий поток, то есть больше или равен num_workers().
Примеры
use tokio::runtime::Handle;
let metrics = Handle::current().metrics();
let n = metrics.worker_total_busy_duration(0);
println!("worker 0 was busy for a total of {:?}", n);pub fn worker_park_count(&self, worker: usize) -> u64
target_has_atomic=64.Возвращает общее количество переходов указанного рабочего потока в состояние ожидания.
Счётчик переходов рабочего потока в состояние ожидания начинается с нуля при создании среды выполнения и увеличивается на единицу каждый раз, когда поток переходит в ожидание новых входящих событий для обработки. Обычно это означает, что поток обработал все ожидающие задачи и в данный момент простаивает.
Счётчик монотонно увеличивается. Он никогда не уменьшается и не сбрасывается до нуля.
Аргументы
worker — индекс рабочего потока, для которого выполняется запрос. Значение должно находиться в диапазоне от 0 до num_workers(). Индекс однозначно идентифицирует один рабочий поток и остаётся неизменным в течение всего времени существования экземпляра среды выполнения.
Паника
Метод вызывает панику, если worker обозначает недопустимый рабочий поток, то есть больше или равен num_workers().
Примеры
use tokio::runtime::Handle;
let metrics = Handle::current().metrics();
let n = metrics.worker_park_count(0);
println!("worker 0 parked {} times", n);pub fn worker_park_unpark_count(&self, worker: usize) -> u64
target_has_atomic=64.Возвращает общее количество переходов указанного рабочего потока в состояние ожидания и обратно.
Счётчик переходов рабочего потока в состояние ожидания и обратно начинается с нуля при создании среды выполнения и увеличивается на единицу каждый раз, когда поток переходит в ожидание новых входящих событий для обработки. Обычно это означает, что поток обработал все ожидающие задачи и в данный момент простаивает. Когда появляется новая задача, поток возобновляет работу, и счётчик переходов в состояние ожидания и обратно снова увеличивается на единицу.
Нечётное значение счётчика означает, что рабочий поток сейчас находится в состоянии ожидания. Чётное значение означает, что рабочий поток сейчас активен.
Счётчик монотонно увеличивается. Он никогда не уменьшается и не сбрасывается до нуля.
Аргументы
worker — индекс рабочего потока, для которого выполняется запрос. Значение должно находиться в диапазоне от 0 до num_workers(). Индекс однозначно идентифицирует один рабочий поток и остаётся неизменным в течение всего времени существования экземпляра среды выполнения.
Паника
Метод вызывает панику, если worker обозначает недопустимый рабочий поток, то есть больше или равен num_workers().
Примеры
use tokio::runtime::Handle;
let metrics = Handle::current().metrics();
let n = metrics.worker_park_unpark_count(0);
println!("worker 0 parked and unparked {} times", n);
if n % 2 == 0 {
println!("worker 0 is active");
} else {
println!("worker 0 is parked");
}pub fn num_blocking_threads(&self) -> usize
tokio_unstable.Возвращает количество дополнительных потоков, созданных средой выполнения.
Количество рабочих потоков задаётся настройкой max_blocking_threads в runtime::Builder.
Примеры
use tokio::runtime::Handle;
let _ = tokio::task::spawn_blocking(move || {
// Stand-in for compute-heavy work or using synchronous APIs
1 + 1
}).await;
let metrics = Handle::current().metrics();
let n = metrics.num_blocking_threads();
println!("Runtime has created {} threads", n);pub fn active_tasks_count(&self) -> usize
Переименовано в num_alive_tasks
tokio_unstable.Переименовано в RuntimeMetrics::num_alive_tasks
pub fn num_idle_blocking_threads(&self) -> usize
tokio_unstable.Возвращает количество простаивающих потоков, созданных средой выполнения для вызовов spawn_blocking.
Примеры
use tokio::runtime::Handle;
#[tokio::main]
async fn main() {
let _ = tokio::task::spawn_blocking(move || {
// Stand-in for compute-heavy work or using synchronous APIs
1 + 1
}).await;
let metrics = Handle::current().metrics();
let n = metrics.num_idle_blocking_threads();
println!("Runtime has {} idle blocking thread pool threads", n);
}pub fn worker_thread_id(&self, worker: usize) -> Option<ThreadId>
tokio_unstable.Возвращает идентификатор указанного рабочего потока.
Возвращаемое значение равно None, если рабочий поток ещё не завершил запуск.
Если требуются дополнительные сведения о потоке, например его собственный идентификатор, их можно собрать в on_thread_start и сопоставить с идентификатором потока.
Аргументы
worker — индекс запрашиваемого рабочего потока. Значение должно находиться в диапазоне от 0 до num_workers(). Индекс однозначно идентифицирует один рабочий поток и остаётся его идентификатором в течение всего срока жизни экземпляра среды выполнения.
Паника
Метод вызывает панику, если worker соответствует недопустимому рабочему потоку, то есть больше или равно num_workers().
Примеры
use tokio::runtime::Handle;
let metrics = Handle::current().metrics();
let id = metrics.worker_thread_id(0);
println!("worker 0 has id {:?}", id);pub fn worker_local_queue_depth(&self, worker: usize) -> usize
tokio_unstable.Возвращает количество задач, запланированных в данный момент в локальной очереди указанного рабочего потока.
Задачи, созданные или получившие уведомление из потока среды выполнения, планируются с использованием локальной очереди этого рабочего потока. Эта метрика возвращает текущее количество ожидающих задач в локальной очереди рабочего потока. Поэтому возвращаемое значение может увеличиваться или уменьшаться по мере планирования и обработки новых задач.
Аргументы
worker — индекс запрашиваемого рабочего потока. Значение должно находиться в диапазоне от 0 до num_workers(). Индекс однозначно идентифицирует один рабочий поток и остаётся его идентификатором в течение всего срока жизни экземпляра среды выполнения.
Паника
Метод вызывает панику, если worker соответствует недопустимому рабочему потоку, то есть больше или равно num_workers().
Примеры
use tokio::runtime::Handle;
let metrics = Handle::current().metrics();
let n = metrics.worker_local_queue_depth(0);
println!("{} tasks currently pending in worker 0's local queue", n);pub fn poll_time_histogram_enabled(&self) -> bool
tokio_unstable.Возвращает true, если среда выполнения отслеживает распределение времени опроса задач.
По умолчанию время опроса задач не регистрируется, поскольку для этого требуется вызывать Instant::now() дважды для каждого опроса задачи. Эта функция включается вызовом enable_metrics_poll_time_histogram() при создании среды выполнения.
Примеры
use tokio::runtime::{self, Handle};
fn main() {
runtime::Builder::new_current_thread()
.enable_metrics_poll_time_histogram()
.build()
.unwrap()
.block_on(async {
let metrics = Handle::current().metrics();
let enabled = metrics.poll_time_histogram_enabled();
println!("Tracking task poll time distribution: {:?}", enabled);
});
}pub fn poll_time_histogram_num_buckets(&self) -> usize
tokio_unstable.Возвращает количество корзин гистограммы, отслеживающих распределение времени опроса задач.
Это значение настраивается вызовом metrics_poll_time_histogram_configuration() при создании среды выполнения.
Примеры
use tokio::runtime::{self, Handle};
fn main() {
runtime::Builder::new_current_thread()
.enable_metrics_poll_time_histogram()
.build()
.unwrap()
.block_on(async {
let metrics = Handle::current().metrics();
let buckets = metrics.poll_time_histogram_num_buckets();
println!("Histogram buckets: {:?}", buckets);
});
}pub fn poll_time_histogram_bucket_range(&self, bucket: usize) -> Range<Duration>
tokio_unstable.Возвращает диапазон времени опроса задач, отслеживаемый указанной корзиной.
Это значение настраивается вызовом metrics_poll_time_histogram_configuration() при создании среды выполнения.
Панические ошибки
Метод вызывает панику, если bucket обозначает недопустимый индекс корзины, то есть больше или равен poll_time_histogram_num_buckets().
Примеры
use tokio::runtime::{self, Handle};
fn main() {
runtime::Builder::new_current_thread()
.enable_metrics_poll_time_histogram()
.build()
.unwrap()
.block_on(async {
let metrics = Handle::current().metrics();
let buckets = metrics.poll_time_histogram_num_buckets();
for i in 0..buckets {
let range = metrics.poll_time_histogram_bucket_range(i);
println!("Histogram bucket {} range: {:?}", i, range);
}
});
}pub fn blocking_queue_depth(&self) -> usize
tokio_unstable.Возвращает количество задач, запланированных в данный момент в пуле блокирующих потоков, созданных с помощью spawn_blocking.
Эта метрика возвращает текущее количество ожидающих задач в пуле блокирующих потоков. Поэтому возвращаемое значение может увеличиваться или уменьшаться по мере планирования и обработки новых задач.
Примеры
use tokio::runtime::Handle;
let metrics = Handle::current().metrics();
let n = metrics.blocking_queue_depth();
println!("{} tasks currently pending in the blocking thread pool", n);pub fn spawned_tasks_count(&self) -> u64
target_has_atomic=64 и tokio_unstable.Возвращает количество задач, созданных в этой среде выполнения с момента её создания.
При создании среды выполнения счётчик равен нулю и увеличивается на единицу при каждом создании задачи.
Счётчик монотонно возрастает. Он никогда не уменьшается и не сбрасывается до нуля.
Примеры
use tokio::runtime::Handle;
let metrics = Handle::current().metrics();
let n = metrics.spawned_tasks_count();
println!("Runtime has had {} tasks spawned", n);pub fn remote_schedule_count(&self) -> u64
target_has_atomic=64 и tokio_unstable.Возвращает количество задач, запланированных извне среды выполнения.
При создании среды выполнения счётчик удалённого планирования равен нулю и увеличивается на единицу каждый раз, когда задача пробуждается извне среды выполнения. Обычно это означает, что задача создаётся или получает уведомление из потока, не принадлежащего среде выполнения, и должна быть помещена в очередь внедрения Runtime, что обычно выполняется медленнее.
Счётчик монотонно возрастает. Он никогда не уменьшается и не сбрасывается до нуля.
Примеры
use tokio::runtime::Handle;
let metrics = Handle::current().metrics();
let n = metrics.remote_schedule_count();
println!("{} tasks were scheduled from outside the runtime", n);pub fn budget_forced_yield_count(&self) -> u64
target_has_atomic=64 и tokio_unstable.Возвращает количество случаев, когда задачи принудительно уступали управление планировщику после исчерпания выделенного им бюджета.
При создании среды выполнения счётчик равен нулю и увеличивается на единицу каждый раз, когда задача уступает управление из-за исчерпания своего бюджета.
Счётчик монотонно возрастает. Он никогда не уменьшается и не сбрасывается до нуля.
pub fn worker_noop_count(&self, worker: usize) -> u64
target_has_atomic=64 и tokio_unstable.Возвращает количество случаев, когда заданный рабочий поток был выведен из состояния парковки, но не выполнил никакой работы и снова перешёл в состояние парковки.
Счётчик холостых пробуждений рабочего потока равен нулю при создании runtime и увеличивается на единицу каждый раз, когда рабочий поток просыпается, не обнаруживает новых задач и снова засыпает. Это указывает на ложное пробуждение.
Значение счётчика только увеличивается. Оно никогда не уменьшается и не сбрасывается до нуля.
Аргументы
worker — это индекс запрашиваемого рабочего потока. Заданное значение должно находиться в диапазоне от 0 до num_workers(). Индекс однозначно идентифицирует один рабочий поток и сохраняет эту идентификацию на протяжении всего времени существования экземпляра runtime.
Паника
Метод вызывает панику, если worker обозначает недопустимый рабочий поток, то есть больше или равно num_workers().
Примеры
use tokio::runtime::Handle;
let metrics = Handle::current().metrics();
let n = metrics.worker_noop_count(0);
println!("worker 0 had {} no-op unparks", n);pub fn worker_steal_count(&self, worker: usize) -> u64
target_has_atomic=64 и tokio_unstable.Возвращает количество задач, которые заданный рабочий поток забрал у другого рабочего потока.
Эта метрика применима только к многопоточному runtime и всегда возвращает 0 при использовании runtime текущего потока.
Счётчик похищенных задач рабочего потока равен нулю при создании runtime и увеличивается на N каждый раз, когда рабочий поток обработал свою запланированную очередь и успешно забрал N дополнительных ожидающих задач у другого рабочего потока.
Значение счётчика только увеличивается. Оно никогда не уменьшается и не сбрасывается до нуля.
Аргументы
worker — это индекс запрашиваемого рабочего потока. Заданное значение должно находиться в диапазоне от 0 до num_workers(). Индекс однозначно идентифицирует один рабочий поток и сохраняет эту идентификацию на протяжении всего времени существования экземпляра runtime.
Паника
Метод вызывает панику, если worker обозначает недопустимый рабочий поток, то есть больше или равно num_workers().
Примеры
use tokio::runtime::Handle;
let metrics = Handle::current().metrics();
let n = metrics.worker_steal_count(0);
println!("worker 0 has stolen {} tasks", n);pub fn worker_steal_operations(&self, worker: usize) -> u64
target_has_atomic=64 и tokio_unstable.Возвращает количество случаев, когда заданный рабочий поток забирал задачи у другого рабочего потока.
Эта метрика применима только к многопоточному runtime и всегда возвращает 0 при использовании runtime текущего потока.
Счётчик похищенных задач рабочего потока равен нулю при создании runtime и увеличивается на единицу каждый раз, когда рабочий поток обработал свою запланированную очередь и успешно забрал дополнительные ожидающие задачи у другого рабочего потока.
Значение счётчика только увеличивается. Оно никогда не уменьшается и не сбрасывается до нуля.
Аргументы
worker — это индекс запрашиваемого рабочего потока. Заданное значение должно находиться в диапазоне от 0 до num_workers(). Индекс однозначно идентифицирует один рабочий поток и сохраняет эту идентификацию на протяжении всего времени существования экземпляра runtime.
Паника
Метод вызывает панику, если worker обозначает недопустимый рабочий поток, то есть больше или равно num_workers().
Примеры
use tokio::runtime::Handle;
let metrics = Handle::current().metrics();
let n = metrics.worker_steal_operations(0);
println!("worker 0 has stolen tasks {} times", n);pub fn worker_poll_count(&self, worker: usize) -> u64
target_has_atomic=64 и tokio_unstable.Возвращает количество задач, которые опросил заданный рабочий поток.
Счётчик опросов рабочего потока равен нулю при создании runtime и увеличивается на единицу каждый раз, когда рабочий поток опрашивает запланированную задачу.
Значение счётчика только увеличивается. Оно никогда не уменьшается и не сбрасывается до нуля.
Аргументы
worker — это индекс запрашиваемого рабочего потока. Заданное значение должно находиться в диапазоне от 0 до num_workers(). Индекс однозначно идентифицирует один рабочий поток и сохраняет эту идентификацию на протяжении всего времени существования экземпляра runtime.
Паника
Метод вызывает панику, если worker обозначает недопустимый рабочий поток, то есть больше или равно num_workers().
Примеры
use tokio::runtime::Handle;
let metrics = Handle::current().metrics();
let n = metrics.worker_poll_count(0);
println!("worker 0 has polled {} tasks", n);pub fn worker_local_schedule_count(&self, worker: usize) -> u64
target_has_atomic=64 and tokio_unstable.Возвращает количество задач, запланированных изнутри среды выполнения в локальной очереди указанного рабочего потока.
Счётчик локального планирования начинается с нуля при создании среды выполнения и увеличивается на единицу каждый раз, когда задача пробуждается изнутри среды выполнения на указанном рабочем потоке. Обычно это означает, что задача создаётся или получает уведомление из потока среды выполнения и помещается в локальную очередь рабочего потока.
Значение счётчика монотонно возрастает. Оно никогда не уменьшается и не сбрасывается до нуля.
Аргументы
worker — индекс рабочего потока, для которого запрашиваются данные. Значение должно находиться в диапазоне от 0 до num_workers(). Индекс однозначно идентифицирует один рабочий поток и будет идентифицировать его на протяжении всего срока существования экземпляра среды выполнения.
Паника
Метод вызывает панику, если worker обозначает недопустимый рабочий поток, то есть больше или равно num_workers().
Примеры
use tokio::runtime::Handle;
let metrics = Handle::current().metrics();
let n = metrics.worker_local_schedule_count(0);
println!("{} tasks were scheduled on the worker's local queue", n);pub fn worker_overflow_count(&self, worker: usize) -> u64
target_has_atomic=64 and tokio_unstable.Возвращает количество случаев, когда локальная очередь указанного рабочего потока была переполнена.
Эта метрика применима только к многопланировщику.
Счётчик переполнения рабочего потока начинается с нуля при создании среды выполнения и увеличивается на единицу каждый раз, когда рабочий поток пытается запланировать задачу локально, но его локальная очередь заполнена. В этом случае половина локальной очереди перемещается в очередь внедрения.
Значение счётчика монотонно возрастает. Оно никогда не уменьшается и не сбрасывается до нуля.
Аргументы
worker — индекс рабочего потока, для которого запрашиваются данные. Значение должно находиться в диапазоне от 0 до num_workers(). Индекс однозначно идентифицирует один рабочий поток и будет идентифицировать его на протяжении всего срока существования экземпляра среды выполнения.
Паника
Метод вызывает панику, если worker обозначает недопустимый рабочий поток, то есть больше или равно num_workers().
Примеры
use tokio::runtime::Handle;
let metrics = Handle::current().metrics();
let n = metrics.worker_overflow_count(0);
println!("worker 0 has overflowed its queue {} times", n);pub fn poll_time_histogram_bucket_count( &self, worker: usize, bucket: usize, ) -> u64
target_has_atomic=64 and tokio_unstable.Возвращает количество случаев, когда указанный рабочий поток опрашивал задачи, длительность опроса которых попадала в диапазон указанного интервала гистограммы.
Каждый рабочий поток ведёт собственную гистограмму, а счётчики всех её интервалов начинаются с нуля при создании среды выполнения. При каждом опросе задачи рабочий поток измеряет длительность опроса и увеличивает соответствующий счётчик на 1.
Счётчик каждого интервала монотонно возрастает. Он никогда не уменьшается и не сбрасывается до нуля.
Аргументы
worker — индекс рабочего потока, для которого запрашиваются данные. Значение должно находиться в диапазоне от 0 до num_workers(). Индекс однозначно идентифицирует один рабочий поток и будет идентифицировать его на протяжении всего срока существования экземпляра среды выполнения.
bucket — индекс интервала гистограммы, для которого запрашиваются данные. Интервал относится к конкретному рабочему потоку. Диапазон, соответствующий интервалу, можно получить, вызвав poll_time_histogram_bucket_range(). Диапазоны интервалов у всех рабочих потоков одинаковы.
Паника
Метод вызывает панику, если worker обозначает недопустимый рабочий поток, то есть больше или равно num_workers(), либо если bucket обозначает недопустимый интервал гистограммы.
Примеры
use tokio::runtime::{self, Handle};
fn main() {
runtime::Builder::new_current_thread()
.enable_metrics_poll_time_histogram()
.build()
.unwrap()
.block_on(async {
let metrics = Handle::current().metrics();
let buckets = metrics.poll_time_histogram_num_buckets();
for worker in 0..metrics.num_workers() {
for i in 0..buckets {
let count = metrics.poll_time_histogram_bucket_count(worker, i);
println!("Poll count {}", count);
}
}
});
}pub fn worker_mean_poll_time(&self, worker: usize) -> Duration
target_has_atomic=64 and tokio_unstable.Возвращает среднюю длительность опроса задач в наносекундах.
Это экспоненциально взвешенное скользящее среднее. В настоящее время эта метрика предоставляется только многопоточной средой выполнения.
Аргументы
worker — индекс рабочего потока, для которого запрашиваются данные. Значение должно находиться в диапазоне от 0 до num_workers(). Индекс однозначно идентифицирует один рабочий поток и будет идентифицировать его на протяжении всего срока существования экземпляра среды выполнения.
Паника
Метод вызывает панику, если worker обозначает недопустимый рабочий поток, то есть больше или равно num_workers().
Примеры
use tokio::runtime::Handle;
let metrics = Handle::current().metrics();
let n = metrics.worker_mean_poll_time(0);
println!("worker 0 has a mean poll time of {:?}", n);pub fn schedule_latency_histogram_enabled(&self) -> bool
schedule-latency.Возвращает true, если среда выполнения отслеживает распределение задержек планирования задач.
Задержки планирования задач по умолчанию не измеряются, поскольку для этого требуется вызывать Instant::now() при планировании задачи и при её опросе. Функция включается вызовом enable_metrics_schedule_latency_histogram() при создании среды выполнения.
Примеры
use tokio::runtime::{self, Handle};
fn main() {
runtime::Builder::new_current_thread()
.enable_metrics_schedule_latency_histogram()
.build()
.unwrap()
.block_on(async {
let metrics = Handle::current().metrics();
let enabled = metrics.schedule_latency_histogram_enabled();
println!("Tracking task schedule latency distribution: {:?}", enabled);
});
}pub fn schedule_latency_histogram_num_buckets(&self) -> usize
schedule-latency.Возвращает количество интервалов гистограммы, отслеживающих распределение задержек планирования задач.
Это значение задаётся вызовом metrics_schedule_latency_histogram_configuration() при создании среды выполнения.
Примеры
use tokio::runtime::{self, Handle};
fn main() {
runtime::Builder::new_current_thread()
.enable_metrics_schedule_latency_histogram()
.build()
.unwrap()
.block_on(async {
let metrics = Handle::current().metrics();
let buckets = metrics.schedule_latency_histogram_num_buckets();
println!("Histogram buckets: {:?}", buckets);
});
}pub fn schedule_latency_histogram_bucket_range( &self, bucket: usize, ) -> Range<Duration>
schedule-latency.Возвращает диапазон задержек планирования задач, отслеживаемый указанным интервалом.
Это значение задаётся вызовом metrics_schedule_latency_histogram_configuration() при создании среды выполнения.
Панические завершения
Метод вызывает панику, если bucket представляет недопустимый индекс интервала, то есть больше или равен schedule_latency_histogram_num_buckets().
Примеры
use tokio::runtime::{self, Handle};
fn main() {
runtime::Builder::new_current_thread()
.enable_metrics_schedule_latency_histogram()
.build()
.unwrap()
.block_on(async {
let metrics = Handle::current().metrics();
let buckets = metrics.schedule_latency_histogram_num_buckets();
for i in 0..buckets {
let range = metrics.schedule_latency_histogram_bucket_range(i);
println!("Histogram bucket {} range: {:?}", i, range);
}
});
}pub fn schedule_latency_histogram_bucket_count( &self, worker: usize, bucket: usize, ) -> u64
schedule-latency.Возвращает количество случаев, когда указанный рабочий поток опрашивал задачи с задержкой планирования в пределах диапазона указанного интервала.
Каждый рабочий поток ведёт собственную гистограмму, и счётчики каждого интервала начинаются с нуля при создании среды выполнения. Каждый раз, когда рабочий поток опрашивает задачу, он отслеживает время, прошедшее между планированием задачи и её опросом, и увеличивает соответствующий счётчик на 1.
Счётчик каждого интервала монотонно возрастает. Он никогда не уменьшается и не сбрасывается до нуля.
Аргументы
worker — индекс запрашиваемого рабочего потока. Указанное значение должно находиться в диапазоне от 0 до num_workers(). Индекс однозначно определяет один рабочий поток и продолжает идентифицировать его в течение всего времени существования экземпляра среды выполнения.
bucket — индекс запрашиваемого интервала. Интервал относится к конкретному рабочему потоку. Диапазон, представленный интервалом, можно запросить с помощью schedule_latency_histogram_bucket_range(). Для всех рабочих потоков используются одинаковые диапазоны интервалов.
Панические завершения
Метод вызывает панику, если worker представляет недопустимый рабочий поток, то есть больше или равен num_workers(), либо если bucket представляет недопустимый интервал.
Примеры
use tokio::runtime::{self, Handle};
fn main() {
runtime::Builder::new_current_thread()
.enable_metrics_schedule_latency_histogram()
.build()
.unwrap()
.block_on(async {
let metrics = Handle::current().metrics();
let buckets = metrics.schedule_latency_histogram_num_buckets();
for worker in 0..metrics.num_workers() {
for i in 0..buckets {
let range = metrics.schedule_latency_histogram_bucket_range(i);
let count = metrics.schedule_latency_histogram_bucket_count(worker, i);
println!("{} tasks encountered a scheduling latency between {}us and {}us", count, range.start.as_micros(), range.end.as_micros());
}
}
});
}pub fn io_driver_fd_registered_count(&self) -> u64
target_has_atomic=64 и tokio_unstable при включённой функции crate net.Возвращает количество файловых дескрипторов, зарегистрированных в драйвере ввода-вывода среды выполнения.
Примеры
use tokio::runtime::Handle;
#[tokio::main]
async fn main() {
let metrics = Handle::current().metrics();
let registered_fds = metrics.io_driver_fd_registered_count();
println!("{} fds have been registered with the runtime's I/O driver.", registered_fds);
let deregistered_fds = metrics.io_driver_fd_deregistered_count();
let current_fd_count = registered_fds - deregistered_fds;
println!("{} fds are currently registered by the runtime's I/O driver.", current_fd_count);
}pub fn io_driver_fd_deregistered_count(&self) -> u64
target_has_atomic=64 и tokio_unstable и функции crate net.Возвращает количество файловых дескрипторов, снятых с регистрации драйвером ввода-вывода среды выполнения.
Примеры
use tokio::runtime::Handle;
#[tokio::main]
async fn main() {
let metrics = Handle::current().metrics();
let n = metrics.io_driver_fd_deregistered_count();
println!("{} fds have been deregistered by the runtime's I/O driver.", n);
}pub fn io_driver_ready_count(&self) -> u64
target_has_atomic=64 и tokio_unstable и функции crate net.Возвращает количество готовых событий, обработанных драйвером ввода-вывода среды выполнения.
Примеры
use tokio::runtime::Handle;
#[tokio::main]
async fn main() {
let metrics = Handle::current().metrics();
let n = metrics.io_driver_ready_count();
println!("{} ready events processed by the runtime's I/O driver.", n);
}Реализации трейтов
impl Clone for RuntimeMetrics
fn clone(&self) -> RuntimeMetrics
fn clone_from(&mut self, source: &Self)
source. Подробнее
Автоматические реализации трейтов
impl Freeze for RuntimeMetrics
impl RefUnwindSafe for RuntimeMetrics
impl Send for RuntimeMetrics
impl Sync for RuntimeMetrics
impl Unpin for RuntimeMetrics
impl UnsafeUnpin for RuntimeMetrics
impl UnwindSafe for RuntimeMetrics
Обобщённые реализации
impl<T> BorrowMut<T> for Twhere T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
impl<T> CloneToUninit for Twhere T: Clone,
unsafe fn clone_to_uninit(&self, dest: *mut u8)
clone_to_uninit)
impl<T> Instrument for T
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
impl<T> ToOwned for Twhere T: Clone,
type Owned = T
fn to_owned(&self) -> T
fn clone_into(&self, target: &mut T)
impl<T> WithSubscriber for T
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ
Subscriber к этому типу и возвращает обёртку WithDispatch. Подробнее
MIT License
Copyright © Tokio Contributors
https://docs.rs/tokio/1.53.1/tokio/runtime/struct.RuntimeMetrics.html