mirror of
https://github.com/YGGverse/aquatic.git
synced 2026-04-02 02:35:31 +00:00
load tester: refactor, add udp sets, improve docs, add command options
This commit is contained in:
parent
7b6bb12c9e
commit
0317053f80
6 changed files with 354 additions and 196 deletions
|
|
@ -12,16 +12,16 @@ use tempfile::NamedTempFile;
|
|||
use crate::{
|
||||
common::{simple_load_test_runs, CpuMode, TaskSetCpuList},
|
||||
run::ProcessRunner,
|
||||
set::{run_sets, Server, SetConfig},
|
||||
set::{run_sets, SetConfig, Tracker},
|
||||
};
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
||||
pub enum UdpServer {
|
||||
pub enum UdpTracker {
|
||||
Aquatic,
|
||||
OpenTracker,
|
||||
}
|
||||
|
||||
impl Server for UdpServer {
|
||||
impl Tracker for UdpTracker {
|
||||
fn name(&self) -> String {
|
||||
match self {
|
||||
Self::Aquatic => "aquatic_udp".into(),
|
||||
|
|
@ -32,84 +32,184 @@ impl Server for UdpServer {
|
|||
|
||||
#[derive(Parser, Debug)]
|
||||
pub struct UdpCommand {
|
||||
#[arg(long, default_value_t = CpuMode::Split)]
|
||||
cpu_mode: CpuMode,
|
||||
/// Path to aquatic_udp_load_test binary
|
||||
#[arg(long, default_value = "./target/release-debug/aquatic_udp_load_test")]
|
||||
load_test: PathBuf,
|
||||
/// Path to aquatic_udp binary
|
||||
#[arg(long, default_value = "./target/release-debug/aquatic_udp")]
|
||||
aquatic: PathBuf,
|
||||
/// Path to opentracker binary
|
||||
#[arg(long, default_value = "opentracker")]
|
||||
opentracker: PathBuf,
|
||||
}
|
||||
|
||||
impl UdpCommand {
|
||||
pub fn run(&self) -> anyhow::Result<()> {
|
||||
run_sets(self, self.cpu_mode, self.sets(), |workers| {
|
||||
Box::new(AquaticUdpLoadTestProcessConfig { workers })
|
||||
pub fn run(
|
||||
&self,
|
||||
cpu_mode: CpuMode,
|
||||
min_cores: Option<usize>,
|
||||
max_cores: Option<usize>,
|
||||
) -> anyhow::Result<()> {
|
||||
let mut sets = self.sets(cpu_mode);
|
||||
|
||||
if let Some(min_cores) = min_cores {
|
||||
sets = sets.into_iter().filter(|(k, _)| *k >= min_cores).collect();
|
||||
}
|
||||
if let Some(max_cores) = max_cores {
|
||||
sets = sets.into_iter().filter(|(k, _)| *k <= max_cores).collect();
|
||||
}
|
||||
|
||||
run_sets(self, cpu_mode, sets, |workers| {
|
||||
Box::new(AquaticUdpLoadTestRunner { workers })
|
||||
});
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn sets(&self) -> IndexMap<usize, SetConfig<UdpCommand, UdpServer>> {
|
||||
fn sets(&self, cpu_mode: CpuMode) -> IndexMap<usize, SetConfig<UdpCommand, UdpTracker>> {
|
||||
indexmap::indexmap! {
|
||||
1 => SetConfig {
|
||||
implementations: indexmap! {
|
||||
UdpServer::Aquatic => vec![
|
||||
Rc::new(AquaticUdpProcessConfig {
|
||||
socket_workers: 1,
|
||||
swarm_workers: 1,
|
||||
}) as Rc<dyn ProcessRunner<Command = UdpCommand>>,
|
||||
UdpTracker::Aquatic => vec![
|
||||
AquaticUdpRunner::new(1, 1),
|
||||
],
|
||||
/*
|
||||
UdpServer::OpenTracker => vec![
|
||||
Rc::new(OpenTrackerUdpProcessConfig {
|
||||
workers: 1,
|
||||
}) as Rc<dyn RunProcess<Command = UdpCommand>>,
|
||||
Rc::new(OpenTrackerUdpProcessConfig {
|
||||
workers: 2,
|
||||
}) as Rc<dyn RunProcess<Command = UdpCommand>>,
|
||||
UdpTracker::OpenTracker => vec![
|
||||
OpenTrackerUdpRunner::new(0), // Handle requests within event loop
|
||||
OpenTrackerUdpRunner::new(1),
|
||||
OpenTrackerUdpRunner::new(2),
|
||||
],
|
||||
*/
|
||||
},
|
||||
load_test_runs: simple_load_test_runs(self.cpu_mode, &[1, 2, 4]),
|
||||
load_test_runs: simple_load_test_runs(cpu_mode, &[1, 2, 4, 6]),
|
||||
},
|
||||
2 => SetConfig {
|
||||
implementations: indexmap! {
|
||||
UdpServer::Aquatic => vec![
|
||||
Rc::new(AquaticUdpProcessConfig {
|
||||
socket_workers: 1,
|
||||
swarm_workers: 1,
|
||||
}) as Rc<dyn ProcessRunner<Command = UdpCommand>>,
|
||||
Rc::new(AquaticUdpProcessConfig {
|
||||
socket_workers: 2,
|
||||
swarm_workers: 1,
|
||||
}) as Rc<dyn ProcessRunner<Command = UdpCommand>>,
|
||||
UdpTracker::Aquatic => vec![
|
||||
AquaticUdpRunner::new(1, 1),
|
||||
AquaticUdpRunner::new(2, 1),
|
||||
AquaticUdpRunner::new(3, 1),
|
||||
],
|
||||
/*
|
||||
UdpServer::OpenTracker => vec![
|
||||
Rc::new(OpenTrackerUdpProcessConfig {
|
||||
workers: 2,
|
||||
}) as Rc<dyn RunProcess<Command = UdpCommand>>,
|
||||
Rc::new(OpenTrackerUdpProcessConfig {
|
||||
workers: 4,
|
||||
}) as Rc<dyn RunProcess<Command = UdpCommand>>,
|
||||
UdpTracker::OpenTracker => vec![
|
||||
OpenTrackerUdpRunner::new(2),
|
||||
OpenTrackerUdpRunner::new(4),
|
||||
],
|
||||
*/
|
||||
},
|
||||
load_test_runs: simple_load_test_runs(self.cpu_mode, &[1, 2, 4]),
|
||||
load_test_runs: simple_load_test_runs(cpu_mode, &[1, 2, 4, 6]),
|
||||
},
|
||||
3 => SetConfig {
|
||||
implementations: indexmap! {
|
||||
UdpTracker::Aquatic => vec![
|
||||
AquaticUdpRunner::new(2, 1),
|
||||
AquaticUdpRunner::new(3, 1),
|
||||
],
|
||||
UdpTracker::OpenTracker => vec![
|
||||
OpenTrackerUdpRunner::new(3),
|
||||
OpenTrackerUdpRunner::new(6),
|
||||
],
|
||||
},
|
||||
load_test_runs: simple_load_test_runs(cpu_mode, &[4, 6, 8]),
|
||||
},
|
||||
4 => SetConfig {
|
||||
implementations: indexmap! {
|
||||
UdpTracker::Aquatic => vec![
|
||||
AquaticUdpRunner::new(3, 1),
|
||||
AquaticUdpRunner::new(6, 1),
|
||||
],
|
||||
UdpTracker::OpenTracker => vec![
|
||||
OpenTrackerUdpRunner::new(4),
|
||||
OpenTrackerUdpRunner::new(8),
|
||||
],
|
||||
},
|
||||
load_test_runs: simple_load_test_runs(cpu_mode, &[4, 6, 8]),
|
||||
},
|
||||
6 => SetConfig {
|
||||
implementations: indexmap! {
|
||||
UdpTracker::Aquatic => vec![
|
||||
AquaticUdpRunner::new(5, 1),
|
||||
AquaticUdpRunner::new(10, 1),
|
||||
AquaticUdpRunner::new(4, 2),
|
||||
AquaticUdpRunner::new(8, 2),
|
||||
],
|
||||
UdpTracker::OpenTracker => vec![
|
||||
OpenTrackerUdpRunner::new(6),
|
||||
OpenTrackerUdpRunner::new(12),
|
||||
],
|
||||
},
|
||||
load_test_runs: simple_load_test_runs(cpu_mode, &[4, 6, 8, 12]),
|
||||
},
|
||||
8 => SetConfig {
|
||||
implementations: indexmap! {
|
||||
UdpTracker::Aquatic => vec![
|
||||
AquaticUdpRunner::new(7, 1),
|
||||
AquaticUdpRunner::new(14, 1),
|
||||
AquaticUdpRunner::new(6, 2),
|
||||
AquaticUdpRunner::new(12, 2),
|
||||
],
|
||||
UdpTracker::OpenTracker => vec![
|
||||
OpenTrackerUdpRunner::new(8),
|
||||
OpenTrackerUdpRunner::new(16),
|
||||
],
|
||||
},
|
||||
load_test_runs: simple_load_test_runs(cpu_mode, &[4, 8, 12]),
|
||||
},
|
||||
12 => SetConfig {
|
||||
implementations: indexmap! {
|
||||
UdpTracker::Aquatic => vec![
|
||||
AquaticUdpRunner::new(11, 1),
|
||||
AquaticUdpRunner::new(22, 1),
|
||||
AquaticUdpRunner::new(10, 2),
|
||||
AquaticUdpRunner::new(20, 2),
|
||||
AquaticUdpRunner::new(9, 3),
|
||||
AquaticUdpRunner::new(18, 3),
|
||||
],
|
||||
UdpTracker::OpenTracker => vec![
|
||||
OpenTrackerUdpRunner::new(12),
|
||||
OpenTrackerUdpRunner::new(24),
|
||||
],
|
||||
},
|
||||
load_test_runs: simple_load_test_runs(cpu_mode, &[4, 8, 12, 16]),
|
||||
},
|
||||
16 => SetConfig {
|
||||
implementations: indexmap! {
|
||||
UdpTracker::Aquatic => vec![
|
||||
AquaticUdpRunner::new(15, 1),
|
||||
AquaticUdpRunner::new(30, 1),
|
||||
AquaticUdpRunner::new(15, 2),
|
||||
AquaticUdpRunner::new(30, 2),
|
||||
AquaticUdpRunner::new(13, 3),
|
||||
AquaticUdpRunner::new(26, 3),
|
||||
AquaticUdpRunner::new(12, 4),
|
||||
AquaticUdpRunner::new(24, 4),
|
||||
],
|
||||
UdpTracker::OpenTracker => vec![
|
||||
OpenTrackerUdpRunner::new(16),
|
||||
OpenTrackerUdpRunner::new(32),
|
||||
],
|
||||
},
|
||||
load_test_runs: simple_load_test_runs(cpu_mode, &[4, 8, 12, 16]),
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct AquaticUdpProcessConfig {
|
||||
struct AquaticUdpRunner {
|
||||
socket_workers: usize,
|
||||
swarm_workers: usize,
|
||||
}
|
||||
|
||||
impl ProcessRunner for AquaticUdpProcessConfig {
|
||||
impl AquaticUdpRunner {
|
||||
fn new(
|
||||
socket_workers: usize,
|
||||
swarm_workers: usize,
|
||||
) -> Rc<dyn ProcessRunner<Command = UdpCommand>> {
|
||||
Rc::new(Self {
|
||||
socket_workers,
|
||||
swarm_workers,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl ProcessRunner for AquaticUdpRunner {
|
||||
type Command = UdpCommand;
|
||||
|
||||
fn run(
|
||||
|
|
@ -138,12 +238,6 @@ impl ProcessRunner for AquaticUdpProcessConfig {
|
|||
.spawn()?)
|
||||
}
|
||||
|
||||
fn info(&self) -> String {
|
||||
format!(
|
||||
"socket workers: {}, swarm workers: {}",
|
||||
self.socket_workers, self.swarm_workers
|
||||
)
|
||||
}
|
||||
fn keys(&self) -> IndexMap<String, String> {
|
||||
indexmap! {
|
||||
"socket workers".to_string() => self.socket_workers.to_string(),
|
||||
|
|
@ -153,11 +247,17 @@ impl ProcessRunner for AquaticUdpProcessConfig {
|
|||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct OpenTrackerUdpProcessConfig {
|
||||
struct OpenTrackerUdpRunner {
|
||||
workers: usize,
|
||||
}
|
||||
|
||||
impl ProcessRunner for OpenTrackerUdpProcessConfig {
|
||||
impl OpenTrackerUdpRunner {
|
||||
fn new(workers: usize) -> Rc<dyn ProcessRunner<Command = UdpCommand>> {
|
||||
Rc::new(Self { workers })
|
||||
}
|
||||
}
|
||||
|
||||
impl ProcessRunner for OpenTrackerUdpRunner {
|
||||
type Command = UdpCommand;
|
||||
|
||||
fn run(
|
||||
|
|
@ -166,7 +266,11 @@ impl ProcessRunner for OpenTrackerUdpProcessConfig {
|
|||
vcpus: &TaskSetCpuList,
|
||||
tmp_file: &mut NamedTempFile,
|
||||
) -> anyhow::Result<Child> {
|
||||
writeln!(tmp_file, "{}", self.workers)?; // FIXME
|
||||
writeln!(
|
||||
tmp_file,
|
||||
"listen.udp.workers {}\nlisten.udp 0.0.0.0:3000",
|
||||
self.workers
|
||||
)?;
|
||||
|
||||
Ok(Command::new("taskset")
|
||||
.arg("--cpu-list")
|
||||
|
|
@ -179,10 +283,6 @@ impl ProcessRunner for OpenTrackerUdpProcessConfig {
|
|||
.spawn()?)
|
||||
}
|
||||
|
||||
fn info(&self) -> String {
|
||||
format!("workers: {}", self.workers)
|
||||
}
|
||||
|
||||
fn keys(&self) -> IndexMap<String, String> {
|
||||
indexmap! {
|
||||
"workers".to_string() => self.workers.to_string(),
|
||||
|
|
@ -191,11 +291,11 @@ impl ProcessRunner for OpenTrackerUdpProcessConfig {
|
|||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct AquaticUdpLoadTestProcessConfig {
|
||||
struct AquaticUdpLoadTestRunner {
|
||||
workers: usize,
|
||||
}
|
||||
|
||||
impl ProcessRunner for AquaticUdpLoadTestProcessConfig {
|
||||
impl ProcessRunner for AquaticUdpLoadTestRunner {
|
||||
type Command = UdpCommand;
|
||||
|
||||
fn run(
|
||||
|
|
@ -224,10 +324,6 @@ impl ProcessRunner for AquaticUdpLoadTestProcessConfig {
|
|||
.spawn()?)
|
||||
}
|
||||
|
||||
fn info(&self) -> String {
|
||||
format!("workers: {}", self.workers)
|
||||
}
|
||||
|
||||
fn keys(&self) -> IndexMap<String, String> {
|
||||
indexmap! {
|
||||
"workers".to_string() => self.workers.to_string(),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue