Merge pull request #187 from greatest-ape/work-2024-02-08

add bencher CpuModes; change some udp and udp load test default settings
This commit is contained in:
Joakim Frostegård 2024-02-08 15:25:10 +01:00 committed by GitHub
commit 73e339ea6d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 154 additions and 100 deletions

View file

@ -2,10 +2,10 @@
## High priority ## High priority
* aquatic_bench * aquatic_bencher
* Opentracker "slow to get up to speed", is it due to getting faster once * bench aquatic_udp with io_uring too
inserts are rarely needed since most ip-port combinations have been sent? * test with SubsequentOnePerPair
In that case, a shorter duration (e.g., 30 seconds) would be a good idea. * include chihaya with higher core counts?
## Medium priority ## Medium priority

View file

@ -57,7 +57,12 @@ impl TaskSetCpuList {
) -> Self { ) -> Self {
match direction { match direction {
CpuDirection::Asc => match mode { CpuDirection::Asc => match mode {
CpuMode::Split => { CpuMode::Subsequent => {
let range = 0..(available_parallelism.min(requested_cpus));
Self(vec![range.try_into().unwrap()])
}
CpuMode::SplitPairs => {
let middle = available_parallelism / 2; let middle = available_parallelism / 2;
let range_a = 0..(middle.min(requested_cpus)); let range_a = 0..(middle.min(requested_cpus));
@ -68,14 +73,31 @@ impl TaskSetCpuList {
range_b.try_into().unwrap(), range_b.try_into().unwrap(),
]) ])
} }
CpuMode::All => { CpuMode::SubsequentPairs => {
let range = 0..(available_parallelism.min(requested_cpus)); let range = 0..(available_parallelism.min(requested_cpus * 2));
Self(vec![range.try_into().unwrap()]) Self(vec![range.try_into().unwrap()])
} }
CpuMode::SubsequentOnePerPair => {
let range = 0..(available_parallelism.min(requested_cpus * 2));
Self(
range
.chunks(2)
.into_iter()
.map(|mut chunk| TaskSetCpuIndicator::Single(chunk.next().unwrap()))
.collect(),
)
}
}, },
CpuDirection::Desc => match mode { CpuDirection::Desc => match mode {
CpuMode::Split => { CpuMode::Subsequent => {
let range =
available_parallelism.saturating_sub(requested_cpus)..available_parallelism;
Self(vec![range.try_into().unwrap()])
}
CpuMode::SplitPairs => {
let middle = available_parallelism / 2; let middle = available_parallelism / 2;
let range_a = middle.saturating_sub(requested_cpus)..middle; let range_a = middle.saturating_sub(requested_cpus)..middle;
@ -88,12 +110,24 @@ impl TaskSetCpuList {
range_b.try_into().unwrap(), range_b.try_into().unwrap(),
]) ])
} }
CpuMode::All => { CpuMode::SubsequentPairs => {
let range = let range = available_parallelism.saturating_sub(requested_cpus * 2)
available_parallelism.saturating_sub(requested_cpus)..available_parallelism; ..available_parallelism;
Self(vec![range.try_into().unwrap()]) Self(vec![range.try_into().unwrap()])
} }
CpuMode::SubsequentOnePerPair => {
let range = available_parallelism.saturating_sub(requested_cpus * 2)
..available_parallelism;
Self(
range
.chunks(2)
.into_iter()
.map(|mut chunk| TaskSetCpuIndicator::Single(chunk.next().unwrap()))
.collect(),
)
}
}, },
} }
} }
@ -133,15 +167,23 @@ impl TryFrom<Range<usize>> for TaskSetCpuIndicator {
#[derive(Debug, Clone, Copy, clap::ValueEnum)] #[derive(Debug, Clone, Copy, clap::ValueEnum)]
pub enum CpuMode { pub enum CpuMode {
Split, /// For 8 vCPU processor, use vCPU groups 0, 1, 2, 3, 4, 5, 6 and 7
All, Subsequent,
/// For 8 vCPU processor, use vCPU groups 0 & 4, 1 & 5, 2 & 6 and 3 & 7
SplitPairs,
/// For 8 vCPU processor, use vCPU groups 0 & 1, 2 & 3, 4 & 5 and 6 & 7
SubsequentPairs,
/// For 8 vCPU processor, use vCPU groups 0, 2, 4 and 6
SubsequentOnePerPair,
} }
impl Display for CpuMode { impl Display for CpuMode {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self { match self {
Self::All => f.write_str("all"), Self::Subsequent => f.write_str("subsequent"),
Self::Split => f.write_str("split"), Self::SplitPairs => f.write_str("split-pairs"),
Self::SubsequentPairs => f.write_str("subsequent-pairs"),
Self::SubsequentOnePerPair => f.write_str("subsequent-one-per-pair"),
} }
} }
} }
@ -174,100 +216,113 @@ mod tests {
use super::*; use super::*;
#[test] #[test]
fn test_task_set_cpu_list_split_asc() { fn test_task_set_cpu_list_split_pairs_asc() {
let f = TaskSetCpuList::new_with_available_parallelism; let f = TaskSetCpuList::new_with_available_parallelism;
assert_eq!( let mode = CpuMode::SplitPairs;
f(8, CpuMode::Split, CpuDirection::Asc, 1).as_cpu_list(), let direction = CpuDirection::Asc;
"0,4"
); assert_eq!(f(8, mode, direction, 1).as_cpu_list(), "0,4");
assert_eq!( assert_eq!(f(8, mode, direction, 2).as_cpu_list(), "0-1,4-5");
f(8, CpuMode::Split, CpuDirection::Asc, 2).as_cpu_list(), assert_eq!(f(8, mode, direction, 4).as_cpu_list(), "0-3,4-7");
"0-1,4-5" assert_eq!(f(8, mode, direction, 8).as_cpu_list(), "0-3,4-7");
); assert_eq!(f(8, mode, direction, 9).as_cpu_list(), "0-3,4-7");
assert_eq!(
f(8, CpuMode::Split, CpuDirection::Asc, 4).as_cpu_list(),
"0-3,4-7"
);
assert_eq!(
f(8, CpuMode::Split, CpuDirection::Asc, 8).as_cpu_list(),
"0-3,4-7"
);
assert_eq!(
f(8, CpuMode::Split, CpuDirection::Asc, 9).as_cpu_list(),
"0-3,4-7"
);
} }
#[test] #[test]
fn test_task_set_cpu_list_split_desc() { fn test_task_set_cpu_list_split_pairs_desc() {
let f = TaskSetCpuList::new_with_available_parallelism; let f = TaskSetCpuList::new_with_available_parallelism;
assert_eq!( let mode = CpuMode::SplitPairs;
f(8, CpuMode::Split, CpuDirection::Desc, 1).as_cpu_list(), let direction = CpuDirection::Desc;
"3,7"
); assert_eq!(f(8, mode, direction, 1).as_cpu_list(), "3,7");
assert_eq!( assert_eq!(f(8, mode, direction, 2).as_cpu_list(), "2-3,6-7");
f(8, CpuMode::Split, CpuDirection::Desc, 2).as_cpu_list(), assert_eq!(f(8, mode, direction, 4).as_cpu_list(), "0-3,4-7");
"2-3,6-7" assert_eq!(f(8, mode, direction, 8).as_cpu_list(), "0-3,4-7");
); assert_eq!(f(8, mode, direction, 9).as_cpu_list(), "0-3,4-7");
assert_eq!(
f(8, CpuMode::Split, CpuDirection::Desc, 4).as_cpu_list(),
"0-3,4-7"
);
assert_eq!(
f(8, CpuMode::Split, CpuDirection::Desc, 8).as_cpu_list(),
"0-3,4-7"
);
assert_eq!(
f(8, CpuMode::Split, CpuDirection::Desc, 9).as_cpu_list(),
"0-3,4-7"
);
} }
#[test] #[test]
fn test_task_set_cpu_list_all_asc() { fn test_task_set_cpu_list_subsequent_asc() {
let f = TaskSetCpuList::new_with_available_parallelism; let f = TaskSetCpuList::new_with_available_parallelism;
assert_eq!(f(8, CpuMode::All, CpuDirection::Asc, 1).as_cpu_list(), "0"); let mode = CpuMode::Subsequent;
assert_eq!( let direction = CpuDirection::Asc;
f(8, CpuMode::All, CpuDirection::Asc, 2).as_cpu_list(),
"0-1" assert_eq!(f(8, mode, direction, 1).as_cpu_list(), "0");
); assert_eq!(f(8, mode, direction, 2).as_cpu_list(), "0-1");
assert_eq!( assert_eq!(f(8, mode, direction, 4).as_cpu_list(), "0-3");
f(8, CpuMode::All, CpuDirection::Asc, 4).as_cpu_list(), assert_eq!(f(8, mode, direction, 8).as_cpu_list(), "0-7");
"0-3" assert_eq!(f(8, mode, direction, 9).as_cpu_list(), "0-7");
);
assert_eq!(
f(8, CpuMode::All, CpuDirection::Asc, 8).as_cpu_list(),
"0-7"
);
assert_eq!(
f(8, CpuMode::All, CpuDirection::Asc, 9).as_cpu_list(),
"0-7"
);
} }
#[test] #[test]
fn test_task_set_cpu_list_all_desc() { fn test_task_set_cpu_list_subsequent_desc() {
let f = TaskSetCpuList::new_with_available_parallelism; let f = TaskSetCpuList::new_with_available_parallelism;
assert_eq!(f(8, CpuMode::All, CpuDirection::Desc, 1).as_cpu_list(), "7"); let mode = CpuMode::Subsequent;
assert_eq!( let direction = CpuDirection::Desc;
f(8, CpuMode::All, CpuDirection::Desc, 2).as_cpu_list(),
"6-7" assert_eq!(f(8, mode, direction, 1).as_cpu_list(), "7");
); assert_eq!(f(8, mode, direction, 2).as_cpu_list(), "6-7");
assert_eq!( assert_eq!(f(8, mode, direction, 4).as_cpu_list(), "4-7");
f(8, CpuMode::All, CpuDirection::Desc, 4).as_cpu_list(), assert_eq!(f(8, mode, direction, 8).as_cpu_list(), "0-7");
"4-7" assert_eq!(f(8, mode, direction, 9).as_cpu_list(), "0-7");
); }
assert_eq!(
f(8, CpuMode::All, CpuDirection::Desc, 8).as_cpu_list(), #[test]
"0-7" fn test_task_set_cpu_list_subsequent_pairs_asc() {
); let f = TaskSetCpuList::new_with_available_parallelism;
assert_eq!( let mode = CpuMode::SubsequentPairs;
f(8, CpuMode::All, CpuDirection::Desc, 9).as_cpu_list(), let direction = CpuDirection::Asc;
"0-7"
); assert_eq!(f(8, mode, direction, 1).as_cpu_list(), "0-1");
assert_eq!(f(8, mode, direction, 2).as_cpu_list(), "0-3");
assert_eq!(f(8, mode, direction, 4).as_cpu_list(), "0-7");
assert_eq!(f(8, mode, direction, 8).as_cpu_list(), "0-7");
assert_eq!(f(8, mode, direction, 9).as_cpu_list(), "0-7");
}
#[test]
fn test_task_set_cpu_list_subsequent_pairs_desc() {
let f = TaskSetCpuList::new_with_available_parallelism;
let mode = CpuMode::SubsequentPairs;
let direction = CpuDirection::Desc;
assert_eq!(f(8, mode, direction, 1).as_cpu_list(), "6-7");
assert_eq!(f(8, mode, direction, 2).as_cpu_list(), "4-7");
assert_eq!(f(8, mode, direction, 4).as_cpu_list(), "0-7");
assert_eq!(f(8, mode, direction, 8).as_cpu_list(), "0-7");
assert_eq!(f(8, mode, direction, 9).as_cpu_list(), "0-7");
}
#[test]
fn test_task_set_cpu_list_subsequent_one_per_pair_asc() {
let f = TaskSetCpuList::new_with_available_parallelism;
let mode = CpuMode::SubsequentOnePerPair;
let direction = CpuDirection::Asc;
assert_eq!(f(8, mode, direction, 1).as_cpu_list(), "0");
assert_eq!(f(8, mode, direction, 2).as_cpu_list(), "0,2");
assert_eq!(f(8, mode, direction, 4).as_cpu_list(), "0,2,4,6");
assert_eq!(f(8, mode, direction, 8).as_cpu_list(), "0,2,4,6");
assert_eq!(f(8, mode, direction, 9).as_cpu_list(), "0,2,4,6");
}
#[test]
fn test_task_set_cpu_list_subsequent_one_per_pair_desc() {
let f = TaskSetCpuList::new_with_available_parallelism;
let mode = CpuMode::SubsequentOnePerPair;
let direction = CpuDirection::Desc;
assert_eq!(f(8, mode, direction, 1).as_cpu_list(), "6");
assert_eq!(f(8, mode, direction, 2).as_cpu_list(), "4,6");
assert_eq!(f(8, mode, direction, 4).as_cpu_list(), "0,2,4,6");
assert_eq!(f(8, mode, direction, 8).as_cpu_list(), "0,2,4,6");
assert_eq!(f(8, mode, direction, 9).as_cpu_list(), "0,2,4,6");
} }
} }

