diff --git a/Cargo.lock b/Cargo.lock index f0d4e603be..0228377795 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11702,6 +11702,7 @@ dependencies = [ "fs-err 3.1.0", "futures", "illumos-utils", + "itertools 0.14.0", "libc", "omicron-common", "omicron-test-utils", diff --git a/sled-diagnostics/Cargo.toml b/sled-diagnostics/Cargo.toml index 70ca27f157..0791a9afe4 100644 --- a/sled-diagnostics/Cargo.toml +++ b/sled-diagnostics/Cargo.toml @@ -13,6 +13,7 @@ cfg-if.workspace = true fs-err = { workspace = true, features = ["tokio"] } futures.workspace = true illumos-utils.workspace = true +itertools.workspace = true libc.workspace = true omicron-workspace-hack.workspace = true once_cell.workspace = true diff --git a/sled-diagnostics/src/lib.rs b/sled-diagnostics/src/lib.rs index 133e176575..639ad9b2ed 100644 --- a/sled-diagnostics/src/lib.rs +++ b/sled-diagnostics/src/lib.rs @@ -6,6 +6,7 @@ use std::sync::Arc; +use itertools::Itertools; use slog::Logger; #[macro_use] @@ -34,6 +35,9 @@ use queries::*; /// Max number of commands to run in parallel const MAX_PARALLELISM: usize = 50; +/// Max number of pids to operate on when running ptool commands +const PID_CHUNK_SIZE: usize = 15; + struct MultipleCommands { semaphore: Arc, set: JoinSet, @@ -119,9 +123,9 @@ pub async fn pargs_oxide_processes( }; let mut commands = MultipleCommands::new(); - for pid in pids { + for pid_chunk in &pids.into_iter().chunks(PID_CHUNK_SIZE) { commands.add_command(execute_command_with_timeout( - pargs_process(pid), + pargs_processes(pid_chunk), DEFAULT_TIMEOUT, )); } @@ -140,9 +144,9 @@ pub async fn pstack_oxide_processes( }; let mut commands = MultipleCommands::new(); - for pid in pids { + for pid_chunk in &pids.into_iter().chunks(PID_CHUNK_SIZE) { commands.add_command(execute_command_with_timeout( - pstack_process(pid), + pstack_processes(pid_chunk), DEFAULT_TIMEOUT, )); } @@ -161,9 +165,9 @@ pub async fn pfiles_oxide_processes( }; let mut commands = MultipleCommands::new(); - for pid in pids { + for pid_chunk in &pids.into_iter().chunks(PID_CHUNK_SIZE) { commands.add_command(execute_command_with_timeout( - pfiles_process(pid), + pfiles_processes(pid_chunk), DEFAULT_TIMEOUT, )); } diff --git a/sled-diagnostics/src/queries.rs b/sled-diagnostics/src/queries.rs index c1452abbc4..311651293c 100644 --- a/sled-diagnostics/src/queries.rs +++ b/sled-diagnostics/src/queries.rs @@ -248,21 +248,21 @@ pub fn nvmeadm_list() -> Command { cmd } -pub fn pargs_process(pid: i32) -> Command { +pub fn pargs_processes(pids: impl Iterator) -> Command { let mut cmd = std::process::Command::new(PFEXEC); - cmd.env_clear().arg(PARGS).arg("-ae").arg(pid.to_string()); + cmd.env_clear().arg(PARGS).arg("-ae").args(pids.map(|p| p.to_string())); cmd } -pub fn pstack_process(pid: i32) -> Command { +pub fn pstack_processes(pids: impl Iterator) -> Command { let mut cmd = std::process::Command::new(PFEXEC); - cmd.env_clear().arg(PSTACK).arg(pid.to_string()); + cmd.env_clear().arg(PSTACK).args(pids.map(|p| p.to_string())); cmd } -pub fn pfiles_process(pid: i32) -> Command { +pub fn pfiles_processes(pids: impl Iterator) -> Command { let mut cmd = std::process::Command::new(PFEXEC); - cmd.env_clear().arg(PFILES).arg(pid.to_string()); + cmd.env_clear().arg(PFILES).args(pids.map(|p| p.to_string())); cmd }