diff --git a/Cargo.lock b/Cargo.lock
index 13e6b716e662e5c7a644a8abaff011c87e651750..90415606bd3507d0d12dab805f22dcdadde2aa77 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -21520,6 +21520,7 @@ dependencies = [
  "console",
  "filetime",
  "frame-metadata",
+ "jobserver",
  "merkleized-metadata",
  "parity-scale-codec",
  "parity-wasm",
diff --git a/Cargo.toml b/Cargo.toml
index 1699bd97a8ee41c93b4246ed28b12447fbcee025..9b14dfd3cdfbb4c0128763ee7a60aea28dbd9306 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -803,6 +803,7 @@ is-terminal = { version = "0.4.9" }
 is_executable = { version = "1.0.1" }
 isahc = { version = "1.2" }
 itertools = { version = "0.11" }
+jobserver = { version = "0.1.26" }
 jsonpath_lib = { version = "0.3" }
 jsonrpsee = { version = "0.23.2" }
 jsonrpsee-core = { version = "0.23.2" }
diff --git a/substrate/utils/wasm-builder/Cargo.toml b/substrate/utils/wasm-builder/Cargo.toml
index f084400c12e8daf5dc571a16e4df97ea26230a58..28fdebf209bd313a55a636bbe315d1b28d360ba0 100644
--- a/substrate/utils/wasm-builder/Cargo.toml
+++ b/substrate/utils/wasm-builder/Cargo.toml
@@ -27,6 +27,7 @@ filetime = { workspace = true }
 wasm-opt = { workspace = true }
 parity-wasm = { workspace = true }
 polkavm-linker = { workspace = true }
+jobserver = { workspace = true }
 
 # Dependencies required for the `metadata-hash` feature.
 merkleized-metadata = { optional = true, workspace = true }
diff --git a/substrate/utils/wasm-builder/src/builder.rs b/substrate/utils/wasm-builder/src/builder.rs
index 37c6c4aa74319321122dabb6d3da7295d753732e..eb761a103d62ecd680747584e077de5025f9955b 100644
--- a/substrate/utils/wasm-builder/src/builder.rs
+++ b/substrate/utils/wasm-builder/src/builder.rs
@@ -346,6 +346,8 @@ fn build_project(
 	check_for_runtime_version_section: bool,
 	#[cfg(feature = "metadata-hash")] enable_metadata_hash: Option<MetadataExtraInfo>,
 ) {
+	// Init jobserver as soon as possible
+	crate::wasm_project::get_jobserver();
 	let cargo_cmd = match crate::prerequisites::check(target) {
 		Ok(cmd) => cmd,
 		Err(err_msg) => {
diff --git a/substrate/utils/wasm-builder/src/wasm_project.rs b/substrate/utils/wasm-builder/src/wasm_project.rs
index 20fa9fc1aa33e115d218b7cb8bd9d144c0a5d056..63887389fb1efefab2aefe2ad7fce12078f7a4ac 100644
--- a/substrate/utils/wasm-builder/src/wasm_project.rs
+++ b/substrate/utils/wasm-builder/src/wasm_project.rs
@@ -31,6 +31,7 @@ use std::{
 	ops::Deref,
 	path::{Path, PathBuf},
 	process,
+	sync::OnceLock,
 };
 use strum::{EnumIter, IntoEnumIterator};
 use toml::value::Table;
@@ -899,6 +900,12 @@ fn build_bloaty_blob(
 		}
 	}
 
+	// Inherit jobserver in child cargo command to ensure we don't try to use more concurrency than
+	// available
+	if let Some(c) = get_jobserver() {
+		c.configure(&mut build_cmd);
+	}
+
 	println!("{}", colorize_info_message("Information that should be included in a bug report."));
 	println!("{} {:?}", colorize_info_message("Executing build command:"), build_cmd);
 	println!("{} {}", colorize_info_message("Using rustc version:"), cargo_cmd.rustc_version());
@@ -1178,3 +1185,13 @@ fn copy_blob_to_target_directory(cargo_manifest: &Path, blob_binary: &WasmBinary
 	)
 	.expect("Copies blob binary to `WASM_TARGET_DIRECTORY`.");
 }
+
+// Get jobserver from parent cargo command
+pub fn get_jobserver() -> &'static Option<jobserver::Client> {
+	static JOBSERVER: OnceLock<Option<jobserver::Client>> = OnceLock::new();
+
+	JOBSERVER.get_or_init(|| {
+		// Unsafe because it deals with raw fds
+		unsafe { jobserver::Client::from_env() }
+	})
+}