rolldown icon indicating copy to clipboard operation
rolldown copied to clipboard

[Perf]: Optimize multi thread IO in macOS

Open IWANABETHATGUY opened this issue 9 months ago • 2 comments

ref: https://github.com/oven-sh/bun/pull/17577/files https://github.com/web-infra-dev/rspack/pull/9518

IWANABETHATGUY avatar Mar 03 '25 16:03 IWANABETHATGUY

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.

Boshen avatar May 10 '25 13:05 Boshen

We should try 4.min(cpu_num()) instead according to https://github.com/oven-sh/bun/pull/17577/files#diff-c9bc275f9466e5179bb80454b6445c7041d2a0fb79932dd5de7a5c3196bdbd75R196

IWANABETHATGUY avatar May 11 '25 04:05 IWANABETHATGUY

We haven't optimized anything yet, only the env ROLLDOWN_MAX_BLOCKING_THREADS is added for testing purposes.

Boshen avatar Aug 06 '25 15:08 Boshen