From 00dba56c07c5daec702bf37334cdf902f1f743cd Mon Sep 17 00:00:00 2001 From: Divy Srivastava Date: Thu, 13 Oct 2022 13:57:21 +0000 Subject: [PATCH] feat: experimental io_uring support Towards https://github.com/denoland/deno/issues/16232 --- Cargo.lock | 25 ++ a.svg | 415 ++++++++++++++++++++++ cli/bench/read_file.js | 21 ++ cli/bench/write_file.js | 7 +- core/Cargo.toml | 1 + dump.md | 15 + ext/net/Cargo.toml | 1 + ext/net/ops.rs | 110 ++++-- runtime/Cargo.toml | 2 + runtime/ops/asyncfs/iouring/mod.rs | 159 +++++++++ runtime/ops/asyncfs/mod.rs | 10 + runtime/ops/asyncfs/spawn_blocking/mod.rs | 81 +++++ runtime/ops/fs.rs | 89 +---- runtime/ops/mod.rs | 1 + runtime/tokio_util.rs | 9 + serde_v8/Cargo.toml | 6 + serde_v8/magic/buffer.rs | 15 + 17 files changed, 854 insertions(+), 113 deletions(-) create mode 100644 a.svg create mode 100644 cli/bench/read_file.js create mode 100644 dump.md create mode 100644 runtime/ops/asyncfs/iouring/mod.rs create mode 100644 runtime/ops/asyncfs/mod.rs create mode 100644 runtime/ops/asyncfs/spawn_blocking/mod.rs diff --git a/Cargo.lock b/Cargo.lock index 68212f05bc9421..ff38a20061b8b8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1182,6 +1182,7 @@ dependencies = [ "serde", "socket2", "tokio", + "tokio-uring", "trust-dns-proto", "trust-dns-resolver", ] @@ -1257,6 +1258,7 @@ dependencies = [ "termcolor", "test_util", "tokio", + "tokio-uring", "uuid", "winapi 0.3.9", "winres", @@ -2442,6 +2444,16 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ea37f355c05dde75b84bba2d767906ad522e97cd9e2eef2be7a4ab7fb442c06" +[[package]] +name = "io-uring" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d32c9c053ad47572e11da8bce622ed4c9ae9dedac5b7f678a2e876d1494d4c4" +dependencies = [ + "bitflags", + "libc", +] + [[package]] name = "ipconfig" version = "0.3.0" @@ -4076,6 +4088,7 @@ dependencies = [ "serde_bytes", "serde_json", "smallvec", + "tokio-uring", "v8", ] @@ -5010,6 +5023,18 @@ dependencies = [ "webpki-roots", ] +[[package]] +name = "tokio-uring" +version = "0.3.0" +dependencies = [ + "io-uring", + "libc", + "scoped-tls", + "slab", + "socket2", + "tokio", +] + [[package]] name = "tokio-util" version = "0.7.4" diff --git a/a.svg b/a.svg new file mode 100644 index 00000000000000..e5b1104a8a427c --- /dev/null +++ b/a.svg @@ -0,0 +1,415 @@ +Flame Graph Reset ZoomSearch [ld-linux-x86-64.so.2] (1 samples, 0.05%)[ld-linux-x86-64.so.2] (1 samples, 0.05%)[ld-linux-x86-64.so.2] (2 samples, 0.10%)[ld-linux-x86-64.so.2] (2 samples, 0.10%)[ld-linux-x86-64.so.2] (2 samples, 0.10%)__cpu_indicator_init (1 samples, 0.05%)Builtins_AsyncFunctionAwaitUncaught (1 samples, 0.05%)asm_exc_page_fault (1 samples, 0.05%)exc_page_fault (1 samples, 0.05%)do_user_addr_fault (1 samples, 0.05%)handle_mm_fault (1 samples, 0.05%)__handle_mm_fault (1 samples, 0.05%)handle_pte_fault (1 samples, 0.05%)do_anonymous_page (1 samples, 0.05%)alloc_pages_vma (1 samples, 0.05%)<core::future::from_generator::GenFuture<T> as core::future::future::Future>::poll (1 samples, 0.05%)<&str as alloc::ffi::c_str::CString::new::SpecNewImpl>::spec_new_impl (1 samples, 0.05%)alloc::ffi::c_str::CString::new::spec_new_impl_bytes (1 samples, 0.05%)core::num::<impl usize>::checked_add (1 samples, 0.05%)core::num::<impl usize>::overflowing_add (1 samples, 0.05%)<serde_v8::magic::buffer::ZeroCopyBuf as serde_v8::magic::transl8::FromV8>::from_v8 (1 samples, 0.05%)<serde_v8::magic::v8slice::V8Slice as serde_v8::magic::transl8::FromV8>::from_v8 (1 samples, 0.05%)Builtins_CEntry_Return1_DontSaveFPRegs_ArgvOnStack_BuiltinExit (3 samples, 0.15%)v8::internal::Builtin_HandleApiCall (3 samples, 0.15%)v8::internal::(anonymous namespace)::HandleApiCallHelper<false> (3 samples, 0.15%)<extern "C" fn(A0) .> R as v8::support::CFnFrom<F>>::mapping::c_fn (3 samples, 0.15%)v8__FunctionCallbackInfo__GetArgument (1 samples, 0.05%)Builtins_FastNewFunctionContextFunction (1 samples, 0.05%)asm_exc_page_fault (1 samples, 0.05%)exc_page_fault (1 samples, 0.05%)handle_mm_fault (1 samples, 0.05%)Builtins_InterpreterEntryTrampoline (1 samples, 0.05%)Builtins_CompileLazy (1 samples, 0.05%)Builtins_CEntry_Return1_DontSaveFPRegs_ArgvOnStack_NoBuiltinExit (1 samples, 0.05%)v8::internal::Runtime_CompileLazy (1 samples, 0.05%)v8::internal::Compiler::Compile (1 samples, 0.05%)v8::internal::Compiler::Compile (1 samples, 0.05%)v8::internal::parsing::ParseFunction (1 samples, 0.05%)v8::internal::Parser::ParseFunction (1 samples, 0.05%)v8::internal::DeclarationScope::Analyze (1 samples, 0.05%)v8::internal::DeclarationScope::AllocateVariables (1 samples, 0.05%)v8::internal::Scope::ResolveVariablesRecursively (1 samples, 0.05%)v8::internal::Scope::ResolveVariablesRecursively (1 samples, 0.05%)v8::internal::Scope::ResolveVariablesRecursively (1 samples, 0.05%)v8::internal::Scope::ResolveVariablesRecursively (1 samples, 0.05%)v8::internal::Scope::ResolveVariablesRecursively (1 samples, 0.05%)v8::internal::Scope::Lookup<(v8::internal::Scope::ScopeLookupMode)0> (1 samples, 0.05%)Builtins_KeyedLoadIC (1 samples, 0.05%)[perf-80438.map] (8 samples, 0.40%)Builtins_StoreIC (1 samples, 0.05%)asm_exc_page_fault (1 samples, 0.05%)exc_page_fault (1 samples, 0.05%)do_user_addr_fault (1 samples, 0.05%)handle_mm_fault (1 samples, 0.05%)__handle_mm_fault (1 samples, 0.05%)handle_pte_fault (1 samples, 0.05%)do_anonymous_page (1 samples, 0.05%)__mem_cgroup_charge (1 samples, 0.05%)charge_memcg (1 samples, 0.05%)<core::future::from_generator::GenFuture<T> as core::future::future::Future>::poll (1 samples, 0.05%)deno::main::{{closure}} (2 samples, 0.10%)deno::args::flags::flags_from_vec (1 samples, 0.05%)deno::args::flags::clap_root (1 samples, 0.05%)<once_cell::sync::Lazy<T,F> as core::ops::deref::Deref>::deref (1 samples, 0.05%)once_cell::imp::initialize_or_wait (1 samples, 0.05%)once_cell::imp::OnceCell<T>::initialize::{{closure}} (1 samples, 0.05%)core::ops::function::FnOnce::call_once (1 samples, 0.05%)deno_core::v8_version (1 samples, 0.05%)v8__V8__GetVersion (1 samples, 0.05%)asm_exc_page_fault (1 samples, 0.05%)exc_page_fault (1 samples, 0.05%)do_user_addr_fault (1 samples, 0.05%)<core::future::from_generator::GenFuture<T> as core::future::future::Future>::poll (1 samples, 0.05%)<core::future::from_generator::GenFuture<T> as core::future::future::Future>::poll (1 samples, 0.05%)<futures_util::future::future::Map<Fut,F> as core::future::future::Future>::poll (1 samples, 0.05%)<core::future::from_generator::GenFuture<T> as core::future::future::Future>::poll (1 samples, 0.05%)<core::future::from_generator::GenFuture<T> as core::future::future::Future>::poll (1 samples, 0.05%)<core::future::from_generator::GenFuture<T> as core::future::future::Future>::poll (1 samples, 0.05%)deno::file_fetcher::fetch_local (1 samples, 0.05%)deno::file_fetcher::get_source_from_bytes (1 samples, 0.05%)deno::text_encoding::convert_to_utf8 (1 samples, 0.05%)encoding_rs::Encoding::for_label (1 samples, 0.05%)__next_zones_zonelist (1 samples, 0.05%)<core::future::from_generator::GenFuture<T> as core::future::future::Future>::poll (57 samples, 2.88%)<c..[libc.so.6] (57 samples, 2.88%)[l..asm_exc_page_fault (4 samples, 0.20%)exc_page_fault (4 samples, 0.20%)do_user_addr_fault (4 samples, 0.20%)handle_mm_fault (2 samples, 0.10%)__handle_mm_fault (2 samples, 0.10%)handle_pte_fault (2 samples, 0.10%)do_anonymous_page (2 samples, 0.10%)alloc_pages_vma (2 samples, 0.10%)__alloc_pages (2 samples, 0.10%)get_page_from_freelist (1 samples, 0.05%)<core::future::from_generator::GenFuture<T> as core::future::future::Future>::poll (59 samples, 2.98%)<co..deno_core::runtime::JsRuntime::poll_event_loop (58 samples, 2.93%)de..v8::Function::Call (1 samples, 0.05%)v8::internal::Execution::Call (1 samples, 0.05%)v8::internal::(anonymous namespace)::Invoke (1 samples, 0.05%)Builtins_JSEntry (1 samples, 0.05%)Builtins_JSEntryTrampoline (1 samples, 0.05%)Builtins_FastNewStrictArguments (1 samples, 0.05%)Builtins_CEntry_Return1_DontSaveFPRegs_ArgvOnStack_BuiltinExit (1 samples, 0.05%)v8::internal::Builtin_DateNow (1 samples, 0.05%)v8::internal::JSDate::CurrentTimeValue (1 samples, 0.05%)v8::base::OS::TimeCurrentMillis (1 samples, 0.05%)v8::base::Time::Now (1 samples, 0.05%)[[vdso]] (1 samples, 0.05%)[[vdso]] (1 samples, 0.05%)__mem_cgroup_charge (1 samples, 0.05%)charge_memcg (1 samples, 0.05%)[libc.so.6] (2 samples, 0.10%)asm_exc_page_fault (2 samples, 0.10%)exc_page_fault (2 samples, 0.10%)do_user_addr_fault (2 samples, 0.10%)handle_mm_fault (2 samples, 0.10%)__handle_mm_fault (2 samples, 0.10%)handle_pte_fault (2 samples, 0.10%)do_anonymous_page (2 samples, 0.10%)alloc_pages_vma (1 samples, 0.05%)__alloc_pages (1 samples, 0.05%)get_page_from_freelist (1 samples, 0.05%)clear_page_erms (1 samples, 0.05%)[libc.so.6] (2 samples, 0.10%)asm_exc_page_fault (2 samples, 0.10%)exc_page_fault (2 samples, 0.10%)do_user_addr_fault (2 samples, 0.10%)handle_mm_fault (2 samples, 0.10%)__handle_mm_fault (2 samples, 0.10%)handle_pte_fault (2 samples, 0.10%)do_anonymous_page (2 samples, 0.10%)__mem_cgroup_charge (2 samples, 0.10%)charge_memcg (2 samples, 0.10%)try_charge_memcg (1 samples, 0.05%)page_counter_try_charge (1 samples, 0.05%)<core::future::from_generator::GenFuture<T> as core::future::future::Future>::poll (65 samples, 3.28%)<co..<core::future::from_generator::GenFuture<T> as core::future::future::Future>::poll (65 samples, 3.28%)<co..deno_core::runtime::JsRuntime::mod_evaluate (6 samples, 0.30%)v8::Module::Evaluate (6 samples, 0.30%)v8::internal::SourceTextModule::Evaluate (6 samples, 0.30%)v8::internal::SourceTextModule::InnerModuleEvaluation (6 samples, 0.30%)v8::internal::SourceTextModule::ExecuteAsyncModule (6 samples, 0.30%)v8::internal::SourceTextModule::InnerExecuteAsyncModule (6 samples, 0.30%)v8::internal::Execution::TryCall (6 samples, 0.30%)v8::internal::(anonymous namespace)::InvokeWithTryCatch (6 samples, 0.30%)v8::internal::(anonymous namespace)::Invoke (6 samples, 0.30%)Builtins_JSEntry (6 samples, 0.30%)Builtins_JSEntryTrampoline (6 samples, 0.30%)Builtins_AsyncModuleEvaluate (6 samples, 0.30%)Builtins_InterpreterEntryTrampoline (6 samples, 0.30%)Builtins_InterpreterEntryTrampoline (6 samples, 0.30%)Builtins_InterpreterEntryTrampoline (5 samples, 0.25%)Builtins_CEntry_Return1_DontSaveFPRegs_ArgvOnStack_BuiltinExit (5 samples, 0.25%)v8::internal::Builtin_HandleApiCall (5 samples, 0.25%)v8::internal::(anonymous namespace)::HandleApiCallHelper<false> (5 samples, 0.25%)<extern "C" fn(A0) .> R as v8::support::CFnFrom<F>>::mapping::c_fn (5 samples, 0.25%)serde_v8::de::to_utf8 (5 samples, 0.25%)v8::string::<impl v8::data::String>::write_utf8_uninit (5 samples, 0.25%)v8::String::WriteUtf8 (5 samples, 0.25%)v8::internal::String::SlowFlatten (3 samples, 0.15%)v8::internal::String::WriteToFlat<unsigned char> (3 samples, 0.15%)v8::internal::String::WriteToFlat<unsigned char> (1 samples, 0.05%)v8::internal::String::WriteToFlat<unsigned char> (1 samples, 0.05%)v8::internal::String::WriteToFlat<unsigned char> (1 samples, 0.05%)[libc.so.6] (1 samples, 0.05%)asm_exc_page_fault (1 samples, 0.05%)exc_page_fault (1 samples, 0.05%)do_user_addr_fault (1 samples, 0.05%)handle_mm_fault (1 samples, 0.05%)__handle_mm_fault (1 samples, 0.05%)handle_pte_fault (1 samples, 0.05%)do_anonymous_page (1 samples, 0.05%)alloc_pages_vma (1 samples, 0.05%)__alloc_pages (1 samples, 0.05%)get_page_from_freelist (1 samples, 0.05%)clear_page_erms (1 samples, 0.05%)<alloc::vec::Vec<T,A> as core::clone::Clone>::clone (1 samples, 0.05%)v8__Global__New (1 samples, 0.05%)v8::internal::GlobalHandles::Create (1 samples, 0.05%)[libc.so.6] (221 samples, 11.15%)[libc.so.6]<core::future::from_generator::GenFuture<T> as core::future::future::Future>::poll (223 samples, 11.25%)<core::future::fr..std__shared_ptr__v8__BackingStore__reset (1 samples, 0.05%)deno_core::ops::OpResult::to_v8 (1 samples, 0.05%)deno_core::runtime::JsRuntime::event_loop_pending_state (1 samples, 0.05%)v8::internal::wasm::WasmEngine::HasRunningCompileJob (1 samples, 0.05%)<v8::isolate::Isolate as v8::scope::getter::GetScopeData>::get_scope_data_mut (1 samples, 0.05%)v8::scope::data::ScopeData::try_exit_scope (1 samples, 0.05%)core::ptr::drop_in_place<v8::scope::data::ScopeTypeSpecificData> (1 samples, 0.05%)v8::Context::Exit (1 samples, 0.05%)deno_core::runtime::JsRuntime::global_realm (1 samples, 0.05%)v8__Global__New (1 samples, 0.05%)v8::api_internal::GlobalizeReference (1 samples, 0.05%)deno_core::runtime::JsRuntime::handle_scope (4 samples, 0.20%)v8::scope::data::ScopeData::new_handle_scope_data_with_context (1 samples, 0.05%)v8::HandleScope::CreateHandle (1 samples, 0.05%)v8::internal::HandleScope::Extend (1 samples, 0.05%)deno_core::runtime::JsRuntime::inspector (1 samples, 0.05%)v8__Isolate__GetData (1 samples, 0.05%)deno_ffi::init::{{closure}} (1 samples, 0.05%)futures_channel::mpsc::UnboundedReceiver<T>::next_message (1 samples, 0.05%)deno_core::gotham_state::GothamState::borrow_mut (1 samples, 0.05%)deno_napi::init::{{closure}} (2 samples, 0.10%)futures_channel::mpsc::UnboundedReceiver<T>::next_message (1 samples, 0.05%)free (1 samples, 0.05%)[libc.so.6] (1 samples, 0.05%)v8::internal::Execution::Call (2 samples, 0.10%)v8::internal::(anonymous namespace)::Invoke (2 samples, 0.10%)Builtins_JSEntry (1 samples, 0.05%)Builtins_JSEntryTrampoline (1 samples, 0.05%)Builtins_LoadIC (1 samples, 0.05%)Builtins_JumpIfUndefinedOrNullHandler (1 samples, 0.05%)Builtins_LdarHandler (1 samples, 0.05%)v8::Function::Call (6 samples, 0.30%)v8::internal::Isolate::FireCallCompletedCallbackInternal (3 samples, 0.15%)v8::internal::MicrotaskQueue::PerformCheckpointInternal (3 samples, 0.15%)v8::internal::MicrotaskQueue::RunMicrotasks (3 samples, 0.15%)v8::internal::Execution::TryRunMicrotasks (3 samples, 0.15%)v8::internal::(anonymous namespace)::InvokeWithTryCatch (3 samples, 0.15%)v8::internal::(anonymous namespace)::Invoke (3 samples, 0.15%)Builtins_JSRunMicrotasksEntry (3 samples, 0.15%)Builtins_RunMicrotasks (3 samples, 0.15%)Builtins_PromiseFulfillReactionJob (3 samples, 0.15%)Builtins_MovHandler (1 samples, 0.05%)<core::future::from_generator::GenFuture<T> as core::future::future::Future>::poll (312 samples, 15.74%)<core::future::from_gene..deno_core::runtime::JsRuntime::poll_event_loop (247 samples, 12.46%)deno_core::runtime:..v8::handle::HandleHost::match_host (1 samples, 0.05%)alloc::sync::Arc<T>::new (1 samples, 0.05%)<core::option::Option<T> as core::clone::Clone>::clone (1 samples, 0.05%)malloc (1 samples, 0.05%)deno_core::bindings::set_func_raw (1 samples, 0.05%)v8::template::<impl v8::function::FunctionBuilder<v8::data::FunctionTemplate>>::build_fast (1 samples, 0.05%)v8__CTypeInfo__New__From__Slice (1 samples, 0.05%)malloc (1 samples, 0.05%)deno_core::bindings::initialize_context (2 samples, 0.10%)v8__Context__New (1 samples, 0.05%)v8::Context::New (1 samples, 0.05%)v8::NewContext (1 samples, 0.05%)v8::internal::Bootstrapper::CreateEnvironment (1 samples, 0.05%)v8::internal::Genesis::Genesis (1 samples, 0.05%)v8::internal::Snapshot::NewContextFromSnapshot (1 samples, 0.05%)v8::internal::ContextDeserializer::DeserializeContext (1 samples, 0.05%)v8::internal::ContextDeserializer::Deserialize (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::Rehash (1 samples, 0.05%)std::sync::once::Once::call_inner (1 samples, 0.05%)std::sync::once::Once::call_once::{{closure}} (1 samples, 0.05%)v8::V8::SetFlagsFromString (1 samples, 0.05%)v8::internal::FlagList::SetFlagsFromString (1 samples, 0.05%)v8::internal::FlagList::SetFlagsFromCommandLine (1 samples, 0.05%)asm_exc_page_fault (1 samples, 0.05%)exc_page_fault (1 samples, 0.05%)do_user_addr_fault (1 samples, 0.05%)handle_mm_fault (1 samples, 0.05%)__handle_mm_fault (1 samples, 0.05%)handle_pte_fault (1 samples, 0.05%)do_fault (1 samples, 0.05%)do_read_fault (1 samples, 0.05%)filemap_map_pages (1 samples, 0.05%)xas_find (1 samples, 0.05%)xas_load (1 samples, 0.05%)v8::internal::Checksum (6 samples, 0.30%)v8::internal::ReadOnlyHeap::SetUp (1 samples, 0.05%)v8::internal::ReadOnlyDeserializer::DeserializeIntoIsolate (1 samples, 0.05%)v8::internal::ReadOnlyRoots::Iterate (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::VisitRootPointers (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForRootSlots> (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::PostProcessNewObject (1 samples, 0.05%)v8::internal::SharedHeapDeserializer::DeserializeIntoIsolate (1 samples, 0.05%)v8::internal::SerializerDeserializer::IterateSharedHeapObjectCache (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::VisitRootPointers (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForRootSlots> (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (1 samples, 0.05%)asm_exc_page_fault (1 samples, 0.05%)exc_page_fault (1 samples, 0.05%)do_user_addr_fault (1 samples, 0.05%)handle_mm_fault (1 samples, 0.05%)__handle_mm_fault (1 samples, 0.05%)handle_pte_fault (1 samples, 0.05%)do_anonymous_page (1 samples, 0.05%)alloc_pages_vma (1 samples, 0.05%)__alloc_pages (1 samples, 0.05%)get_page_from_freelist (1 samples, 0.05%)clear_page_erms (1 samples, 0.05%)v8::Isolate::Initialize (10 samples, 0.50%)v8::internal::Snapshot::Initialize (10 samples, 0.50%)v8::internal::Isolate::InitWithSnapshot (4 samples, 0.20%)v8::internal::Isolate::Init (4 samples, 0.20%)v8::internal::StartupDeserializer::DeserializeIntoIsolate (2 samples, 0.10%)v8::internal::Heap::IterateRoots (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::VisitRootPointers (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForRootSlots> (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHeapObject> (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHeapObject> (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHeapObject> (2 samples, 0.10%)deno_core::runtime::JsRuntime::new (14 samples, 0.71%)v8::Isolate::New (11 samples, 0.55%)v8::internal::Isolate::New (1 samples, 0.05%)v8::internal::Isolate::Isolate (1 samples, 0.05%)v8::internal::Heap::Heap (1 samples, 0.05%)v8::internal::HeapAllocator::HeapAllocator (1 samples, 0.05%)v8::Script::Compile (1 samples, 0.05%)v8::ScriptCompiler::Compile (1 samples, 0.05%)v8::ScriptCompiler::CompileUnboundInternal (1 samples, 0.05%)v8::internal::Compiler::GetSharedFunctionInfoForScript (1 samples, 0.05%)v8::internal::(anonymous namespace)::GetSharedFunctionInfoForScriptImpl (1 samples, 0.05%)v8::internal::(anonymous namespace)::CompileScriptOnMainThread (1 samples, 0.05%)v8::internal::(anonymous namespace)::CompileToplevel (1 samples, 0.05%)v8::internal::parsing::ParseProgram (1 samples, 0.05%)v8::internal::Parser::ParseProgram (1 samples, 0.05%)v8::internal::Parser::DoParseProgram (1 samples, 0.05%)v8::internal::ParserBase<v8::internal::Parser>::ParseExpressionOrLabelledStatement (1 samples, 0.05%)v8::internal::ParserBase<v8::internal::Parser>::ParseExpressionCoverGrammar (1 samples, 0.05%)v8::internal::ParserBase<v8::internal::Parser>::ParseAssignmentExpressionCoverGrammar (1 samples, 0.05%)v8::internal::ParserBase<v8::internal::Parser>::ParseLogicalExpression (1 samples, 0.05%)v8::internal::ParserBase<v8::internal::Parser>::ParseLeftHandSideContinuation (1 samples, 0.05%)v8::internal::ParserBase<v8::internal::Parser>::ParseArguments (1 samples, 0.05%)v8::internal::Scanner::Next (1 samples, 0.05%)v8::internal::IsIdentifierStartSlow (1 samples, 0.05%)Builtins_CEntry_Return1_DontSaveFPRegs_ArgvOnStack_BuiltinExit (1 samples, 0.05%)v8::internal::Builtin_HandleApiCall (1 samples, 0.05%)v8::internal::(anonymous namespace)::HandleApiCallHelper<false> (1 samples, 0.05%)<extern "C" fn(A0) .> R as v8::support::CFnFrom<F>>::mapping::c_fn (1 samples, 0.05%)deno_runtime::worker::MainWorker::execute_script (3 samples, 0.15%)deno_core::runtime::JsRuntime::execute_script (3 samples, 0.15%)deno_core::runtime::JsRealm::execute_script (3 samples, 0.15%)v8::Script::Run (2 samples, 0.10%)v8::internal::Execution::CallScript (2 samples, 0.10%)v8::internal::(anonymous namespace)::Invoke (2 samples, 0.10%)Builtins_JSEntry (2 samples, 0.10%)Builtins_JSEntryTrampoline (2 samples, 0.10%)Builtins_InterpreterEntryTrampoline (2 samples, 0.10%)Builtins_InterpreterEntryTrampoline (2 samples, 0.10%)Builtins_InterpreterEntryTrampoline (2 samples, 0.10%)Builtins_InterpreterEntryTrampoline (1 samples, 0.05%)Builtins_StringPrototypeSplit (1 samples, 0.05%)Builtins_CEntry_Return1_DontSaveFPRegs_ArgvOnStack_NoBuiltinExit (1 samples, 0.05%)v8::internal::Runtime_StringSplit (1 samples, 0.05%)v8::internal::FindStringIndicesDispatch (1 samples, 0.05%)deno::run_command::{{closure}} (332 samples, 16.75%)deno::run_command::{{closu..<core::future::from_generator::GenFuture<T> as core::future::future::Future>::poll (332 samples, 16.75%)<core::future::from_genera..deno_runtime::worker::MainWorker::bootstrap_from_options (19 samples, 0.96%)once_cell::imp::OnceCell<T>::initialize (1 samples, 0.05%)once_cell::imp::initialize_or_wait (1 samples, 0.05%)once_cell::imp::OnceCell<T>::initialize::{{closure}} (1 samples, 0.05%)deno_runtime::js::CLI_SNAPSHOT::{{closure}} (1 samples, 0.05%)LZ4_decompress_safe (1 samples, 0.05%)deno_graph::graph::parse_module_from_module_info (1 samples, 0.05%)regex::re_unicode::Regex::new (1 samples, 0.05%)regex::re_builder::unicode::RegexBuilder::build (1 samples, 0.05%)regex::exec::ExecBuilder::build (1 samples, 0.05%)core::ptr::drop_in_place<regex_syntax::ast::Ast> (1 samples, 0.05%)[libc.so.6] (1 samples, 0.05%)tokio::runtime::io::registration::Registration::clear_readiness (1 samples, 0.05%)<core::future::from_generator::GenFuture<T> as core::future::future::Future>::poll (4 samples, 0.20%)tokio_uring::driver::Driver::tick (3 samples, 0.15%)tokio_uring::driver::Inner::tick (3 samples, 0.15%)futures_task::waker::wake_arc_raw (2 samples, 0.10%)<futures_util::stream::futures_unordered::task::Task<Fut> as futures_task::arc_wake::ArcWake>::wake_by_ref (1 samples, 0.05%)tokio::util::wake::wake_arc_raw (1 samples, 0.05%)<tokio::park::either::Either<A,B> as tokio::park::Unpark>::unpark (1 samples, 0.05%)mio::sys::unix::waker::eventfd::Waker::wake (1 samples, 0.05%)<&std::fs::File as std::io::Write>::write (1 samples, 0.05%)std::sys::unix::fs::File::write (1 samples, 0.05%)std::sys::unix::fd::FileDesc::write (1 samples, 0.05%)write (1 samples, 0.05%)entry_SYSCALL_64_after_hwframe (1 samples, 0.05%)do_syscall_64 (1 samples, 0.05%)__x64_sys_write (1 samples, 0.05%)ksys_write (1 samples, 0.05%)vfs_write (1 samples, 0.05%)eventfd_write (1 samples, 0.05%)copy_user_enhanced_fast_string (1 samples, 0.05%)[libc.so.6] (1 samples, 0.05%)io_issue_sqe (1 samples, 0.05%)io_close (1 samples, 0.05%)filp_close (1 samples, 0.05%)locks_remove_posix (1 samples, 0.05%)__x64_sys_io_uring_enter (4 samples, 0.20%)__do_sys_io_uring_enter (4 samples, 0.20%)io_submit_sqes (4 samples, 0.20%)io_submit_sqe (4 samples, 0.20%)__io_queue_sqe (4 samples, 0.20%)io_queue_async_work (3 samples, 0.15%)io_wq_enqueue (3 samples, 0.15%)io_wqe_enqueue (3 samples, 0.15%)io_wqe_activate_free_worker (3 samples, 0.15%)wake_up_process (2 samples, 0.10%)try_to_wake_up (2 samples, 0.10%)__lock_text_start (2 samples, 0.10%)__rseq_handle_notify_resume (1 samples, 0.05%)rseq_ip_fixup (1 samples, 0.05%)__get_user_8 (1 samples, 0.05%)apparmor_file_free_security (1 samples, 0.05%)call_rcu (1 samples, 0.05%)__call_rcu (1 samples, 0.05%)blk_finish_plug (1 samples, 0.05%)blk_flush_plug_list (1 samples, 0.05%)blk_mq_flush_plug_list (1 samples, 0.05%)blk_mq_sched_insert_requests (1 samples, 0.05%)blk_mq_try_issue_list_directly (1 samples, 0.05%)__blk_mq_try_issue_directly (1 samples, 0.05%)scsi_queue_rq (1 samples, 0.05%)scsi_dispatch_cmd (1 samples, 0.05%)virtscsi_queuecommand (1 samples, 0.05%)virtscsi_add_cmd (1 samples, 0.05%)__lock_text_start (1 samples, 0.05%)__blk_mq_alloc_request (1 samples, 0.05%)__blk_queue_split (1 samples, 0.05%)blk_bio_segment_split (1 samples, 0.05%)__rq_qos_throttle (1 samples, 0.05%)wbt_wait (1 samples, 0.05%)bio_to_wbt_flags (1 samples, 0.05%)__lock_text_start (2 samples, 0.10%)scsi_dispatch_cmd (3 samples, 0.15%)virtscsi_queuecommand (3 samples, 0.15%)virtscsi_add_cmd (3 samples, 0.15%)virtqueue_notify (1 samples, 0.05%)iowrite16 (1 samples, 0.05%)__submit_bio (8 samples, 0.40%)blk_mq_submit_bio (8 samples, 0.40%)blk_flush_plug_list (5 samples, 0.25%)blk_mq_flush_plug_list (5 samples, 0.25%)blk_mq_sched_insert_requests (5 samples, 0.25%)blk_mq_try_issue_list_directly (5 samples, 0.25%)__blk_mq_try_issue_directly (5 samples, 0.25%)scsi_queue_rq (5 samples, 0.25%)scsi_prepare_cmd (2 samples, 0.10%)sd_init_command (2 samples, 0.10%)sd_setup_read_write_cmnd (2 samples, 0.10%)scsi_alloc_sgtables (1 samples, 0.05%)__blk_rq_map_sg (1 samples, 0.05%)__blk_bios_map_sg (1 samples, 0.05%)ext4_io_submit (9 samples, 0.45%)submit_bio (9 samples, 0.45%)submit_bio_noacct (9 samples, 0.45%)blk_mq_submit_bio (1 samples, 0.05%)ext4_alloc_io_end_vec (1 samples, 0.05%)kmem_cache_alloc (1 samples, 0.05%)ext4_ext_get_access (1 samples, 0.05%)ext4_ext_insert_extent (1 samples, 0.05%)ext4_ext_correct_indexes (1 samples, 0.05%)crc_29 (1 samples, 0.05%)ext4_block_bitmap_csum_set (2 samples, 0.10%)crypto_shash_update (2 samples, 0.10%)crc_array (1 samples, 0.05%)ext4_mb_mark_diskspace_used (4 samples, 0.20%)ext4_inode_block_valid (1 samples, 0.05%)ext4_mb_choose_next_group_cr0.constprop.0 (1 samples, 0.05%)ext4_mb_good_group (1 samples, 0.05%)ext4_map_blocks (8 samples, 0.40%)ext4_ext_map_blocks (8 samples, 0.40%)ext4_mb_new_blocks (6 samples, 0.30%)ext4_mb_regular_allocator (2 samples, 0.10%)ext4_mb_load_buddy_gfp (1 samples, 0.05%)pagecache_get_page (1 samples, 0.05%)xas_load (1 samples, 0.05%)mpage_process_page (1 samples, 0.05%)clear_page_dirty_for_io (7 samples, 0.35%)mod_lruvec_page_state (6 samples, 0.30%)__lock_text_start (20 samples, 1.01%)__test_set_page_writeback (23 samples, 1.16%)lock_page_memcg (1 samples, 0.05%)fscrypt_mergeable_bio_bh (2 samples, 0.10%)page_mapping (1 samples, 0.05%)__lock_text_start (3 samples, 0.15%)ext4_bio_write_page (36 samples, 1.82%)e..submit_bio (4 samples, 0.20%)submit_bio_noacct (4 samples, 0.20%)__submit_bio (4 samples, 0.20%)blk_mq_submit_bio (4 samples, 0.20%)blk_flush_plug_list (4 samples, 0.20%)blk_mq_flush_plug_list (4 samples, 0.20%)blk_mq_sched_insert_requests (4 samples, 0.20%)blk_mq_try_issue_list_directly (4 samples, 0.20%)__blk_mq_try_issue_directly (4 samples, 0.20%)scsi_queue_rq (4 samples, 0.20%)scsi_dispatch_cmd (4 samples, 0.20%)virtscsi_queuecommand (4 samples, 0.20%)virtscsi_add_cmd (4 samples, 0.20%)virtqueue_notify (1 samples, 0.05%)iowrite16 (1 samples, 0.05%)mpage_submit_page (44 samples, 2.22%)m..page_mkclean (1 samples, 0.05%)mpage_map_and_submit_extent (64 samples, 3.23%)mpa..mpage_map_and_submit_buffers (55 samples, 2.77%)mp..pagevec_lookup_range (10 samples, 0.50%)find_get_pages_range (10 samples, 0.50%)xas_find (1 samples, 0.05%)__pagevec_release (1 samples, 0.05%)release_pages (1 samples, 0.05%)mpage_process_page_bufs (3 samples, 0.15%)scoped_tls::ScopedKey<T>::with (97 samples, 4.89%)scoped..io_uring::IoUring<S,C>::submit (97 samples, 4.89%)io_uri..io_uring::submit::Submitter::submit_and_wait (97 samples, 4.89%)io_uri..syscall (97 samples, 4.89%)syscallentry_SYSCALL_64_after_hwframe (96 samples, 4.84%)entry_..do_syscall_64 (96 samples, 4.84%)do_sys..syscall_exit_to_user_mode (92 samples, 4.64%)sysca..exit_to_user_mode_prepare (92 samples, 4.64%)exit_..exit_to_user_mode_loop (92 samples, 4.64%)exit_..task_work_run (90 samples, 4.54%)task_..____fput (90 samples, 4.54%)____f..__fput (90 samples, 4.54%)__fputext4_release_file (88 samples, 4.44%)ext4_..ext4_alloc_da_blocks (88 samples, 4.44%)ext4_..filemap_flush (88 samples, 4.44%)filem..filemap_fdatawrite_wbc (88 samples, 4.44%)filem..do_writepages (88 samples, 4.44%)do_wr..ext4_writepages (88 samples, 4.44%)ext4_..mpage_prepare_extent_to_map (14 samples, 0.71%)pagevec_lookup_range_tag (9 samples, 0.45%)find_get_pages_range_tag (9 samples, 0.45%)xas_find_marked (3 samples, 0.15%)xas_move_index (1 samples, 0.05%)ep_send_events (1 samples, 0.05%)mio::poll::Poll::poll (4 samples, 0.20%)epoll_wait (4 samples, 0.20%)entry_SYSCALL_64_after_hwframe (4 samples, 0.20%)do_syscall_64 (4 samples, 0.20%)__x64_sys_epoll_wait (4 samples, 0.20%)do_epoll_wait (4 samples, 0.20%)ep_poll (4 samples, 0.20%)schedule_hrtimeout_range (3 samples, 0.15%)schedule_hrtimeout_range_clock (3 samples, 0.15%)schedule (3 samples, 0.15%)__schedule (3 samples, 0.15%)finish_task_switch.isra.0 (3 samples, 0.15%)tokio::runtime::io::Driver::turn (5 samples, 0.25%)tokio::runtime::io::scheduled_io::ScheduledIo::wake0 (1 samples, 0.05%)tokio::util::wake::wake_arc_raw (1 samples, 0.05%)<tokio::park::either::Either<A,B> as tokio::park::Unpark>::unpark (1 samples, 0.05%)mio::sys::unix::waker::eventfd::Waker::wake (1 samples, 0.05%)<&std::fs::File as std::io::Write>::write (1 samples, 0.05%)std::sys::unix::fs::File::write (1 samples, 0.05%)std::sys::unix::fd::FileDesc::write (1 samples, 0.05%)write (1 samples, 0.05%)tokio::signal::unix::driver::Driver::process (1 samples, 0.05%)tokio::runtime::io::registration::Registration::poll_ready (1 samples, 0.05%)deno_runtime::tokio_util::run_local (110 samples, 5.55%)deno_ru..tokio::runtime::scheduler::current_thread::Context::park (106 samples, 5.35%)tokio::..tokio::time::driver::Driver<P>::park_internal (8 samples, 0.40%)tokio::time::driver::<impl tokio::time::driver::handle::Handle>::process_at_time (2 samples, 0.10%)core::ptr::drop_in_place<[core::option::Option<core::task::wake::Waker>: 32]> (1 samples, 0.05%)[unknown] (447 samples, 22.55%)[unknown]deno_runtime::worker::MainWorker::bootstrap_from_options (2 samples, 0.10%)deno_core::runtime::JsRuntime::new (2 samples, 0.10%)deno_core::bindings::initialize_context (2 samples, 0.10%)v8__Context__New (2 samples, 0.10%)v8::Context::New (2 samples, 0.10%)v8::NewContext (2 samples, 0.10%)v8::internal::Bootstrapper::CreateEnvironment (2 samples, 0.10%)v8::internal::Genesis::Genesis (2 samples, 0.10%)v8::internal::Snapshot::NewContextFromSnapshot (2 samples, 0.10%)v8::internal::ContextDeserializer::DeserializeContext (2 samples, 0.10%)v8::internal::ContextDeserializer::Deserialize (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHandle<v8::internal::Isolate> > (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHeapObject> (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHandle<v8::internal::Isolate> > (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHeapObject> (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHandle<v8::internal::Isolate> > (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHeapObject> (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHandle<v8::internal::Isolate> > (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHeapObject> (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHeapObject> (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHeapObject> (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHeapObject> (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHeapObject> (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHeapObject> (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHeapObject> (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHeapObject> (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHeapObject> (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHeapObject> (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHeapObject> (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHeapObject> (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHeapObject> (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (2 samples, 0.10%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHeapObject> (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHeapObject> (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHeapObject> (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHeapObject> (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHandle<v8::internal::Isolate> > (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHeapObject> (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHeapObject> (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHeapObject> (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHeapObject> (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHeapObject> (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHeapObject> (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHeapObject> (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHeapObject> (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHeapObject> (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHeapObject> (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::ReadObject (1 samples, 0.05%)deno (458 samples, 23.11%)denov8::internal::Heap::IterateBuiltins (1 samples, 0.05%)v8::internal::Deserializer<v8::internal::Isolate>::VisitRootPointers (1 samples, 0.05%)alloc_empty_file (1 samples, 0.05%)__alloc_file (1 samples, 0.05%)kmem_cache_alloc (1 samples, 0.05%)memcg_slab_post_alloc_hook (1 samples, 0.05%)__fsnotify_parent (1 samples, 0.05%)fsnotify (1 samples, 0.05%)send_to_group (1 samples, 0.05%)fsnotify_handle_inode_event.isra.0 (1 samples, 0.05%)inotify_handle_inode_event (1 samples, 0.05%)fsnotify_add_event (1 samples, 0.05%)__wake_up (1 samples, 0.05%)__wake_up_common_lock (1 samples, 0.05%)__lock_text_start (1 samples, 0.05%)down_write (1 samples, 0.05%)ext4_orphan_add (1 samples, 0.05%)__ext4_journal_get_write_access (1 samples, 0.05%)jbd2_journal_get_write_access (1 samples, 0.05%)jbd2_write_access_granted.part.0 (1 samples, 0.05%)__ext4_journal_start_sb (1 samples, 0.05%)jbd2__journal_start (1 samples, 0.05%)should_failslab (1 samples, 0.05%)__ext4_mark_inode_dirty (1 samples, 0.05%)__mark_inode_dirty (1 samples, 0.05%)ext4_dirty_inode (1 samples, 0.05%)__ext4_mark_inode_dirty (1 samples, 0.05%)ext4_mark_iloc_dirty (1 samples, 0.05%)ext4_do_update_inode.isra.0 (1 samples, 0.05%)ext4_inode_csum_set (1 samples, 0.05%)ext4_inode_csum (1 samples, 0.05%)ext4_group_desc_csum (1 samples, 0.05%)ext4_truncate (5 samples, 0.25%)ext4_ext_truncate (4 samples, 0.20%)ext4_ext_remove_space (3 samples, 0.15%)ext4_ext_rm_leaf (3 samples, 0.15%)ext4_remove_blocks (3 samples, 0.15%)ext4_free_blocks (3 samples, 0.15%)percpu_counter_add_batch (1 samples, 0.05%)__lock_text_start (24 samples, 1.21%)arch_local_irq_enable (2 samples, 0.10%)uncharge_batch (5 samples, 0.25%)page_counter_uncharge (2 samples, 0.10%)page_counter_cancel (2 samples, 0.10%)__mem_cgroup_uncharge_list (9 samples, 0.45%)uncharge_page (4 samples, 0.20%)free_pcp_prepare (1 samples, 0.05%)free_unref_page_list (12 samples, 0.61%)free_pcp_prepare (2 samples, 0.10%)__pagevec_release (47 samples, 2.37%)__..release_pages (47 samples, 2.37%)re..uncharge_page (1 samples, 0.05%)delete_from_page_cache (27 samples, 1.36%)page_cache_free_page.isra.0 (3 samples, 0.15%)delete_from_page_cache_batch (33 samples, 1.66%)page_cache_free_page.isra.0 (4 samples, 0.20%)ext4_invalidatepage (1 samples, 0.05%)xas_load (1 samples, 0.05%)xas_start (1 samples, 0.05%)find_get_entries (5 samples, 0.25%)xas_find (2 samples, 0.10%)xas_move_index (1 samples, 0.05%)asm_sysvec_apic_timer_interrupt (1 samples, 0.05%)sysvec_apic_timer_interrupt (1 samples, 0.05%)irq_exit_rcu (1 samples, 0.05%)__softirqentry_text_start (1 samples, 0.05%)rcu_core_si (1 samples, 0.05%)rcu_core (1 samples, 0.05%)rcu_do_batch (1 samples, 0.05%)radix_tree_node_rcu_free (1 samples, 0.05%)kmem_cache_free (1 samples, 0.05%)memcg_slab_free_hook (1 samples, 0.05%)obj_cgroup_uncharge (1 samples, 0.05%)arch_local_irq_disable (1 samples, 0.05%)find_lock_entries (28 samples, 1.41%)xas_find (4 samples, 0.20%)_raw_spin_lock (2 samples, 0.10%)drop_buffers.constprop.0 (1 samples, 0.05%)jbd2_journal_grab_journal_head (8 samples, 0.40%)kmem_cache_free (1 samples, 0.05%)dec_zone_page_state (3 samples, 0.15%)__cancel_dirty_page (29 samples, 1.46%)account_page_cleaned (22 samples, 1.11%)percpu_counter_add_batch (2 samples, 0.10%)__raw_callee_save___pv_queued_spin_unlock (2 samples, 0.10%)__slab_free (3 samples, 0.15%)drop_buffers.constprop.0 (5 samples, 0.25%)__slab_free (6 samples, 0.30%)arch_local_irq_disable (1 samples, 0.05%)mod_objcg_state (2 samples, 0.10%)arch_local_irq_enable (1 samples, 0.05%)memcg_slab_free_hook (12 samples, 0.61%)obj_cgroup_uncharge (3 samples, 0.15%)refill_obj_stock (2 samples, 0.10%)mod_objcg_state (1 samples, 0.05%)obj_cgroup_uncharge (1 samples, 0.05%)kmem_cache_free (26 samples, 1.31%)slab_free_freelist_hook.constprop.0 (3 samples, 0.15%)memcg_slab_free_hook (2 samples, 0.10%)page_mapping (2 samples, 0.10%)jbd2_journal_try_to_free_buffers (82 samples, 4.14%)jbd2_..try_to_free_buffers (70 samples, 3.53%)try..slab_free_freelist_hook.constprop.0 (1 samples, 0.05%)ext4_releasepage (88 samples, 4.44%)ext4_..try_to_free_buffers (1 samples, 0.05%)try_to_release_page (89 samples, 4.49%)try_t..jbd2_journal_try_to_free_buffers (1 samples, 0.05%)truncate_cleanup_page (120 samples, 6.05%)truncate..ext4_invalidatepage (113 samples, 5.70%)ext4_in..block_invalidatepage (109 samples, 5.50%)block_i..wake_up_bit (1 samples, 0.05%)truncate_exceptional_pvec_entries.part.0 (1 samples, 0.05%)unlock_page (1 samples, 0.05%)truncate_inode_pages_range (267 samples, 13.47%)truncate_inode_pages..wait_on_page_writeback (3 samples, 0.15%)wait_on_page_bit (2 samples, 0.10%)wait_on_page_bit_common (2 samples, 0.10%)io_schedule (1 samples, 0.05%)schedule (1 samples, 0.05%)__schedule (1 samples, 0.05%)finish_task_switch.isra.0 (1 samples, 0.05%)unlock_page (3 samples, 0.15%)do_truncate (280 samples, 14.13%)do_truncatenotify_change (280 samples, 14.13%)notify_changeext4_setattr (278 samples, 14.03%)ext4_setattrtruncate_pagecache (271 samples, 13.67%)truncate_pagecachewait_on_page_writeback (1 samples, 0.05%)security_path_truncate (1 samples, 0.05%)common_perm_cond (1 samples, 0.05%)do_open (282 samples, 14.23%)do_openvfs_open (1 samples, 0.05%)do_dentry_open (1 samples, 0.05%)dquot_file_open (1 samples, 0.05%)ima_file_check (1 samples, 0.05%)do_filp_open (285 samples, 14.38%)do_filp_openpath_openat (285 samples, 14.38%)path_openatlink_path_walk.part.0.constprop.0 (1 samples, 0.05%)inode_permission (1 samples, 0.05%)security_inode_permission (1 samples, 0.05%)io_openat2 (286 samples, 14.43%)io_openat2io_req_complete_post (1 samples, 0.05%)io_cqring_ev_posted (1 samples, 0.05%)__wake_up (1 samples, 0.05%)__wake_up_common_lock (1 samples, 0.05%)__lock_text_start (1 samples, 0.05%)copy_page_from_iter_atomic (1 samples, 0.05%)ext4_da_write_end (1 samples, 0.05%)__cond_resched (1 samples, 0.05%)balance_dirty_pages (4 samples, 0.20%)mem_cgroup_wb_stats (4 samples, 0.20%)__mem_cgroup_flush_stats (4 samples, 0.20%)__lock_text_start (4 samples, 0.20%)balance_dirty_pages_ratelimited (23 samples, 1.16%)radix_tree_lookup (6 samples, 0.30%)__radix_tree_lookup (5 samples, 0.25%)copy_page_from_iter_atomic (4 samples, 0.20%)copy_user_enhanced_fast_string (170 samples, 8.58%)copy_user_en..__raw_callee_save___pv_queued_spin_unlock (1 samples, 0.05%)_raw_spin_lock (11 samples, 0.55%)__raw_callee_save___pv_queued_spin_unlock (3 samples, 0.15%)get_obj_cgroup_from_current (2 samples, 0.10%)___slab_alloc (2 samples, 0.10%)__cond_resched (1 samples, 0.05%)get_obj_cgroup_from_current (7 samples, 0.35%)memcg_slab_post_alloc_hook (12 samples, 0.61%)mod_objcg_state (2 samples, 0.10%)mod_objcg_state (1 samples, 0.05%)kmem_cache_alloc (30 samples, 1.51%)obj_cgroup_charge (1 samples, 0.05%)memcg_slab_post_alloc_hook (1 samples, 0.05%)create_empty_buffers (50 samples, 2.52%)cr..alloc_page_buffers (38 samples, 1.92%)a..alloc_buffer_head (36 samples, 1.82%)a..memset_erms (2 samples, 0.10%)__cond_resched (2 samples, 0.10%)__es_remove_extent (6 samples, 0.30%)_raw_read_lock (3 samples, 0.15%)_raw_spin_lock (1 samples, 0.05%)_raw_write_lock (4 samples, 0.20%)__cond_resched (1 samples, 0.05%)down_read (9 samples, 0.45%)rcu_all_qs (1 samples, 0.05%)__dquot_alloc_space (8 samples, 0.40%)__raw_callee_save___pv_queued_spin_unlock (5 samples, 0.25%)__raw_callee_save___pv_queued_spin_unlock (4 samples, 0.20%)_raw_spin_lock (3 samples, 0.15%)asm_sysvec_apic_timer_interrupt (1 samples, 0.05%)sysvec_apic_timer_interrupt (1 samples, 0.05%)irq_exit_rcu (1 samples, 0.05%)__softirqentry_text_start (1 samples, 0.05%)run_rebalance_domains (1 samples, 0.05%)rebalance_domains (1 samples, 0.05%)ext4_claim_free_clusters (2 samples, 0.10%)ext4_has_free_clusters (2 samples, 0.10%)ext4_has_free_clusters (1 samples, 0.05%)ext4_da_reserve_space (22 samples, 1.11%)percpu_counter_add_batch (1 samples, 0.05%)__es_insert_extent (9 samples, 0.45%)ext4_es_can_be_merged.isra.0 (1 samples, 0.05%)__es_remove_extent (6 samples, 0.30%)__es_tree_search.isra.0 (1 samples, 0.05%)ext4_es_insert_delayed_block (25 samples, 1.26%)ext4_es_can_be_merged.isra.0 (1 samples, 0.05%)ext4_da_map_blocks.constprop.0 (101 samples, 5.10%)ext4_d..ext4_es_lookup_extent (9 samples, 0.45%)percpu_counter_add_batch (1 samples, 0.05%)ext4_es_insert_delayed_block (1 samples, 0.05%)ext4_es_lookup_extent (2 samples, 0.10%)ext4_da_get_block_prep (113 samples, 5.70%)ext4_da..up_read (8 samples, 0.40%)ext4_block_write_begin (182 samples, 9.18%)ext4_block_wr..ext4_da_map_blocks.constprop.0 (1 samples, 0.05%)ext4_nonda_switch (2 samples, 0.10%)add_to_page_cache_lru (1 samples, 0.05%)__add_to_page_cache_locked (1 samples, 0.05%)__next_zones_zonelist (1 samples, 0.05%)clear_page_erms (183 samples, 9.23%)clear_page_er..node_dirty_ok (4 samples, 0.20%)node_page_state (4 samples, 0.20%)get_page_from_freelist (208 samples, 10.49%)get_page_from_f..rmqueue (12 samples, 0.61%)__page_cache_alloc (223 samples, 11.25%)__page_cache_allocalloc_pages (221 samples, 11.15%)alloc_pages__alloc_pages (213 samples, 10.75%)__alloc_pagesrcu_all_qs (1 samples, 0.05%)PageHuge (3 samples, 0.15%)PageHuge (1 samples, 0.05%)charge_memcg (6 samples, 0.30%)try_charge_memcg (3 samples, 0.15%)page_counter_try_charge (1 samples, 0.05%)__mem_cgroup_charge (9 samples, 0.45%)get_mem_cgroup_from_mm (2 samples, 0.10%)charge_memcg (1 samples, 0.05%)__add_to_page_cache_locked (122 samples, 6.16%)__add_to..xa_get_order (7 samples, 0.35%)xas_load (6 samples, 0.30%)__lock_text_start (33 samples, 1.66%)add_to_page_cache_lru (170 samples, 8.58%)add_to_page_..lru_cache_add (43 samples, 2.17%)l..__pagevec_lru_add (36 samples, 1.82%)_..release_pages (3 samples, 0.15%)alloc_pages (3 samples, 0.15%)lru_cache_add (1 samples, 0.05%)pagecache_get_page (416 samples, 20.99%)pagecache_get_pagexas_load (9 samples, 0.45%)xas_start (1 samples, 0.05%)grab_cache_page_write_begin (418 samples, 21.09%)grab_cache_page_write_beginxas_load (1 samples, 0.05%)pagecache_get_page (6 samples, 0.30%)ext4_da_write_begin (615 samples, 31.03%)ext4_da_write_beginwait_for_stable_page (2 samples, 0.10%)__mark_inode_dirty (3 samples, 0.15%)__set_page_dirty (40 samples, 2.02%)_..__lock_text_start (40 samples, 2.02%)_..page_mapping (4 samples, 0.20%)__block_commit_write.constprop.0.isra.0 (70 samples, 3.53%)__b..mark_buffer_dirty (57 samples, 2.88%)ma..unlock_page_memcg (2 samples, 0.10%)ext4_journal_check_start (1 samples, 0.05%)rcu_all_qs (1 samples, 0.05%)_raw_read_lock (4 samples, 0.20%)kmem_cache_alloc (8 samples, 0.40%)memcg_slab_post_alloc_hook (1 samples, 0.05%)memset_erms (4 samples, 0.20%)should_failslab (1 samples, 0.05%)add_transaction_credits (8 samples, 0.40%)jbd2__journal_start (41 samples, 2.07%)j..start_this_handle (21 samples, 1.06%)asm_sysvec_apic_timer_interrupt (1 samples, 0.05%)sysvec_apic_timer_interrupt (1 samples, 0.05%)irq_exit_rcu (1 samples, 0.05%)__softirqentry_text_start (1 samples, 0.05%)rcu_core_si (1 samples, 0.05%)rcu_core (1 samples, 0.05%)note_gp_changes (1 samples, 0.05%)__lock_text_start (1 samples, 0.05%)__ext4_journal_start_sb (43 samples, 2.17%)_..kmem_cache_alloc (1 samples, 0.05%)__wake_up (2 samples, 0.10%)memcg_slab_free_hook (2 samples, 0.10%)kmem_cache_free (12 samples, 0.61%)slab_free_freelist_hook.constprop.0 (5 samples, 0.25%)__lock_text_start (8 samples, 0.40%)__wake_up_common_lock (17 samples, 0.86%)_raw_spin_lock_irqsave (6 samples, 0.30%)__wake_up (18 samples, 0.91%)_raw_spin_lock_irqsave (1 samples, 0.05%)jbd2_journal_stop (45 samples, 2.27%)j..stop_this_handle (28 samples, 1.41%)__wake_up_common_lock (2 samples, 0.10%)__ext4_journal_stop (47 samples, 2.37%)__..kmem_cache_free (1 samples, 0.05%)__brelse (3 samples, 0.15%)_raw_spin_lock (6 samples, 0.30%)__cond_resched (2 samples, 0.10%)__cond_resched (1 samples, 0.05%)jbd2_journal_dirty_metadata (3 samples, 0.15%)__ext4_handle_dirty_metadata (6 samples, 0.30%)rcu_all_qs (1 samples, 0.05%)__raw_callee_save___pv_queued_spin_unlock (4 samples, 0.20%)ext4_inode_csum (1 samples, 0.05%)crypto_shash_update (2 samples, 0.10%)crc32c_pcl_intel_update (2 samples, 0.10%)ext4_inode_csum_set (35 samples, 1.77%)ext4_inode_csum (30 samples, 1.51%)crypto_shash_update (21 samples, 1.06%)crc32c_pcl_intel_update (19 samples, 0.96%)from_kgid (3 samples, 0.15%)map_id_up (3 samples, 0.15%)from_kprojid (1 samples, 0.05%)map_id_up (1 samples, 0.05%)ext4_do_update_inode.isra.0 (81 samples, 4.09%)ext4..map_id_up (1 samples, 0.05%)ext4_fc_track_template (4 samples, 0.20%)ext4_fc_track_inode (7 samples, 0.35%)ext4_inode_journal_mode (2 samples, 0.10%)ext4_mark_iloc_dirty (101 samples, 5.10%)ext4_m..ext4_inode_csum_set (1 samples, 0.05%)__cond_resched (1 samples, 0.05%)jbd2_journal_get_write_access (4 samples, 0.20%)jbd2_write_access_granted.part.0 (4 samples, 0.20%)__ext4_journal_get_write_access (10 samples, 0.50%)jbd2_write_access_granted.part.0 (1 samples, 0.05%)__find_get_block (5 samples, 0.25%)mark_page_accessed (1 samples, 0.05%)mark_page_accessed (2 samples, 0.10%)__getblk_gfp (9 samples, 0.45%)rcu_all_qs (1 samples, 0.05%)asm_sysvec_apic_timer_interrupt (1 samples, 0.05%)sysvec_apic_timer_interrupt (1 samples, 0.05%)irq_exit_rcu (1 samples, 0.05%)__softirqentry_text_start (1 samples, 0.05%)rcu_core_si (1 samples, 0.05%)rcu_core (1 samples, 0.05%)rcu_do_batch (1 samples, 0.05%)radix_tree_node_rcu_free (1 samples, 0.05%)kmem_cache_free (1 samples, 0.05%)memcg_slab_free_hook (1 samples, 0.05%)mod_objcg_state (1 samples, 0.05%)arch_local_irq_enable (1 samples, 0.05%)__ext4_get_inode_loc (18 samples, 0.91%)ext4_get_group_desc (4 samples, 0.20%)generic_write_end (309 samples, 15.59%)generic_write_end__mark_inode_dirty (236 samples, 11.91%)__mark_inode_dirtyext4_dirty_inode (227 samples, 11.45%)ext4_dirty_inode__ext4_mark_inode_dirty (137 samples, 6.91%)__ext4_ma..ext4_reserve_inode_write (33 samples, 1.66%)ext4_get_inode_loc (20 samples, 1.01%)ext4_inode_table (1 samples, 0.05%)ext4_da_write_end (314 samples, 15.84%)ext4_da_write_endunlock_page (3 samples, 0.15%)__get_user_nocheck_1 (99 samples, 4.99%)__get_..fault_in_iov_iter_readable (101 samples, 5.10%)fault_..fault_in_readable (2 samples, 0.10%)ext4_file_write_iter (1,235 samples, 62.31%)ext4_file_write_iterext4_buffered_write_iter (1,235 samples, 62.31%)ext4_buffered_write_itergeneric_perform_write (1,233 samples, 62.21%)generic_perform_writefault_in_readable (1 samples, 0.05%)io_worker_handle_work (1,522 samples, 76.79%)io_worker_handle_workio_wq_submit_work (1,522 samples, 76.79%)io_wq_submit_workio_issue_sqe (1,522 samples, 76.79%)io_issue_sqeio_write (1,236 samples, 62.36%)io_writekiocb_done (1 samples, 0.05%)io_req_complete_post (1 samples, 0.05%)io_cqring_ev_posted (1 samples, 0.05%)__wake_up (1 samples, 0.05%)__wake_up_common_lock (1 samples, 0.05%)__lock_text_start (1 samples, 0.05%)lock_timer_base (1 samples, 0.05%)all (1,982 samples, 100%)iou-wrk-80438 (1,524 samples, 76.89%)iou-wrk-80438ret_from_fork (1,524 samples, 76.89%)ret_from_forkio_wqe_worker (1,524 samples, 76.89%)io_wqe_workerschedule_timeout (2 samples, 0.10%)schedule (1 samples, 0.05%)__schedule (1 samples, 0.05%)finish_task_switch.isra.0 (1 samples, 0.05%) \ No newline at end of file diff --git a/cli/bench/read_file.js b/cli/bench/read_file.js new file mode 100644 index 00000000000000..d9cc2209c2c313 --- /dev/null +++ b/cli/bench/read_file.js @@ -0,0 +1,21 @@ +// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license. +const queueMicrotask = globalThis.queueMicrotask || process.nextTick; +let [total, count] = typeof Deno !== "undefined" + ? Deno.args + : [process.argv[2], process.argv[3]]; + +total = total ? parseInt(total, 0) : 50; +count = count ? parseInt(count, 10) : 1000; + +async function bench(fun) { + const start = Date.now(); + for (let i = 0; i < count; i++) await fun(); + const elapsed = Date.now() - start; + const rate = Math.floor(count / (elapsed / 1000)); + console.log(`time ${elapsed} ms rate ${rate}`); + if (--total) queueMicrotask(() => bench(fun)); +} + +const x = new TextEncoder().encode("lol\n".repeat(1024 * 1024)); +await Deno.writeFile("a.txt", x); +await bench(() => Deno.readFile("a.txt")); diff --git a/cli/bench/write_file.js b/cli/bench/write_file.js index 2f09b36451aa7f..7382966c1b0720 100644 --- a/cli/bench/write_file.js +++ b/cli/bench/write_file.js @@ -5,7 +5,7 @@ let [total, count] = typeof Deno !== "undefined" : [process.argv[2], process.argv[3]]; total = total ? parseInt(total, 0) : 50; -count = count ? parseInt(count, 10) : 10000; +count = count ? parseInt(count, 10) : 100; async function bench(fun) { const start = Date.now(); @@ -16,6 +16,7 @@ async function bench(fun) { if (--total) queueMicrotask(() => bench(fun)); } -bench(() => Deno.writeFile("/dev/null", new Uint8Array(10))); +const x = new TextEncoder().encode("lol\n".repeat(1024 * 1024)); +await bench(() => Deno.writeFile("a.txt", x)); // const fs = require("fs").promises; -// bench(() => fs.writeFile("/dev/null", new Uint8Array(10))); +// bench(() => fs.writeFile("/dev/null", x)); diff --git a/core/Cargo.toml b/core/Cargo.toml index 57dafa0e50cb76..e554e81f0d0abb 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -15,6 +15,7 @@ path = "lib.rs" [features] default = ["v8_use_custom_libcxx"] v8_use_custom_libcxx = ["v8/use_custom_libcxx"] +enable_iouring = ["serde_v8/enable_iouring"] [dependencies] anyhow = "1.0.57" diff --git a/dump.md b/dump.md new file mode 100644 index 00000000000000..15afaf1d509df3 --- /dev/null +++ b/dump.md @@ -0,0 +1,15 @@ +``` +divy@divy:~/deno$ target/release/deno run -A --unstable cli/bench/write_file.js +time 433 ms rate 230 +time 548 ms rate 182 +time 540 ms rate 185 +time 565 ms rate 176 +^C + +divy@divy:~/deno$ ~/.deno/bin/deno run -A --unstable cli/bench/write_file.js +time 2696 ms rate 37 +time 2857 ms rate 35 +time 2859 ms rate 34 +time 2861 ms rate 34 +^C +``` diff --git a/ext/net/Cargo.toml b/ext/net/Cargo.toml index f278f69c1950af..1552e93eb3351e 100644 --- a/ext/net/Cargo.toml +++ b/ext/net/Cargo.toml @@ -20,5 +20,6 @@ log = "0.4.16" serde = { version = "1.0.136", features = ["derive"] } socket2 = "0.4.4" tokio = { version = "1.21", features = ["full"] } +tokio-uring = { version = "0.3.0", path = "../../../tokio-uring" } trust-dns-proto = "0.22" trust-dns-resolver = { version = "0.22", features = ["tokio-runtime", "serde-config"] } diff --git a/ext/net/ops.rs b/ext/net/ops.rs index 41d04467eaeced..18174289832bf3 100644 --- a/ext/net/ops.rs +++ b/ext/net/ops.rs @@ -31,8 +31,9 @@ use std::borrow::Cow; use std::cell::RefCell; use std::net::SocketAddr; use std::rc::Rc; -use tokio::net::TcpListener; -use tokio::net::TcpStream; +// use tokio::net::TcpListener; +use tokio_uring::net::TcpStream; +// use tokio::net::TcpStream; use tokio::net::UdpSocket; use trust_dns_proto::rr::rdata::caa::Value; use trust_dns_proto::rr::record_data::RData; @@ -109,6 +110,58 @@ pub(crate) struct AcceptArgs { pub transport: String, } +pub struct IoUringTcpStreamResource { + stream: tokio_uring::net::TcpStream, +} + +impl Resource for IoUringTcpStreamResource { + deno_core::impl_readable_byob!(); + deno_core::impl_writable!(); + fn name(&self) -> Cow { + "ioUringTcpStream".into() + } + + fn shutdown(self: Rc) -> AsyncResult<()> { + todo!(); + // Box::pin(Ok(())) + } + + fn close(self: Rc) { + // ... + } +} + +impl IoUringTcpStreamResource { + pub fn new(stream: tokio_uring::net::TcpStream) -> Self { + Self { stream } + } + + pub async fn read( + self: Rc, + data: &mut [u8], + ) -> Result { + let (nread, _) = self.stream.read(data.to_vec()).await; + Ok(nread?) + } + + pub async fn write(self: Rc, data: &[u8]) -> Result { + // LMAO divy wtf... + let data: &'static [u8] = unsafe { std::mem::transmute(data) }; + let (nwritten, _) = self.stream.write(data).await; + Ok(nwritten?) + } +} + +use deno_core::AsyncResult; +use std::ops::Deref; + +impl Deref for IoUringTcpStreamResource { + type Target = tokio_uring::net::TcpStream; + fn deref(&self) -> &Self::Target { + &self.stream + } +} + pub(crate) fn accept_err(e: std::io::Error) -> AnyError { // FIXME(bartlomieju): compatibility with current JS implementation if let std::io::ErrorKind::Interrupted = e.kind() { @@ -139,23 +192,18 @@ async fn accept_tcp( .try_or_cancel(cancel) .await .map_err(accept_err)?; - let local_addr = tcp_stream.local_addr()?; - let remote_addr = tcp_stream.peer_addr()?; + // let local_addr = tcp_stream.local_addr()?; + // let remote_addr = tcp_stream.peer_addr()?; + let tcp_stream = TcpStream::from_std(tcp_stream.into_std()?); let mut state = state.borrow_mut(); let rid = state .resource_table - .add(TcpStreamResource::new(tcp_stream.into_split())); + .add(IoUringTcpStreamResource::new(tcp_stream)); Ok(OpConn { rid, - local_addr: Some(OpAddr::Tcp(IpAddr { - hostname: local_addr.ip().to_string(), - port: local_addr.port(), - })), - remote_addr: Some(OpAddr::Tcp(IpAddr { - hostname: remote_addr.ip().to_string(), - port: remote_addr.port(), - })), + local_addr: None, + remote_addr: None, }) } @@ -328,24 +376,18 @@ where .await? .next() .ok_or_else(|| generic_error("No resolved address found"))?; - let tcp_stream = TcpStream::connect(&addr).await?; - let local_addr = tcp_stream.local_addr()?; - let remote_addr = tcp_stream.peer_addr()?; + let tcp_stream = TcpStream::connect(addr).await?; + // let local_addr = tcp_stream.local_addr()?; + // let remote_addr = tcp_stream.peer_addr()?; let mut state_ = state.borrow_mut(); let rid = state_ .resource_table - .add(TcpStreamResource::new(tcp_stream.into_split())); + .add(IoUringTcpStreamResource::new(tcp_stream)); Ok(OpConn { rid, - local_addr: Some(OpAddr::Tcp(IpAddr { - hostname: local_addr.ip().to_string(), - port: local_addr.port(), - })), - remote_addr: Some(OpAddr::Tcp(IpAddr { - hostname: remote_addr.ip().to_string(), - port: remote_addr.port(), - })), + local_addr: None, + remote_addr: None, }) } #[cfg(unix)] @@ -387,7 +429,7 @@ where } pub struct TcpListenerResource { - pub listener: AsyncRefCell, + pub listener: AsyncRefCell, pub cancel: CancelHandle, } @@ -454,7 +496,7 @@ fn listen_tcp( socket.listen(128)?; socket.set_nonblocking(true)?; let std_listener: std::net::TcpListener = socket.into(); - let listener = TcpListener::from_std(std_listener)?; + let listener = tokio::net::TcpListener::from_std(std_listener)?; let local_addr = listener.local_addr()?; let listener_resource = TcpListenerResource { listener: AsyncRefCell::new(listener), @@ -727,9 +769,10 @@ pub fn op_set_nodelay( nodelay: bool, ) -> Result<(), AnyError> { super::check_unstable(state, "Deno.Conn#setNoDelay"); - let resource: Rc = - state.resource_table.get::(rid)?; - resource.set_nodelay(nodelay) + // let resource: Rc = + // state.resource_table.get::(rid)?; + // resource.set_nodelay(nodelay) + Ok(()) } #[op] @@ -739,9 +782,10 @@ pub fn op_set_keepalive( keepalive: bool, ) -> Result<(), AnyError> { super::check_unstable(state, "Deno.Conn#setKeepAlive"); - let resource: Rc = - state.resource_table.get::(rid)?; - resource.set_keepalive(keepalive) + // let resource: Rc = + // state.resource_table.get::(rid)?; + // resource.set_keepalive(keepalive) + Ok(()) } fn rdata_to_return_record( diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index 1d4fbe5c9a631c..6de9fc296a0782 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -12,6 +12,7 @@ description = "Provides the deno runtime library" [features] # "fake" feature that allows to generate docs on docs.rs docsrs = [] +enable_iouring = ["deno_core/enable_iouring", "tokio-uring"] [lib] name = "deno_runtime" @@ -97,6 +98,7 @@ winapi = { version = "0.3.9", features = ["commapi", "knownfolders", "mswsock", [target.'cfg(unix)'.dependencies] nix = "=0.24.2" +tokio-uring = { version = "0.3.0", path = "../../tokio-uring", optional = true } [dev-dependencies] # Used in benchmark diff --git a/runtime/ops/asyncfs/iouring/mod.rs b/runtime/ops/asyncfs/iouring/mod.rs new file mode 100644 index 00000000000000..0bf50afad626fe --- /dev/null +++ b/runtime/ops/asyncfs/iouring/mod.rs @@ -0,0 +1,159 @@ +use crate::ops::fs::write_open_options; + +use crate::ops::fs::OpenOptions; +use crate::permissions::Permissions; +use deno_core::error::AnyError; +use deno_core::op; +use deno_core::CancelFuture; +use deno_core::CancelHandle; +use deno_core::OpState; +use deno_core::ResourceId; +use deno_core::ZeroCopyBuf; +use std::cell::RefCell; +use std::path::Path; +use std::path::PathBuf; +use std::rc::Rc; +use tokio_uring::fs::File; + +#[inline] +pub(crate) fn open_helper_async( + state: &mut OpState, + path: &str, + mode: Option, + options: Option<&OpenOptions>, + api_name: &str, +) -> Result<(PathBuf, tokio_uring::fs::OpenOptions), AnyError> { + let path = Path::new(path).to_path_buf(); + + let mut open_options = tokio_uring::fs::OpenOptions::new(); + + if let Some(mode) = mode { + // mode only used if creating the file on Unix + // if not specified, defaults to 0o666 + #[cfg(unix)] + { + use std::os::unix::fs::OpenOptionsExt; + open_options.mode(mode & 0o777); + } + #[cfg(not(unix))] + let _ = mode; // avoid unused warning + } + + let permissions = state.borrow_mut::(); + + match options { + None => { + permissions.read.check(&path, Some(api_name))?; + open_options + .read(true) + .create(false) + .write(false) + .truncate(false) + .append(false) + .create_new(false); + } + Some(options) => { + if options.read { + permissions.read.check(&path, Some(api_name))?; + } + + if options.write || options.append { + permissions.write.check(&path, Some(api_name))?; + } + + open_options + .read(options.read) + .create(options.create) + .write(options.write) + .truncate(options.truncate) + .append(options.append) + .create_new(options.create_new); + } + } + + Ok((path, open_options)) +} + +#[op] +pub async fn op_write_file_async( + state: Rc>, + path: String, + mode: Option, + append: bool, + create: bool, + data: ZeroCopyBuf, + cancel_rid: Option, +) -> Result<(), AnyError> { + let cancel_handle = match cancel_rid { + Some(cancel_rid) => state + .borrow_mut() + .resource_table + .get::(cancel_rid) + .ok(), + None => None, + }; + let (path, open_options) = open_helper_async( + &mut *state.borrow_mut(), + &path, + mode, + Some(&write_open_options(create, append)), + "Deno.writeFile()", + )?; + let write_future = async move { + let file = open_options.open(&path).await?; + let (res, _) = file.write_all_at(data, 0).await; + res?; + Ok::<(), AnyError>(()) + }; + if let Some(cancel_handle) = cancel_handle { + write_future.or_cancel(cancel_handle).await??; + } else { + write_future.await?; + } + Ok(()) +} + +#[op] +async fn op_readfile_async( + state: Rc>, + path: String, + cancel_rid: Option, +) -> Result { + { + let path = Path::new(&path); + let mut state = state.borrow_mut(); + state + .borrow_mut::() + .read + .check(path, Some("Deno.readFile()"))?; + } + + // TODO(@littledivy): Stat file to get the size. + let fut = async move { + let path = Path::new(&path); + let file = File::open(&path).await?; + let mut buf = vec![0; 1024 * 16]; + let mut offset: u64 = 0; + loop { + let (res, mut ret) = + file.read_at(buf.split_off(offset as usize), offset).await; + let nread = res? as u64; + offset = offset + nread; + if nread == 0 { + break Ok::(ret.into()); + } + ret.resize(offset as usize * 2, 0); + buf = ret; + } + }; + if let Some(cancel_rid) = cancel_rid { + let cancel_handle = state + .borrow_mut() + .resource_table + .get::(cancel_rid); + if let Ok(cancel_handle) = cancel_handle { + return fut.or_cancel(cancel_handle).await?; + } + } + fut.await +} diff --git a/runtime/ops/asyncfs/mod.rs b/runtime/ops/asyncfs/mod.rs new file mode 100644 index 00000000000000..d41701d0873328 --- /dev/null +++ b/runtime/ops/asyncfs/mod.rs @@ -0,0 +1,10 @@ +#[cfg(feature = "enable_iouring")] +pub mod iouring; +#[cfg(not(feature = "enable_iouring"))] +pub mod spawn_blocking; + +#[cfg(feature = "enable_iouring")] +pub use iouring::*; + +#[cfg(not(feature = "enable_iouring"))] +pub use spawn_blocking::*; diff --git a/runtime/ops/asyncfs/spawn_blocking/mod.rs b/runtime/ops/asyncfs/spawn_blocking/mod.rs new file mode 100644 index 00000000000000..c9364be4f2d585 --- /dev/null +++ b/runtime/ops/asyncfs/spawn_blocking/mod.rs @@ -0,0 +1,81 @@ +use crate::ops::fs::open_helper; +use crate::ops::fs::write_file; +use crate::ops::fs::write_open_options; + +use crate::permissions::Permissions; +use deno_core::error::AnyError; +use deno_core::op; +use deno_core::CancelFuture; +use deno_core::CancelHandle; +use deno_core::OpState; +use deno_core::ResourceId; +use deno_core::ZeroCopyBuf; +use std::cell::RefCell; +use std::path::Path; +use std::rc::Rc; + +#[op] +pub async fn op_write_file_async( + state: Rc>, + path: String, + mode: Option, + append: bool, + create: bool, + data: ZeroCopyBuf, + cancel_rid: Option, +) -> Result<(), AnyError> { + let cancel_handle = match cancel_rid { + Some(cancel_rid) => state + .borrow_mut() + .resource_table + .get::(cancel_rid) + .ok(), + None => None, + }; + let (path, open_options) = open_helper( + &mut *state.borrow_mut(), + &path, + mode, + Some(&write_open_options(create, append)), + "Deno.writeFile()", + )?; + let write_future = tokio::task::spawn_blocking(move || { + write_file(&path, open_options, mode, data) + }); + if let Some(cancel_handle) = cancel_handle { + write_future.or_cancel(cancel_handle).await???; + } else { + write_future.await??; + } + Ok(()) +} + +#[op] +async fn op_readfile_async( + state: Rc>, + path: String, + cancel_rid: Option, +) -> Result { + { + let path = Path::new(&path); + let mut state = state.borrow_mut(); + state + .borrow_mut::() + .read + .check(path, Some("Deno.readFile()"))?; + } + let fut = tokio::task::spawn_blocking(move || { + let path = Path::new(&path); + Ok(std::fs::read(path).map(ZeroCopyBuf::from)?) + }); + if let Some(cancel_rid) = cancel_rid { + let cancel_handle = state + .borrow_mut() + .resource_table + .get::(cancel_rid); + if let Ok(cancel_handle) = cancel_handle { + return fut.or_cancel(cancel_handle).await??; + } + } + fut.await? +} diff --git a/runtime/ops/fs.rs b/runtime/ops/fs.rs index 9b0737fe95426e..d67ae7cc0430b6 100644 --- a/runtime/ops/fs.rs +++ b/runtime/ops/fs.rs @@ -12,6 +12,7 @@ use deno_core::CancelFuture; use deno_core::CancelHandle; use deno_core::ZeroCopyBuf; +use crate::ops::asyncfs; use deno_core::Extension; use deno_core::OpState; use deno_core::ResourceId; @@ -48,7 +49,7 @@ pub fn init() -> Extension { op_open_sync::decl(), op_open_async::decl(), op_write_file_sync::decl(), - op_write_file_async::decl(), + asyncfs::op_write_file_async::decl(), op_seek_sync::decl(), op_seek_async::decl(), op_fdatasync_sync::decl(), @@ -102,7 +103,7 @@ pub fn init() -> Extension { op_utime_async::decl(), op_readfile_sync::decl(), op_readfile_text_sync::decl(), - op_readfile_async::decl(), + asyncfs::op_readfile_async::decl(), op_readfile_text_async::decl(), ]) .build() @@ -112,16 +113,16 @@ pub fn init() -> Extension { #[serde(rename_all = "camelCase")] #[serde(default)] pub struct OpenOptions { - read: bool, - write: bool, - create: bool, - truncate: bool, - append: bool, - create_new: bool, + pub read: bool, + pub write: bool, + pub create: bool, + pub truncate: bool, + pub append: bool, + pub create_new: bool, } #[inline] -fn open_helper( +pub(crate) fn open_helper( state: &mut OpState, path: &str, mode: Option, @@ -222,7 +223,7 @@ async fn op_open_async( } #[inline] -fn write_open_options(create: bool, append: bool) -> OpenOptions { +pub(crate) fn write_open_options(create: bool, append: bool) -> OpenOptions { OpenOptions { read: false, write: true, @@ -252,43 +253,7 @@ fn op_write_file_sync( write_file(&path, open_options, mode, data) } -#[op] -async fn op_write_file_async( - state: Rc>, - path: String, - mode: Option, - append: bool, - create: bool, - data: ZeroCopyBuf, - cancel_rid: Option, -) -> Result<(), AnyError> { - let cancel_handle = match cancel_rid { - Some(cancel_rid) => state - .borrow_mut() - .resource_table - .get::(cancel_rid) - .ok(), - None => None, - }; - let (path, open_options) = open_helper( - &mut *state.borrow_mut(), - &path, - mode, - Some(&write_open_options(create, append)), - "Deno.writeFile()", - )?; - let write_future = tokio::task::spawn_blocking(move || { - write_file(&path, open_options, mode, data) - }); - if let Some(cancel_handle) = cancel_handle { - write_future.or_cancel(cancel_handle).await???; - } else { - write_future.await??; - } - Ok(()) -} - -fn write_file( +pub(crate) fn write_file( path: &Path, open_options: std::fs::OpenOptions, _mode: Option, @@ -2040,36 +2005,6 @@ fn op_readfile_text_sync( Ok(string_from_utf8_lossy(std::fs::read(path)?)) } -#[op] -async fn op_readfile_async( - state: Rc>, - path: String, - cancel_rid: Option, -) -> Result { - { - let path = Path::new(&path); - let mut state = state.borrow_mut(); - state - .borrow_mut::() - .read - .check(path, Some("Deno.readFile()"))?; - } - let fut = tokio::task::spawn_blocking(move || { - let path = Path::new(&path); - Ok(std::fs::read(path).map(ZeroCopyBuf::from)?) - }); - if let Some(cancel_rid) = cancel_rid { - let cancel_handle = state - .borrow_mut() - .resource_table - .get::(cancel_rid); - if let Ok(cancel_handle) = cancel_handle { - return fut.or_cancel(cancel_handle).await??; - } - } - fut.await? -} - #[op] async fn op_readfile_text_async( state: Rc>, diff --git a/runtime/ops/mod.rs b/runtime/ops/mod.rs index 526c36d6305afc..12bdd1944ff667 100644 --- a/runtime/ops/mod.rs +++ b/runtime/ops/mod.rs @@ -1,5 +1,6 @@ // Copyright 2018-2022 the Deno authors. All rights reserved. MIT license. +mod asyncfs; pub mod fs; pub mod fs_events; pub mod http; diff --git a/runtime/tokio_util.rs b/runtime/tokio_util.rs index 52888abe45b641..24ae3cd6f8d7fc 100644 --- a/runtime/tokio_util.rs +++ b/runtime/tokio_util.rs @@ -14,6 +14,7 @@ pub fn create_basic_runtime() -> tokio::runtime::Runtime { .unwrap() } +#[cfg(not(feature = "enable_iouring"))] pub fn run_local(future: F) -> R where F: std::future::Future, @@ -22,3 +23,11 @@ where let local = tokio::task::LocalSet::new(); local.block_on(&rt, future) } + +#[cfg(feature = "enable_iouring")] +pub fn run_local(future: F) -> R +where + F: std::future::Future, +{ + tokio_uring::start(future) +} diff --git a/serde_v8/Cargo.toml b/serde_v8/Cargo.toml index f497d96934ac5f..e8b34fd0b93485 100644 --- a/serde_v8/Cargo.toml +++ b/serde_v8/Cargo.toml @@ -12,12 +12,18 @@ description = "Rust to V8 serialization and deserialization" [lib] path = "lib.rs" +[features] +default = [] +# Requires a recent Linux kernel version (atleast ) +enable_iouring = ["tokio-uring"] + [dependencies] bytes = "=1.2.1" derive_more = "0.99.17" serde = { version = "1.0.136", features = ["derive"] } serde_bytes = "0.11" smallvec = { version = "1.8", features = ["union"] } +tokio-uring = { version = "0.3.0", optional = true, path = "../../tokio-uring" } v8 = { version = "0.52.0", default-features = false } [dev-dependencies] diff --git a/serde_v8/magic/buffer.rs b/serde_v8/magic/buffer.rs index 413e567470fa23..6b30214d18974e 100644 --- a/serde_v8/magic/buffer.rs +++ b/serde_v8/magic/buffer.rs @@ -155,3 +155,18 @@ impl From for bytes::Bytes { } } } + +#[cfg(feature = "enable_iouring")] +unsafe impl tokio_uring::buf::IoBuf for ZeroCopyBuf { + fn stable_ptr(&self) -> *const u8 { + self.as_ptr() + } + + fn bytes_init(&self) -> usize { + self.len() + } + + fn bytes_total(&self) -> usize { + self.bytes_init() + } +}