From 36cfae2019c2a3639dc3786ed541020af4cc9430 Mon Sep 17 00:00:00 2001 From: Dominic Hains Date: Thu, 26 May 2022 11:52:00 -0400 Subject: [PATCH 1/9] feat: memory size calculation --- src/engine.rs | 16 ++++++++++++++-- src/execution_result.rs | 6 +++++- tests/benchmarks/lots_of_memory.json | 11 +++++++++++ tests/benchmarks/lots_of_memory.wasm | Bin 0 -> 113351 bytes 4 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 tests/benchmarks/lots_of_memory.json create mode 100755 tests/benchmarks/lots_of_memory.wasm diff --git a/src/engine.rs b/src/engine.rs index 47cd0002..2f8cd681 100644 --- a/src/engine.rs +++ b/src/engine.rs @@ -26,6 +26,7 @@ pub fn run(script_path: PathBuf, input_path: PathBuf) -> Result let error_stream = wasi_common::pipe::WritePipe::new_in_memory(); let runtime: Duration; + let memory_usage: u64; { let mut linker = Linker::new(&engine); @@ -43,11 +44,17 @@ pub fn run(script_path: PathBuf, input_path: PathBuf) -> Result let start = Instant::now(); let instance = linker.instantiate(&mut store, &module)?; + + let memory = instance + .get_memory(&mut store, "memory") + .ok_or(anyhow::format_err!("failed to find `memory` export"))?; + let module_result = instance .get_typed_func::<(), (), _>(&mut store, "_start")? .call(&mut store, ()); runtime = start.elapsed(); + memory_usage = memory.size(&store); match module_result { Ok(_) => {} @@ -71,8 +78,13 @@ pub fn run(script_path: PathBuf, input_path: PathBuf) -> Result let output: serde_json::Value = serde_json::from_slice(output.as_slice()) .map_err(|e| anyhow!("Couldn't decode Script Output: {}", e))?; - let statistics = - ExecutionResult::new(runtime, Duration::from_millis(5), output, logs.to_string()); + let statistics = ExecutionResult::new( + runtime, + Duration::from_millis(5), + memory_usage, + output, + logs.to_string(), + ); Ok(statistics) } diff --git a/src/execution_result.rs b/src/execution_result.rs index 1f207b0e..e938e0b6 100644 --- a/src/execution_result.rs +++ b/src/execution_result.rs @@ -4,6 +4,7 @@ use std::{fmt, time::Duration}; pub struct ExecutionResult { pub runtime: Duration, pub threshold: Duration, + pub memory_usage: u64, pub logs: String, pub output: serde_json::Value, } @@ -12,12 +13,14 @@ impl ExecutionResult { pub fn new( runtime: Duration, threshold: Duration, + memory_usage: u64, output: serde_json::Value, logs: String, ) -> Self { ExecutionResult { runtime, threshold, + memory_usage, output, logs, } @@ -40,7 +43,8 @@ impl fmt::Display for ExecutionResult { .to_string() }; - writeln!(f, "Runtime: {}\n", runtime_display)?; + writeln!(f, "Runtime: {}", runtime_display)?; + writeln!(f, "Memory Usage: {}KB\n", self.memory_usage * 64)?; writeln!( f, diff --git a/tests/benchmarks/lots_of_memory.json b/tests/benchmarks/lots_of_memory.json new file mode 100644 index 00000000..24e55378 --- /dev/null +++ b/tests/benchmarks/lots_of_memory.json @@ -0,0 +1,11 @@ +{ + "input": { + "context": { + "suffix": "From Core!" + } + }, + "configuration": { + "message": "From Core!" + }, + "extension_point": "hello_world" +} diff --git a/tests/benchmarks/lots_of_memory.wasm b/tests/benchmarks/lots_of_memory.wasm new file mode 100755 index 0000000000000000000000000000000000000000..361c2814fb5925b7179bcfba43abf82a0bec5d5d GIT binary patch literal 113351 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%0DcdAFV4`S)I3L;0Iu{-vUS=79WpkEfp1 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 O>h%Bm)S!`<&A$Qswz!)B literal 0 HcmV?d00001 From 57bfe19dcae958557e24cfc544278f6cc83317f0 Mon Sep 17 00:00:00 2001 From: Dominic Hains Date: Thu, 26 May 2022 15:11:41 -0400 Subject: [PATCH 2/9] test: added memory tests --- src/engine.rs | 29 ++++++++++++++++-- ...ots_of_memory.json => hello_42_pages.json} | 0 ...ots_of_memory.wasm => hello_42_pages.wasm} | Bin 3 files changed, 27 insertions(+), 2 deletions(-) rename tests/benchmarks/{lots_of_memory.json => hello_42_pages.json} (100%) rename tests/benchmarks/{lots_of_memory.wasm => hello_42_pages.wasm} (100%) diff --git a/src/engine.rs b/src/engine.rs index 35534cb7..962750bc 100644 --- a/src/engine.rs +++ b/src/engine.rs @@ -89,6 +89,9 @@ mod tests { use super::*; use std::path::Path; + // The thresholds used here are arbitrary and are used to verify that the runner works as expected. + const RUNTIME_THRESHOLD: Duration = Duration::from_millis(5); + #[test] fn test_runtime_under_threshold() { let function_run_result = run( @@ -97,7 +100,7 @@ mod tests { ) .unwrap(); - assert!(function_run_result.runtime <= Duration::from_millis(5)); + assert!(function_run_result.runtime <= RUNTIME_THRESHOLD); } #[test] @@ -108,6 +111,28 @@ mod tests { ) .unwrap(); - assert!(function_run_result.runtime > Duration::from_millis(5)); + assert!(function_run_result.runtime > RUNTIME_THRESHOLD); + } + + #[test] + fn test_memory_usage_under_threshold() { + let function_run_result = run( + Path::new("tests/benchmarks/hello_world.wasm").to_path_buf(), + Path::new("tests/benchmarks/hello_world.json").to_path_buf(), + ) + .unwrap(); + + assert_eq!(function_run_result.memory_usage, 17); + } + + #[test] + fn test_memory_usage_over_threshold() { + let function_run_result = run( + Path::new("tests/benchmarks/hello_42_pages.wasm").to_path_buf(), + Path::new("tests/benchmarks/hello_42_pages.json").to_path_buf(), + ) + .unwrap(); + + assert_eq!(function_run_result.memory_usage, 42); } } diff --git a/tests/benchmarks/lots_of_memory.json b/tests/benchmarks/hello_42_pages.json similarity index 100% rename from tests/benchmarks/lots_of_memory.json rename to tests/benchmarks/hello_42_pages.json diff --git a/tests/benchmarks/lots_of_memory.wasm b/tests/benchmarks/hello_42_pages.wasm similarity index 100% rename from tests/benchmarks/lots_of_memory.wasm rename to tests/benchmarks/hello_42_pages.wasm From 047e55a52b950dbc2af96861b4112717ae464935 Mon Sep 17 00:00:00 2001 From: Dominic Hains Date: Thu, 26 May 2022 15:49:28 -0400 Subject: [PATCH 3/9] test: a wasm bin that should overflow the stack --- src/engine.rs | 12 +++++++++++- tests/benchmarks/stack_overflow.json | 11 +++++++++++ tests/benchmarks/stack_overflow.wasm | Bin 0 -> 113897 bytes 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 tests/benchmarks/stack_overflow.json create mode 100755 tests/benchmarks/stack_overflow.wasm diff --git a/src/engine.rs b/src/engine.rs index 962750bc..eb131020 100644 --- a/src/engine.rs +++ b/src/engine.rs @@ -89,7 +89,7 @@ mod tests { use super::*; use std::path::Path; - // The thresholds used here are arbitrary and are used to verify that the runner works as expected. + // Arbitrary, used to verify that the runner works as expected. const RUNTIME_THRESHOLD: Duration = Duration::from_millis(5); #[test] @@ -135,4 +135,14 @@ mod tests { assert_eq!(function_run_result.memory_usage, 42); } + + #[test] + #[should_panic] + fn test_panic() { + run( + Path::new("tests/benchmarks/stack_overflow.wasm").to_path_buf(), + Path::new("tests/benchmarks/stack_overflow.json").to_path_buf(), + ) + .unwrap(); + } } diff --git a/tests/benchmarks/stack_overflow.json b/tests/benchmarks/stack_overflow.json new file mode 100644 index 00000000..24e55378 --- /dev/null +++ b/tests/benchmarks/stack_overflow.json @@ -0,0 +1,11 @@ +{ + "input": { + "context": { + "suffix": "From Core!" + } + }, + "configuration": { + "message": "From Core!" + }, + "extension_point": "hello_world" +} diff --git a/tests/benchmarks/stack_overflow.wasm b/tests/benchmarks/stack_overflow.wasm new file mode 100755 index 0000000000000000000000000000000000000000..1205de50246b69c09bc37b767b67d8155e2c3df1 GIT binary patch literal 113897 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 literal 0 HcmV?d00001 From 56b443a42cfc1ddeee8cc63d4ba98d2c90bfeeb3 Mon Sep 17 00:00:00 2001 From: Dominic Hains Date: Thu, 26 May 2022 15:54:23 -0400 Subject: [PATCH 4/9] style: output stats order --- src/function_run_result.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/function_run_result.rs b/src/function_run_result.rs index 9809d01d..a37b5d64 100644 --- a/src/function_run_result.rs +++ b/src/function_run_result.rs @@ -29,8 +29,8 @@ impl fmt::Display for FunctionRunResult { let title = " Benchmark Results ".black().on_bright_green(); write!(f, "{}\n\n", title)?; + writeln!(f, "Runtime: {:?}", self.runtime)?; writeln!(f, "Memory Usage: {}KB\n", self.memory_usage * 64)?; - writeln!(f, "Runtime: {:?}\n", self.runtime)?; writeln!( f, From 1c9ee3a9666a646d9eca3bc38982cbc159704657 Mon Sep 17 00:00:00 2001 From: Dominic Hains <39207554+hainsdominic@users.noreply.github.com> Date: Fri, 27 May 2022 12:00:52 -0400 Subject: [PATCH 5/9] fix: adapt to new terminology Co-authored-by: dunk --- tests/benchmarks/stack_overflow.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/benchmarks/stack_overflow.json b/tests/benchmarks/stack_overflow.json index 24e55378..ecbcdfb3 100644 --- a/tests/benchmarks/stack_overflow.json +++ b/tests/benchmarks/stack_overflow.json @@ -7,5 +7,5 @@ "configuration": { "message": "From Core!" }, - "extension_point": "hello_world" + "function_api": "hello_world" } From 90f22e23401c1c0ccffdc39e69022d8e6b73a0ca Mon Sep 17 00:00:00 2001 From: Dominic Hains <39207554+hainsdominic@users.noreply.github.com> Date: Fri, 27 May 2022 12:01:00 -0400 Subject: [PATCH 6/9] fix: adapt to new terminology Co-authored-by: dunk --- tests/benchmarks/hello_42_pages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/benchmarks/hello_42_pages.json b/tests/benchmarks/hello_42_pages.json index 24e55378..ecbcdfb3 100644 --- a/tests/benchmarks/hello_42_pages.json +++ b/tests/benchmarks/hello_42_pages.json @@ -7,5 +7,5 @@ "configuration": { "message": "From Core!" }, - "extension_point": "hello_world" + "function_api": "hello_world" } From daa98ef59e2fcc86bf5728ff4d0b1f9c2cda2272 Mon Sep 17 00:00:00 2001 From: Dominic Hains Date: Fri, 27 May 2022 12:04:30 -0400 Subject: [PATCH 7/9] fix: adapt to new terminology --- tests/benchmarks/hello_world.json | 2 +- tests/benchmarks/sleeps.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/benchmarks/hello_world.json b/tests/benchmarks/hello_world.json index 24e55378..ecbcdfb3 100644 --- a/tests/benchmarks/hello_world.json +++ b/tests/benchmarks/hello_world.json @@ -7,5 +7,5 @@ "configuration": { "message": "From Core!" }, - "extension_point": "hello_world" + "function_api": "hello_world" } diff --git a/tests/benchmarks/sleeps.json b/tests/benchmarks/sleeps.json index 24e55378..ecbcdfb3 100644 --- a/tests/benchmarks/sleeps.json +++ b/tests/benchmarks/sleeps.json @@ -7,5 +7,5 @@ "configuration": { "message": "From Core!" }, - "extension_point": "hello_world" + "function_api": "hello_world" } From 1c273ea0d0f21e0ea5777ee669437bea0556209a Mon Sep 17 00:00:00 2001 From: Dominic Hains Date: Fri, 27 May 2022 12:21:24 -0400 Subject: [PATCH 8/9] test: constants and positive-outcome test --- src/engine.rs | 34 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/src/engine.rs b/src/engine.rs index eb131020..487ae457 100644 --- a/src/engine.rs +++ b/src/engine.rs @@ -90,18 +90,9 @@ mod tests { use std::path::Path; // Arbitrary, used to verify that the runner works as expected. - const RUNTIME_THRESHOLD: Duration = Duration::from_millis(5); - - #[test] - fn test_runtime_under_threshold() { - let function_run_result = run( - Path::new("tests/benchmarks/hello_world.wasm").to_path_buf(), - Path::new("tests/benchmarks/hello_world.json").to_path_buf(), - ) - .unwrap(); - - assert!(function_run_result.runtime <= RUNTIME_THRESHOLD); - } + const FUNCTION_SLEEP_DURATION: Duration = Duration::from_millis(42); + const HELLO_WORLD_MEMORY_USAGE: u64 = 17; + const MODIFIED_HELLO_WORLD_MEMORY_USAGE: u64 = 42; #[test] fn test_runtime_over_threshold() { @@ -111,7 +102,7 @@ mod tests { ) .unwrap(); - assert!(function_run_result.runtime > RUNTIME_THRESHOLD); + assert!(function_run_result.runtime > FUNCTION_SLEEP_DURATION); } #[test] @@ -122,7 +113,7 @@ mod tests { ) .unwrap(); - assert_eq!(function_run_result.memory_usage, 17); + assert_eq!(function_run_result.memory_usage, HELLO_WORLD_MEMORY_USAGE); } #[test] @@ -133,16 +124,19 @@ mod tests { ) .unwrap(); - assert_eq!(function_run_result.memory_usage, 42); + assert_eq!( + function_run_result.memory_usage, + MODIFIED_HELLO_WORLD_MEMORY_USAGE + ); } #[test] - #[should_panic] - fn test_panic() { - run( + fn test_stack_overflow() { + let function_run_result = run( Path::new("tests/benchmarks/stack_overflow.wasm").to_path_buf(), Path::new("tests/benchmarks/stack_overflow.json").to_path_buf(), - ) - .unwrap(); + ); + + assert!(function_run_result.is_err()); } } From bb2191966e81371b4eaf4bac23e8f31c270b7e83 Mon Sep 17 00:00:00 2001 From: Dominic Hains Date: Mon, 30 May 2022 14:00:17 -0400 Subject: [PATCH 9/9] fix: sum up all memories --- src/engine.rs | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/engine.rs b/src/engine.rs index 487ae457..104bf436 100644 --- a/src/engine.rs +++ b/src/engine.rs @@ -39,22 +39,35 @@ pub fn run(script_path: PathBuf, input_path: PathBuf) -> Result = instance + .exports(&mut store) + .into_iter() + .filter(|export| export.clone().into_memory().is_some()) + .map(|export| export.name().to_string()) + .collect(); + + memory_usage = memory_names + .iter() + .map(|name| { + let memory = instance.get_memory(&mut store, name).unwrap(); + memory.size(&store) + }) + .sum(); let module_result = instance .get_typed_func::<(), (), _>(&mut store, "_start")? .call(&mut store, ()); runtime = start.elapsed(); - memory_usage = memory.size(&store); match module_result { Ok(_) => {}