View file

@ -13,7 +13,7 @@ use set::run_sets;
struct Args { struct Args {
/// How to choose which virtual CPUs to allow trackers and load test /// How to choose which virtual CPUs to allow trackers and load test
/// executables on /// executables on
#[arg(long, default_value_t = CpuMode::Split)] #[arg(long, default_value_t = CpuMode::SplitPairs)]
cpu_mode: CpuMode, cpu_mode: CpuMode,
/// Minimum number of tracker cpu cores to run benchmarks for /// Minimum number of tracker cpu cores to run benchmarks for
#[arg(long)] #[arg(long)]

View file

@ -102,8 +102,7 @@ pub struct NetworkConfig {
pub poll_timeout_ms: u64, pub poll_timeout_ms: u64,
/// Number of ring entries (io_uring backend only) /// Number of ring entries (io_uring backend only)
/// ///
/// Will be rounded to next power of two if not already one. Increasing /// Will be rounded to next power of two if not already one.
/// this value can help throughput up to a certain point.
#[cfg(feature = "io-uring")] #[cfg(feature = "io-uring")]
pub ring_size: u16, pub ring_size: u16,
/// Store this many responses at most for retrying (once) on send failure /// Store this many responses at most for retrying (once) on send failure
@ -132,7 +131,7 @@ impl Default for NetworkConfig {
socket_recv_buffer_size: 8_000_000, socket_recv_buffer_size: 8_000_000,
poll_timeout_ms: 50, poll_timeout_ms: 50,
#[cfg(feature = "io-uring")] #[cfg(feature = "io-uring")]
ring_size: 1024, ring_size: 128,
resend_buffer_max_len: 0, resend_buffer_max_len: 0,
} }
} }
@ -153,7 +152,7 @@ impl Default for ProtocolConfig {
fn default() -> Self { fn default() -> Self {
Self { Self {
max_scrape_torrents: 70, max_scrape_torrents: 70,
max_response_peers: 50, max_response_peers: 30,
peer_announce_interval: 60 * 15, peer_announce_interval: 60 * 15,
} }
} }

View file

@ -124,8 +124,8 @@ impl Default for RequestConfig {
number_of_peers: 2_000_000, number_of_peers: 2_000_000,
scrape_max_torrents: 10, scrape_max_torrents: 10,
announce_peers_wanted: 30, announce_peers_wanted: 30,
weight_connect: 1, weight_connect: 50,
weight_announce: 100, weight_announce: 50,
weight_scrape: 1, weight_scrape: 1,
peer_seeder_probability: 0.75, peer_seeder_probability: 0.75,
} }