mirror of
https://github.com/denoland/deno.git
synced 2024-12-22 07:14:47 -05:00
perf: add Tokio runtime monitor (#19415)
This commit adds ability to print metrics of the Tokio runtime to the console by passing "DENO_TOKIO_METRICS=1" env var. Metrics will be printed every second, but this can be changed by "DENO_TOKIO_METRICS_INTERVAL=500" env var.
This commit is contained in:
parent
1b26f3c726
commit
168eb8e01d
8 changed files with 73 additions and 8 deletions
|
@ -23,4 +23,6 @@ rustflags = [
|
||||||
"clippy::missing_safety_doc",
|
"clippy::missing_safety_doc",
|
||||||
"-D",
|
"-D",
|
||||||
"clippy::undocumented_unsafe_blocks",
|
"clippy::undocumented_unsafe_blocks",
|
||||||
|
"--cfg",
|
||||||
|
"tokio_unstable",
|
||||||
]
|
]
|
||||||
|
|
3
.github/workflows/ci.generate.ts
vendored
3
.github/workflows/ci.generate.ts
vendored
|
@ -5,7 +5,7 @@ import * as yaml from "https://deno.land/std@0.173.0/encoding/yaml.ts";
|
||||||
// Bump this number when you want to purge the cache.
|
// Bump this number when you want to purge the cache.
|
||||||
// Note: the tools/release/01_bump_crate_versions.ts script will update this version
|
// Note: the tools/release/01_bump_crate_versions.ts script will update this version
|
||||||
// automatically via regex, so ensure that this line maintains this format.
|
// automatically via regex, so ensure that this line maintains this format.
|
||||||
const cacheVersion = 37;
|
const cacheVersion = 38;
|
||||||
|
|
||||||
const Runners = (() => {
|
const Runners = (() => {
|
||||||
const ubuntuRunner = "ubuntu-22.04";
|
const ubuntuRunner = "ubuntu-22.04";
|
||||||
|
@ -85,6 +85,7 @@ RUSTFLAGS<<__1
|
||||||
-C link-arg=-Wl,--allow-shlib-undefined
|
-C link-arg=-Wl,--allow-shlib-undefined
|
||||||
-C link-arg=-Wl,--thinlto-cache-dir=$(pwd)/target/release/lto-cache
|
-C link-arg=-Wl,--thinlto-cache-dir=$(pwd)/target/release/lto-cache
|
||||||
-C link-arg=-Wl,--thinlto-cache-policy,cache_size_bytes=700m
|
-C link-arg=-Wl,--thinlto-cache-policy,cache_size_bytes=700m
|
||||||
|
--cfg tokio_unstable
|
||||||
\${{ env.RUSTFLAGS }}
|
\${{ env.RUSTFLAGS }}
|
||||||
__1
|
__1
|
||||||
RUSTDOCFLAGS<<__1
|
RUSTDOCFLAGS<<__1
|
||||||
|
|
7
.github/workflows/ci.yml
vendored
7
.github/workflows/ci.yml
vendored
|
@ -260,6 +260,7 @@ jobs:
|
||||||
-C link-arg=-Wl,--allow-shlib-undefined
|
-C link-arg=-Wl,--allow-shlib-undefined
|
||||||
-C link-arg=-Wl,--thinlto-cache-dir=$(pwd)/target/release/lto-cache
|
-C link-arg=-Wl,--thinlto-cache-dir=$(pwd)/target/release/lto-cache
|
||||||
-C link-arg=-Wl,--thinlto-cache-policy,cache_size_bytes=700m
|
-C link-arg=-Wl,--thinlto-cache-policy,cache_size_bytes=700m
|
||||||
|
--cfg tokio_unstable
|
||||||
${{ env.RUSTFLAGS }}
|
${{ env.RUSTFLAGS }}
|
||||||
__1
|
__1
|
||||||
RUSTDOCFLAGS<<__1
|
RUSTDOCFLAGS<<__1
|
||||||
|
@ -298,7 +299,7 @@ jobs:
|
||||||
~/.cargo/registry/index
|
~/.cargo/registry/index
|
||||||
~/.cargo/registry/cache
|
~/.cargo/registry/cache
|
||||||
~/.cargo/git/db
|
~/.cargo/git/db
|
||||||
key: '37-cargo-home-${{ matrix.os }}-${{ hashFiles(''Cargo.lock'') }}'
|
key: '38-cargo-home-${{ matrix.os }}-${{ hashFiles(''Cargo.lock'') }}'
|
||||||
if: '!(github.event_name == ''pull_request'' && matrix.skip_pr)'
|
if: '!(github.event_name == ''pull_request'' && matrix.skip_pr)'
|
||||||
- name: Restore cache build output (PR)
|
- name: Restore cache build output (PR)
|
||||||
uses: actions/cache/restore@v3
|
uses: actions/cache/restore@v3
|
||||||
|
@ -310,7 +311,7 @@ jobs:
|
||||||
!./target/*/*.zip
|
!./target/*/*.zip
|
||||||
!./target/*/*.tar.gz
|
!./target/*/*.tar.gz
|
||||||
key: never_saved
|
key: never_saved
|
||||||
restore-keys: '37-cargo-target-${{ matrix.os }}-${{ matrix.profile }}-${{ matrix.job }}-'
|
restore-keys: '38-cargo-target-${{ matrix.os }}-${{ matrix.profile }}-${{ matrix.job }}-'
|
||||||
- name: Apply and update mtime cache
|
- name: Apply and update mtime cache
|
||||||
if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (!startsWith(github.ref, ''refs/tags/''))'
|
if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (!startsWith(github.ref, ''refs/tags/''))'
|
||||||
uses: ./.github/mtime_cache
|
uses: ./.github/mtime_cache
|
||||||
|
@ -600,7 +601,7 @@ jobs:
|
||||||
!./target/*/gn_out
|
!./target/*/gn_out
|
||||||
!./target/*/*.zip
|
!./target/*/*.zip
|
||||||
!./target/*/*.tar.gz
|
!./target/*/*.tar.gz
|
||||||
key: '37-cargo-target-${{ matrix.os }}-${{ matrix.profile }}-${{ matrix.job }}-${{ github.sha }}'
|
key: '38-cargo-target-${{ matrix.os }}-${{ matrix.profile }}-${{ matrix.job }}-${{ github.sha }}'
|
||||||
publish-canary:
|
publish-canary:
|
||||||
name: publish canary
|
name: publish canary
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
|
|
13
Cargo.lock
generated
13
Cargo.lock
generated
|
@ -1315,6 +1315,7 @@ dependencies = [
|
||||||
"termcolor",
|
"termcolor",
|
||||||
"test_util",
|
"test_util",
|
||||||
"tokio",
|
"tokio",
|
||||||
|
"tokio-metrics",
|
||||||
"uuid",
|
"uuid",
|
||||||
"winapi",
|
"winapi",
|
||||||
"winres",
|
"winres",
|
||||||
|
@ -5249,6 +5250,18 @@ dependencies = [
|
||||||
"syn 2.0.13",
|
"syn 2.0.13",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tokio-metrics"
|
||||||
|
version = "0.2.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b60ac6224d622f71d0b80546558eedf8ff6c2d3817517a9d3ed87ce24fccf6a6"
|
||||||
|
dependencies = [
|
||||||
|
"futures-util",
|
||||||
|
"pin-project-lite",
|
||||||
|
"tokio",
|
||||||
|
"tokio-stream",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tokio-rustls"
|
name = "tokio-rustls"
|
||||||
version = "0.24.0"
|
version = "0.24.0"
|
||||||
|
|
|
@ -135,6 +135,7 @@ tar = "=0.4.38"
|
||||||
tempfile = "3.4.0"
|
tempfile = "3.4.0"
|
||||||
thiserror = "1.0.40"
|
thiserror = "1.0.40"
|
||||||
tokio = { version = "1.28.1", features = ["full"] }
|
tokio = { version = "1.28.1", features = ["full"] }
|
||||||
|
tokio-metrics = { version = "0.2.2", features = ["rt"] }
|
||||||
tokio-rustls = "0.24.0"
|
tokio-rustls = "0.24.0"
|
||||||
tokio-util = "0.7.4"
|
tokio-util = "0.7.4"
|
||||||
tower-lsp = { version = "=0.17.0", features = ["proposed"] }
|
tower-lsp = { version = "=0.17.0", features = ["proposed"] }
|
||||||
|
|
|
@ -41,7 +41,7 @@ use deno_core::futures::FutureExt;
|
||||||
use deno_core::task::JoinHandle;
|
use deno_core::task::JoinHandle;
|
||||||
use deno_runtime::colors;
|
use deno_runtime::colors;
|
||||||
use deno_runtime::fmt_errors::format_js_error;
|
use deno_runtime::fmt_errors::format_js_error;
|
||||||
use deno_runtime::tokio_util::create_and_run_current_thread;
|
use deno_runtime::tokio_util::create_and_run_current_thread_with_maybe_metrics;
|
||||||
use factory::CliFactory;
|
use factory::CliFactory;
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::env::current_exe;
|
use std::env::current_exe;
|
||||||
|
@ -308,7 +308,8 @@ pub fn main() {
|
||||||
run_subcommand(flags).await
|
run_subcommand(flags).await
|
||||||
};
|
};
|
||||||
|
|
||||||
let exit_code = unwrap_or_exit(create_and_run_current_thread(future));
|
let exit_code =
|
||||||
|
unwrap_or_exit(create_and_run_current_thread_with_maybe_metrics(future));
|
||||||
|
|
||||||
std::process::exit(exit_code);
|
std::process::exit(exit_code);
|
||||||
}
|
}
|
||||||
|
|
|
@ -105,6 +105,7 @@ serde.workspace = true
|
||||||
signal-hook-registry = "1.4.0"
|
signal-hook-registry = "1.4.0"
|
||||||
termcolor = "1.1.3"
|
termcolor = "1.1.3"
|
||||||
tokio.workspace = true
|
tokio.workspace = true
|
||||||
|
tokio-metrics.workspace = true
|
||||||
uuid.workspace = true
|
uuid.workspace = true
|
||||||
|
|
||||||
[target.'cfg(windows)'.dependencies]
|
[target.'cfg(windows)'.dependencies]
|
||||||
|
|
|
@ -3,6 +3,7 @@ use std::fmt::Debug;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
|
||||||
use deno_core::task::MaskFutureAsSend;
|
use deno_core::task::MaskFutureAsSend;
|
||||||
|
use tokio_metrics::RuntimeMonitor;
|
||||||
|
|
||||||
/// Default configuration for tokio. In the future, this method may have different defaults
|
/// Default configuration for tokio. In the future, this method may have different defaults
|
||||||
/// depending on the platform and/or CPU layout.
|
/// depending on the platform and/or CPU layout.
|
||||||
|
@ -47,7 +48,10 @@ pub fn create_basic_runtime() -> tokio::runtime::Runtime {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn create_and_run_current_thread<F, R>(future: F) -> R
|
fn create_and_run_current_thread_inner<F, R>(
|
||||||
|
future: F,
|
||||||
|
metrics_enabled: bool,
|
||||||
|
) -> R
|
||||||
where
|
where
|
||||||
F: std::future::Future<Output = R> + 'static,
|
F: std::future::Future<Output = R> + 'static,
|
||||||
R: Send + 'static,
|
R: Send + 'static,
|
||||||
|
@ -66,6 +70,47 @@ where
|
||||||
// SAFETY: this this is guaranteed to be running on a current-thread executor
|
// SAFETY: this this is guaranteed to be running on a current-thread executor
|
||||||
let future = unsafe { MaskFutureAsSend::new(future) };
|
let future = unsafe { MaskFutureAsSend::new(future) };
|
||||||
|
|
||||||
let join_handle = rt.spawn(future);
|
let join_handle = if metrics_enabled {
|
||||||
|
rt.spawn(async move {
|
||||||
|
let metrics_interval: u64 = std::env::var("DENO_TOKIO_METRICS_INTERVAL")
|
||||||
|
.ok()
|
||||||
|
.and_then(|val| val.parse().ok())
|
||||||
|
.unwrap_or(1000);
|
||||||
|
let handle = tokio::runtime::Handle::current();
|
||||||
|
let runtime_monitor = RuntimeMonitor::new(&handle);
|
||||||
|
tokio::spawn(async move {
|
||||||
|
for interval in runtime_monitor.intervals() {
|
||||||
|
println!("{:#?}", interval);
|
||||||
|
// wait 500ms
|
||||||
|
tokio::time::sleep(std::time::Duration::from_millis(
|
||||||
|
metrics_interval,
|
||||||
|
))
|
||||||
|
.await;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
future.await
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
rt.spawn(future)
|
||||||
|
};
|
||||||
rt.block_on(join_handle).unwrap().into_inner()
|
rt.block_on(join_handle).unwrap().into_inner()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline(always)]
|
||||||
|
pub fn create_and_run_current_thread<F, R>(future: F) -> R
|
||||||
|
where
|
||||||
|
F: std::future::Future<Output = R> + 'static,
|
||||||
|
R: Send + 'static,
|
||||||
|
{
|
||||||
|
create_and_run_current_thread_inner(future, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline(always)]
|
||||||
|
pub fn create_and_run_current_thread_with_maybe_metrics<F, R>(future: F) -> R
|
||||||
|
where
|
||||||
|
F: std::future::Future<Output = R> + 'static,
|
||||||
|
R: Send + 'static,
|
||||||
|
{
|
||||||
|
let metrics_enabled = std::env::var("DENO_TOKIO_METRICS").ok().is_some();
|
||||||
|
create_and_run_current_thread_inner(future, metrics_enabled)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue