[Perf]: Optimize multi thread IO in macOS
ref: https://github.com/oven-sh/bun/pull/17577/files https://github.com/web-infra-dev/rspack/pull/9518
diff --git a/crates/rolldown_binding/src/lib.rs b/crates/rolldown_binding/src/lib.rs
index dcb2203a3..ea836d80e 100644
--- a/crates/rolldown_binding/src/lib.rs
+++ b/crates/rolldown_binding/src/lib.rs
@@ -30,6 +30,35 @@ mod generated;
pub mod watcher;
pub mod worker_manager;
+#[cfg(not(target_family = "wasm"))]
+#[napi_derive::module_init]
+pub fn init() {
+ use napi::{bindgen_prelude::create_custom_tokio_runtime, tokio};
+ let max_blocking_threads = {
+ std::env::var("ROLLDOWN_MAX_BLOCKING_THREADS")
+ .ok()
+ .and_then(|v| v.parse::<usize>().ok())
+ .unwrap_or({
+ #[cfg(target_os = "macos")]
+ {
+ num_cpus::get_physical()
+ }
+ #[cfg(not(target_os = "macos"))]
+ {
+ // default value in tokio implementation
+ 512
+ }
+ })
+ };
+ dbg!(max_blocking_threads);
+ let rt = tokio::runtime::Builder::new_multi_thread()
+ .max_blocking_threads(max_blocking_threads)
+ .enable_all()
+ .build()
+ .expect("Failed to create tokio runtime");
+ create_custom_tokio_runtime(rt);
+}
+
I made this change based on https://github.com/rolldown/rolldown/pull/3810
In monitor-oxc and benchmarks/apps/10000, I found no difference between 8 and 512 max blocking threads on my M2.
Example run:
benchmarks/apps/10000 main ❯ ROLLDOWN_MAX_BLOCKING_THREADS=512 /usr/bin/time -ahl ~/rolldown/rolldown/packages/rolldown/bin/cli.mjs -c
✔ Finished in 509.57 ms
0.63s real 1.21s user 1.71s sys
624427008 maximum resident set size
benchmarks/apps/10000 main ❯ ROLLDOWN_MAX_BLOCKING_THREADS=8 /usr/bin/time -ahl ~/rolldown/rolldown/packages/rolldown/bin/cli.mjs -c
✔ Finished in 513.64 ms
0.64s real 1.23s user 1.80s sys
monitor-oxc main ❯ ROLLDOWN_MAX_BLOCKING_THREADS=512 /usr/bin/time -ahl ~/rolldown/rolldown/packages/rolldown/bin/cli.mjs -c
✔ Finished in 7.39 s
8.11s real 13.09s user 7.08s sys
3594895360 maximum resident set size
monitor-oxc main ❯ ROLLDOWN_MAX_BLOCKING_THREADS=8 /usr/bin/time -ahl ~/rolldown/rolldown/packages/rolldown/bin/cli.mjs -c
✔ Finished in 7.18 s
7.87s real 13.10s user 6.72s sys
3659087872 maximum resident set size
Let's not tweak any default settings without conducting heavy research and rigorous benchmarking.
We should try 4.min(cpu_num()) instead according to https://github.com/oven-sh/bun/pull/17577/files#diff-c9bc275f9466e5179bb80454b6445c7041d2a0fb79932dd5de7a5c3196bdbd75R196
We haven't optimized anything yet, only the env ROLLDOWN_MAX_BLOCKING_THREADS is added for testing purposes.