As first suggested by Jan on the Zulip here [1], a cheap and effective way to obtain copy-on-write semantics of a "backing image" for a Wasm memory is to mmap a file with `MAP_PRIVATE`. The `memfd` mechanism provided by the Linux kernel allows us to create anonymous, in-memory-only files that we can use for this mapping, so we can construct the image contents on-the-fly then effectively create a CoW overlay. Furthermore, and importantly, `madvise(MADV_DONTNEED, ...)` will discard the CoW overlay, returning the mapping to its original state. By itself this is almost enough for a very fast instantiation-termination loop of the same image over and over, without changing the address space mapping at all (which is expensive). The only missing bit is how to implement heap *growth*. But here memfds can help us again: if we create another anonymous file and map it where the extended parts of the heap would go, we can take advantage of the fact that a `mmap()` mapping can be *larger than the file itself*, with accesses beyond the end generating a `SIGBUS`, and the fact that we can cheaply resize the file with `ftruncate`, even after a mapping exists. So we can map the "heap extension" file once with the maximum memory-slot size and grow the memfd itself as `memory.grow` operations occur. The above CoW technique and heap-growth technique together allow us a fastpath of `madvise()` and `ftruncate()` only when we re-instantiate the same module over and over, as long as we can reuse the same slot. This fastpath avoids all whole-process address-space locks in the Linux kernel, which should mean it is highly scalable. It also avoids the cost of copying data on read, as the `uffd` heap backend does when servicing pagefaults; the kernel's own optimized CoW logic (same as used by all file mmaps) is used instead. [1] https://bytecodealliance.zulipchat.com/#narrow/stream/206238-general/topic/Copy.20on.20write.20based.20instance.20reuse/near/266657772
128 lines
3.5 KiB
TOML
128 lines
3.5 KiB
TOML
[package]
|
|
name = "wasmtime-cli"
|
|
version = "0.33.0"
|
|
authors = ["The Wasmtime Project Developers"]
|
|
description = "Command-line interface for Wasmtime"
|
|
license = "Apache-2.0 WITH LLVM-exception"
|
|
documentation = "https://bytecodealliance.github.io/wasmtime/cli.html"
|
|
categories = ["wasm"]
|
|
keywords = ["webassembly", "wasm"]
|
|
repository = "https://github.com/bytecodealliance/wasmtime"
|
|
readme = "README.md"
|
|
edition = "2018"
|
|
default-run = "wasmtime"
|
|
|
|
[lib]
|
|
doctest = false
|
|
|
|
[[bin]]
|
|
name = "wasmtime"
|
|
path = "src/bin/wasmtime.rs"
|
|
doc = false
|
|
|
|
[dependencies]
|
|
wasmtime = { path = "crates/wasmtime", version = "0.33.0", default-features = false, features = ['cache', 'cranelift'] }
|
|
wasmtime-cache = { path = "crates/cache", version = "=0.33.0" }
|
|
wasmtime-cranelift = { path = "crates/cranelift", version = "=0.33.0" }
|
|
wasmtime-environ = { path = "crates/environ", version = "=0.33.0" }
|
|
wasmtime-wast = { path = "crates/wast", version = "=0.33.0" }
|
|
wasmtime-wasi = { path = "crates/wasi", version = "0.33.0" }
|
|
wasmtime-wasi-crypto = { path = "crates/wasi-crypto", version = "0.33.0", optional = true }
|
|
wasmtime-wasi-nn = { path = "crates/wasi-nn", version = "0.33.0", optional = true }
|
|
structopt = { version = "0.3.5", features = ["color", "suggestions"] }
|
|
anyhow = "1.0.19"
|
|
target-lexicon = { version = "0.12.0", default-features = false }
|
|
pretty_env_logger = "0.4.0"
|
|
file-per-thread-logger = "0.1.1"
|
|
libc = "0.2.60"
|
|
rayon = "1.5.0"
|
|
humantime = "2.0.0"
|
|
wasmparser = "0.81.0"
|
|
lazy_static = "1.4.0"
|
|
|
|
[target.'cfg(unix)'.dependencies]
|
|
rustix = "0.31.0"
|
|
|
|
[dev-dependencies]
|
|
# depend again on wasmtime to activate its default features for tests
|
|
wasmtime = { path = "crates/wasmtime", version = "0.33.0" }
|
|
env_logger = "0.8.1"
|
|
filecheck = "0.5.0"
|
|
more-asserts = "0.2.1"
|
|
tempfile = "3.1.0"
|
|
test-programs = { path = "crates/test-programs" }
|
|
wasmtime-runtime = { path = "crates/runtime" }
|
|
tokio = { version = "1.8.0", features = ["rt", "time", "macros", "rt-multi-thread"] }
|
|
tracing-subscriber = "0.3.1"
|
|
wast = "38.0.0"
|
|
criterion = "0.3.4"
|
|
num_cpus = "1.13.0"
|
|
winapi = { version = "0.3.9", features = ['memoryapi'] }
|
|
memchr = "2.4"
|
|
async-trait = "0.1"
|
|
wat = "1.0.40"
|
|
|
|
[build-dependencies]
|
|
anyhow = "1.0.19"
|
|
|
|
[profile.release.build-override]
|
|
opt-level = 0
|
|
|
|
[workspace]
|
|
resolver = '2'
|
|
members = [
|
|
"cranelift",
|
|
"cranelift/isle/fuzz",
|
|
"cranelift/isle/islec",
|
|
"cranelift/serde",
|
|
"crates/bench-api",
|
|
"crates/c-api",
|
|
"crates/misc/run-examples",
|
|
"examples/fib-debug/wasm",
|
|
"examples/wasi/wasm",
|
|
"examples/tokio/wasm",
|
|
"fuzz",
|
|
]
|
|
exclude = [
|
|
'crates/wasi-common/WASI/tools/witx-cli',
|
|
'docs/rust_wasi_markdown_parser'
|
|
]
|
|
|
|
[features]
|
|
default = ["jitdump", "wasmtime/wat", "wasmtime/parallel-compilation", "wasi-nn"]
|
|
jitdump = ["wasmtime/jitdump"]
|
|
vtune = ["wasmtime/vtune"]
|
|
wasi-crypto = ["wasmtime-wasi-crypto"]
|
|
wasi-nn = ["wasmtime-wasi-nn"]
|
|
uffd = ["wasmtime/uffd"]
|
|
pooling-allocator = ["wasmtime/pooling-allocator"]
|
|
memfd-allocator = ["pooling-allocator", "wasmtime/memfd-allocator"]
|
|
all-arch = ["wasmtime/all-arch"]
|
|
posix-signals-on-macos = ["wasmtime/posix-signals-on-macos"]
|
|
|
|
# Stub feature that does nothing, for Cargo-features compatibility: the new
|
|
# backend is the default now.
|
|
experimental_x64 = []
|
|
|
|
[badges]
|
|
maintenance = { status = "actively-developed" }
|
|
|
|
[[test]]
|
|
name = "host_segfault"
|
|
harness = false
|
|
|
|
[[example]]
|
|
name = "tokio"
|
|
required-features = ["wasmtime-wasi/tokio"]
|
|
|
|
[profile.dev.package.backtrace]
|
|
debug = false # FIXME(#1813)
|
|
|
|
[[bench]]
|
|
name = "instantiation"
|
|
harness = false
|
|
|
|
[[bench]]
|
|
name = "thread_eager_init"
|
|
harness = false
|