Skip to content

Commit

Permalink
feat(plugin/runner): Improve caching (#7341)
Browse files Browse the repository at this point in the history
**Description:**

Previously disabled cache (storing compiled module in memory) still doesn't work, so falling back to storing raw bytes and create new module each time. This is the same behavior to the wasm build's approach.

Also minor improved caching root to include more information. Previous rustc didn't seem to work unfortunately, so removed but instead using plugin_runner's version.
  • Loading branch information
kwonoj committed Apr 29, 2023
1 parent e7911ee commit 245163a
Showing 1 changed file with 18 additions and 27 deletions.
45 changes: 18 additions & 27 deletions crates/swc_plugin_runner/src/cache.rs
Expand Up @@ -35,26 +35,18 @@ compile_error!(
/// however it is not gauranteed to be compatible across wasmer's
/// internal changes.
/// https://github.com/wasmerio/wasmer/issues/2781
const MODULE_SERIALIZATION_VERSION: &str = "v5";
const MODULE_SERIALIZATION_VERSION: &str = "v6";

/// A shared instance to plugin's module bytecode cache.
pub static PLUGIN_MODULE_CACHE: Lazy<PluginModuleCache> = Lazy::new(Default::default);

#[cfg(feature = "filesystem_cache")]
#[derive(Default)]
pub struct CacheInner {
#[cfg(feature = "filesystem_cache")]
fs_cache: Option<FileSystemCache>,
// A naive hashmap to the compiled plugin modules.
// Current it doesn't have any invalidation or expiration logics like lru,
// having a lot of plugins may create some memory pressure.
loaded_module_bytes: AHashMap<PathBuf, Module>,
}

#[cfg(feature = "memory_cache")]
#[derive(Default)]
pub struct CacheInner {
// Unlike sys::Module, we'll keep raw bytes from the module instead of js::Module which
// implies bindgen's JsValue
loaded_module_bytes: AHashMap<PathBuf, Vec<u8>>,
}

Expand All @@ -81,9 +73,11 @@ fn create_filesystem_cache(filesystem_cache_root: &Option<String>) -> Option<Fil
if let Some(root_path) = &mut root_path {
root_path.push("plugins");
root_path.push(format!(
"{}_{}",
"{}_{}_{}_{}",
MODULE_SERIALIZATION_VERSION,
option_env!("CARGO_PKG_RUST_VERSION").unwrap_or("default")
std::env::consts::OS,
std::env::consts::ARCH,
option_env!("CARGO_PKG_VERSION").unwrap_or("plugin_runner_unknown")
));

return FileSystemCache::new(&root_path).ok();
Expand Down Expand Up @@ -146,21 +140,18 @@ impl PluginModuleCache {
let binary_path = binary_path.to_path_buf();
let mut inner_cache = self.inner.get().expect("Cache should be available").lock();

// if constructed Module is available in-memory, directly return it.
// Note we do not invalidate in-memory cache currently: if wasm binary is
// replaced in-process lifecycle (i.e devserver) it won't be reflected.

// if constructed module bytes for the given plugin path is available in-memory,
// directly return it. Note we do not invalidate in-memory cache
// currently: if wasm binary is replaced in-process lifecycle (i.e
// devserver) it won't be reflected.
/*
[TODO]: This is currently disabled, since on the latest wasmer@3 subsequent
plugin load via in memory module causes intermittent heap_get_oob when
[NOTE]: Unlike wasmer@2, in wasmer@3 subsequent plugin load via in memory module causes intermittent heap_get_oob when
host tries to allocate memory inside of the guest.
Current guess is memory instance is being corrupted by the previous run, but
until figure out root cause & fix will only use fs_cache directly.
*/
let in_memory_module = inner_cache.loaded_module_bytes.get(&binary_path);
if let Some(module) = in_memory_module {
return Ok(module.clone());
}*/
if let Some(module_bytes) = in_memory_module {
return Module::new(wasmer_store, module_bytes).context("Cannot compile plugin binary");
}

let module_bytes =
std::fs::read(&binary_path).context("Cannot read plugin from specified path")?;
Expand All @@ -174,8 +165,8 @@ impl PluginModuleCache {
);
let span_guard = span.enter();
let _lock = self.instantiation_lock.lock();
let ret =
Module::new(wasmer_store, module_bytes).context("Cannot compile plugin binary");
let ret = Module::new(wasmer_store, module_bytes.clone())
.context("Cannot compile plugin binary");
drop(span_guard);
ret
};
Expand All @@ -197,7 +188,7 @@ impl PluginModuleCache {

inner_cache
.loaded_module_bytes
.insert(binary_path, module.clone());
.insert(binary_path, module_bytes);

Ok(module)
}
Expand Down

2 comments on commit 245163a

@kdy1
Copy link
Member

@kdy1 kdy1 commented on 245163a Apr 29, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@kwonoj Seems like this made CI extremely slow. I'll revert it for now.

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark

Benchmark suite Current: 245163a Previous: 7e99e5f Ratio
es/full/bugs-1 310103 ns/iter (± 11444) 294659 ns/iter (± 11053) 1.05
es/full/minify/libraries/antd 1646399252 ns/iter (± 29100294) 1547627418 ns/iter (± 22354566) 1.06
es/full/minify/libraries/d3 300887880 ns/iter (± 7950457) 298192659 ns/iter (± 6532753) 1.01
es/full/minify/libraries/echarts 1263891673 ns/iter (± 19628587) 1213258498 ns/iter (± 23039184) 1.04
es/full/minify/libraries/jquery 91183684 ns/iter (± 810394) 89707662 ns/iter (± 727822) 1.02
es/full/minify/libraries/lodash 105688558 ns/iter (± 828096) 104876826 ns/iter (± 1078380) 1.01
es/full/minify/libraries/moment 52620321 ns/iter (± 395972) 51814927 ns/iter (± 256237) 1.02
es/full/minify/libraries/react 19167535 ns/iter (± 127342) 18938329 ns/iter (± 158945) 1.01
es/full/minify/libraries/terser 254587125 ns/iter (± 2816961) 245247548 ns/iter (± 6071585) 1.04
es/full/minify/libraries/three 445068093 ns/iter (± 4069788) 427379338 ns/iter (± 10456027) 1.04
es/full/minify/libraries/typescript 3119948708 ns/iter (± 22398317) 2945392246 ns/iter (± 26988522) 1.06
es/full/minify/libraries/victory 699016954 ns/iter (± 10143566) 670418919 ns/iter (± 14888486) 1.04
es/full/minify/libraries/vue 131672281 ns/iter (± 1399875) 129421216 ns/iter (± 1203824) 1.02
es/full/codegen/es3 28077 ns/iter (± 47) 29070 ns/iter (± 65) 0.97
es/full/codegen/es5 28154 ns/iter (± 87) 29187 ns/iter (± 33) 0.96
es/full/codegen/es2015 28152 ns/iter (± 44) 29186 ns/iter (± 50) 0.96
es/full/codegen/es2016 28169 ns/iter (± 64) 29147 ns/iter (± 42) 0.97
es/full/codegen/es2017 28122 ns/iter (± 63) 29171 ns/iter (± 51) 0.96
es/full/codegen/es2018 28216 ns/iter (± 44) 29141 ns/iter (± 87) 0.97
es/full/codegen/es2019 28175 ns/iter (± 47) 29132 ns/iter (± 67) 0.97
es/full/codegen/es2020 28179 ns/iter (± 64) 29191 ns/iter (± 59) 0.97
es/full/all/es3 181165986 ns/iter (± 2684849) 182389345 ns/iter (± 2542891) 0.99
es/full/all/es5 174521393 ns/iter (± 1577440) 172641713 ns/iter (± 1900408) 1.01
es/full/all/es2015 137268539 ns/iter (± 3660590) 136109823 ns/iter (± 2859605) 1.01
es/full/all/es2016 134553676 ns/iter (± 1810802) 133073942 ns/iter (± 1333514) 1.01
es/full/all/es2017 132704403 ns/iter (± 1574724) 131931391 ns/iter (± 1742905) 1.01
es/full/all/es2018 128028842 ns/iter (± 2202081) 128106972 ns/iter (± 1647189) 1.00
es/full/all/es2019 129108473 ns/iter (± 1725288) 123999029 ns/iter (± 1804503) 1.04
es/full/all/es2020 119856623 ns/iter (± 1755672) 118578107 ns/iter (± 994106) 1.01
es/full/parser 510240 ns/iter (± 7870) 518752 ns/iter (± 5574) 0.98
es/full/base/fixer 22506 ns/iter (± 22) 22451 ns/iter (± 37) 1.00
es/full/base/resolver_and_hygiene 86087 ns/iter (± 56) 85754 ns/iter (± 94) 1.00
serialization of serde 121 ns/iter (± 1) 121 ns/iter (± 0) 1
css/minify/libraries/bootstrap 27701945 ns/iter (± 89946) 27482579 ns/iter (± 141603) 1.01
css/visitor/compare/clone 2099977 ns/iter (± 24464) 2113761 ns/iter (± 3902) 0.99
css/visitor/compare/visit_mut_span 2324171 ns/iter (± 5633) 2315860 ns/iter (± 6820) 1.00
css/visitor/compare/visit_mut_span_panic 2378493 ns/iter (± 7265) 2358400 ns/iter (± 5160) 1.01
css/visitor/compare/fold_span 3084058 ns/iter (± 15607) 3059035 ns/iter (± 14966) 1.01
css/visitor/compare/fold_span_panic 3229204 ns/iter (± 9224) 3229248 ns/iter (± 14383) 1.00
css/lexer/bootstrap_5_1_3 5171464 ns/iter (± 10565) 5124674 ns/iter (± 19499) 1.01
css/lexer/foundation_6_7_4 4341703 ns/iter (± 2255) 4315915 ns/iter (± 3904) 1.01
css/lexer/tailwind_3_1_1 830003 ns/iter (± 254) 822790 ns/iter (± 516) 1.01
css/parser/bootstrap_5_1_3 21211606 ns/iter (± 92073) 21264720 ns/iter (± 136496) 1.00
css/parser/foundation_6_7_4 16832998 ns/iter (± 98800) 16732350 ns/iter (± 30144) 1.01
css/parser/tailwind_3_1_1 3231229 ns/iter (± 2342) 3236724 ns/iter (± 2374) 1.00
es/codegen/colors 327523 ns/iter (± 185009) 319068 ns/iter (± 180033) 1.03
es/codegen/large 1248309 ns/iter (± 642144) 1247338 ns/iter (± 651732) 1.00
es/codegen/with-parser/colors 47542 ns/iter (± 629) 47650 ns/iter (± 332) 1.00
es/codegen/with-parser/large 514544 ns/iter (± 1505) 511059 ns/iter (± 1190) 1.01
es/minify/libraries/antd 1439761707 ns/iter (± 18848500) 1350125954 ns/iter (± 16134220) 1.07
es/minify/libraries/d3 257993432 ns/iter (± 2209931) 255062762 ns/iter (± 7352350) 1.01
es/minify/libraries/echarts 1096503882 ns/iter (± 5823742) 1033015734 ns/iter (± 17725590) 1.06
es/minify/libraries/jquery 79688218 ns/iter (± 598520) 79015888 ns/iter (± 832158) 1.01
es/minify/libraries/lodash 95121719 ns/iter (± 912872) 94013570 ns/iter (± 1071722) 1.01
es/minify/libraries/moment 46037744 ns/iter (± 308838) 45399938 ns/iter (± 256638) 1.01
es/minify/libraries/react 17192488 ns/iter (± 161087) 16874200 ns/iter (± 193108) 1.02
es/minify/libraries/terser 210451658 ns/iter (± 939310) 206485863 ns/iter (± 3092509) 1.02
es/minify/libraries/three 384237684 ns/iter (± 7678752) 359274279 ns/iter (± 13157576) 1.07
es/minify/libraries/typescript 2686926342 ns/iter (± 15027011) 2490388810 ns/iter (± 21837261) 1.08
es/minify/libraries/victory 598567604 ns/iter (± 10975213) 548186384 ns/iter (± 14924705) 1.09
es/minify/libraries/vue 116614379 ns/iter (± 800894) 116375910 ns/iter (± 1605645) 1.00
es/visitor/compare/clone 2336926 ns/iter (± 11417) 2335573 ns/iter (± 6007) 1.00
es/visitor/compare/visit_mut_span 2713419 ns/iter (± 10085) 2707883 ns/iter (± 3445) 1.00
es/visitor/compare/visit_mut_span_panic 2747834 ns/iter (± 7100) 2740064 ns/iter (± 3057) 1.00
es/visitor/compare/fold_span 3828896 ns/iter (± 5230) 3811114 ns/iter (± 10111) 1.00
es/visitor/compare/fold_span_panic 3958351 ns/iter (± 6524) 3937220 ns/iter (± 9731) 1.01
es/lexer/colors 13076 ns/iter (± 11) 13184 ns/iter (± 27) 0.99
es/lexer/angular 6409893 ns/iter (± 6095) 6440041 ns/iter (± 4621) 1.00
es/lexer/backbone 788965 ns/iter (± 197) 794506 ns/iter (± 795) 0.99
es/lexer/jquery 4426596 ns/iter (± 2535) 4441917 ns/iter (± 3352) 1.00
es/lexer/jquery mobile 6926380 ns/iter (± 3327) 6937051 ns/iter (± 4192) 1.00
es/lexer/mootools 3477663 ns/iter (± 1736) 3490081 ns/iter (± 6156) 1.00
es/lexer/underscore 651146 ns/iter (± 258) 657109 ns/iter (± 417) 0.99
es/lexer/three 20981739 ns/iter (± 10025) 21121620 ns/iter (± 44008) 0.99
es/lexer/yui 3871491 ns/iter (± 1512) 3901410 ns/iter (± 6068) 0.99
es/parser/colors 29391 ns/iter (± 58) 29018 ns/iter (± 116) 1.01
es/parser/angular 15075433 ns/iter (± 123449) 15014175 ns/iter (± 176603) 1.00
es/parser/backbone 2152638 ns/iter (± 10296) 2151703 ns/iter (± 11248) 1.00
es/parser/jquery 11751667 ns/iter (± 124189) 11785592 ns/iter (± 131618) 1.00
es/parser/jquery mobile 18434636 ns/iter (± 227585) 18271253 ns/iter (± 191535) 1.01
es/parser/mootools 8949994 ns/iter (± 24638) 8908870 ns/iter (± 19667) 1.00
es/parser/underscore 1816924 ns/iter (± 11822) 1807584 ns/iter (± 11062) 1.01
es/parser/three 54835465 ns/iter (± 477180) 53894128 ns/iter (± 498672) 1.02
es/parser/yui 9145797 ns/iter (± 79527) 9002033 ns/iter (± 55596) 1.02
es/preset-env/usage/builtin_type 140528 ns/iter (± 33824) 142614 ns/iter (± 35233) 0.99
es/preset-env/usage/property 20185 ns/iter (± 46) 19958 ns/iter (± 106) 1.01
es/resolver/typescript 120221707 ns/iter (± 2027795) 110535010 ns/iter (± 2008833) 1.09
es/fixer/typescript 89444306 ns/iter (± 900566) 80073336 ns/iter (± 671667) 1.12
es/hygiene/typescript 194937558 ns/iter (± 1748634) 169048492 ns/iter (± 1124492) 1.15
es/resolver_with_hygiene/typescript 336629299 ns/iter (± 2092917) 313359245 ns/iter (± 3197298) 1.07
es/visitor/base-perf/module_clone 80409 ns/iter (± 368) 81092 ns/iter (± 362) 0.99
es/visitor/base-perf/fold_empty 90696 ns/iter (± 429) 90878 ns/iter (± 300) 1.00
es/visitor/base-perf/fold_noop_impl_all 90892 ns/iter (± 196) 90828 ns/iter (± 219) 1.00
es/visitor/base-perf/fold_noop_impl_vec 91577 ns/iter (± 546) 91097 ns/iter (± 232) 1.01
es/visitor/base-perf/boxing_boxed_clone 56 ns/iter (± 0) 56 ns/iter (± 0) 1
es/visitor/base-perf/boxing_unboxed_clone 42 ns/iter (± 0) 42 ns/iter (± 0) 1
es/visitor/base-perf/boxing_boxed 105 ns/iter (± 0) 102 ns/iter (± 0) 1.03
es/visitor/base-perf/boxing_unboxed 78 ns/iter (± 0) 78 ns/iter (± 0) 1
es/visitor/base-perf/visit_contains_this 3420 ns/iter (± 44) 3525 ns/iter (± 73) 0.97
es/base/parallel/resolver/typescript 6161216154 ns/iter (± 498526189) 5912710018 ns/iter (± 499249616) 1.04
es/base/parallel/hygiene/typescript 2189448050 ns/iter (± 15204389) 2001417120 ns/iter (± 19687774) 1.09
misc/visitors/time-complexity/time 5 98 ns/iter (± 0) 106 ns/iter (± 0) 0.92
misc/visitors/time-complexity/time 10 330 ns/iter (± 1) 351 ns/iter (± 5) 0.94
misc/visitors/time-complexity/time 15 647 ns/iter (± 9) 665 ns/iter (± 2) 0.97
misc/visitors/time-complexity/time 20 1201 ns/iter (± 1) 1227 ns/iter (± 1) 0.98
misc/visitors/time-complexity/time 40 6167 ns/iter (± 1) 6209 ns/iter (± 5) 0.99
misc/visitors/time-complexity/time 60 15554 ns/iter (± 47) 15629 ns/iter (± 45) 1.00
es/full-target/es2016 252584 ns/iter (± 387) 256778 ns/iter (± 392) 0.98
es/full-target/es2017 245811 ns/iter (± 279) 247090 ns/iter (± 333) 0.99
es/full-target/es2018 235017 ns/iter (± 170) 236200 ns/iter (± 643) 0.99
es2020_nullish_coalescing 92966 ns/iter (± 316) 93143 ns/iter (± 237) 1.00
es2020_optional_chaining 124438 ns/iter (± 376) 125230 ns/iter (± 305) 0.99
es2022_class_properties 149224 ns/iter (± 292) 149543 ns/iter (± 462) 1.00
es2018_object_rest_spread 96328 ns/iter (± 196) 96458 ns/iter (± 281) 1.00
es2019_optional_catch_binding 85603 ns/iter (± 354) 85399 ns/iter (± 157) 1.00
es2017_async_to_generator 86252 ns/iter (± 181) 86139 ns/iter (± 204) 1.00
es2016_exponentiation 90238 ns/iter (± 180) 91308 ns/iter (± 280) 0.99
es2015_arrow 94029 ns/iter (± 313) 94870 ns/iter (± 241) 0.99
es2015_block_scoped_fn 92044 ns/iter (± 198) 92693 ns/iter (± 296) 0.99
es2015_block_scoping 170208 ns/iter (± 346) 170234 ns/iter (± 307) 1.00

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.