From f07870c8e780edc3b5c8fa034791621a07ea3f75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Frosteg=C3=A5rd?= Date: Thu, 8 Feb 2024 09:31:08 +0100 Subject: [PATCH 1/6] bencher: rename cpu modes --- crates/bencher/src/common.rs | 56 ++++++++++++++++++------------------ crates/bencher/src/main.rs | 2 +- 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/crates/bencher/src/common.rs b/crates/bencher/src/common.rs index 4e5b958..dcff665 100644 --- a/crates/bencher/src/common.rs +++ b/crates/bencher/src/common.rs @@ -57,7 +57,7 @@ impl TaskSetCpuList { ) -> Self { match direction { CpuDirection::Asc => match mode { - CpuMode::Split => { + CpuMode::SplitPairs => { let middle = available_parallelism / 2; let range_a = 0..(middle.min(requested_cpus)); @@ -68,14 +68,14 @@ impl TaskSetCpuList { range_b.try_into().unwrap(), ]) } - CpuMode::All => { + CpuMode::SubsequentSingle => { let range = 0..(available_parallelism.min(requested_cpus)); Self(vec![range.try_into().unwrap()]) } }, CpuDirection::Desc => match mode { - CpuMode::Split => { + CpuMode::SplitPairs => { let middle = available_parallelism / 2; let range_a = middle.saturating_sub(requested_cpus)..middle; @@ -88,7 +88,7 @@ impl TaskSetCpuList { range_b.try_into().unwrap(), ]) } - CpuMode::All => { + CpuMode::SubsequentSingle => { let range = available_parallelism.saturating_sub(requested_cpus)..available_parallelism; @@ -133,15 +133,15 @@ impl TryFrom> for TaskSetCpuIndicator { #[derive(Debug, Clone, Copy, clap::ValueEnum)] pub enum CpuMode { - Split, - All, + SplitPairs, + SubsequentSingle, } impl Display for CpuMode { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { - Self::All => f.write_str("all"), - Self::Split => f.write_str("split"), + Self::SubsequentSingle => f.write_str("subsequent-single"), + Self::SplitPairs => f.write_str("split-paris"), } } } @@ -178,23 +178,23 @@ mod tests { let f = TaskSetCpuList::new_with_available_parallelism; assert_eq!( - f(8, CpuMode::Split, CpuDirection::Asc, 1).as_cpu_list(), + f(8, CpuMode::SplitPairs, CpuDirection::Asc, 1).as_cpu_list(), "0,4" ); assert_eq!( - f(8, CpuMode::Split, CpuDirection::Asc, 2).as_cpu_list(), + f(8, CpuMode::SplitPairs, CpuDirection::Asc, 2).as_cpu_list(), "0-1,4-5" ); assert_eq!( - f(8, CpuMode::Split, CpuDirection::Asc, 4).as_cpu_list(), + f(8, CpuMode::SplitPairs, CpuDirection::Asc, 4).as_cpu_list(), "0-3,4-7" ); assert_eq!( - f(8, CpuMode::Split, CpuDirection::Asc, 8).as_cpu_list(), + f(8, CpuMode::SplitPairs, CpuDirection::Asc, 8).as_cpu_list(), "0-3,4-7" ); assert_eq!( - f(8, CpuMode::Split, CpuDirection::Asc, 9).as_cpu_list(), + f(8, CpuMode::SplitPairs, CpuDirection::Asc, 9).as_cpu_list(), "0-3,4-7" ); } @@ -204,23 +204,23 @@ mod tests { let f = TaskSetCpuList::new_with_available_parallelism; assert_eq!( - f(8, CpuMode::Split, CpuDirection::Desc, 1).as_cpu_list(), + f(8, CpuMode::SplitPairs, CpuDirection::Desc, 1).as_cpu_list(), "3,7" ); assert_eq!( - f(8, CpuMode::Split, CpuDirection::Desc, 2).as_cpu_list(), + f(8, CpuMode::SplitPairs, CpuDirection::Desc, 2).as_cpu_list(), "2-3,6-7" ); assert_eq!( - f(8, CpuMode::Split, CpuDirection::Desc, 4).as_cpu_list(), + f(8, CpuMode::SplitPairs, CpuDirection::Desc, 4).as_cpu_list(), "0-3,4-7" ); assert_eq!( - f(8, CpuMode::Split, CpuDirection::Desc, 8).as_cpu_list(), + f(8, CpuMode::SplitPairs, CpuDirection::Desc, 8).as_cpu_list(), "0-3,4-7" ); assert_eq!( - f(8, CpuMode::Split, CpuDirection::Desc, 9).as_cpu_list(), + f(8, CpuMode::SplitPairs, CpuDirection::Desc, 9).as_cpu_list(), "0-3,4-7" ); } @@ -229,21 +229,21 @@ mod tests { fn test_task_set_cpu_list_all_asc() { let f = TaskSetCpuList::new_with_available_parallelism; - assert_eq!(f(8, CpuMode::All, CpuDirection::Asc, 1).as_cpu_list(), "0"); + assert_eq!(f(8, CpuMode::SubsequentSingle, CpuDirection::Asc, 1).as_cpu_list(), "0"); assert_eq!( - f(8, CpuMode::All, CpuDirection::Asc, 2).as_cpu_list(), + f(8, CpuMode::SubsequentSingle, CpuDirection::Asc, 2).as_cpu_list(), "0-1" ); assert_eq!( - f(8, CpuMode::All, CpuDirection::Asc, 4).as_cpu_list(), + f(8, CpuMode::SubsequentSingle, CpuDirection::Asc, 4).as_cpu_list(), "0-3" ); assert_eq!( - f(8, CpuMode::All, CpuDirection::Asc, 8).as_cpu_list(), + f(8, CpuMode::SubsequentSingle, CpuDirection::Asc, 8).as_cpu_list(), "0-7" ); assert_eq!( - f(8, CpuMode::All, CpuDirection::Asc, 9).as_cpu_list(), + f(8, CpuMode::SubsequentSingle, CpuDirection::Asc, 9).as_cpu_list(), "0-7" ); } @@ -252,21 +252,21 @@ mod tests { fn test_task_set_cpu_list_all_desc() { let f = TaskSetCpuList::new_with_available_parallelism; - assert_eq!(f(8, CpuMode::All, CpuDirection::Desc, 1).as_cpu_list(), "7"); + assert_eq!(f(8, CpuMode::SubsequentSingle, CpuDirection::Desc, 1).as_cpu_list(), "7"); assert_eq!( - f(8, CpuMode::All, CpuDirection::Desc, 2).as_cpu_list(), + f(8, CpuMode::SubsequentSingle, CpuDirection::Desc, 2).as_cpu_list(), "6-7" ); assert_eq!( - f(8, CpuMode::All, CpuDirection::Desc, 4).as_cpu_list(), + f(8, CpuMode::SubsequentSingle, CpuDirection::Desc, 4).as_cpu_list(), "4-7" ); assert_eq!( - f(8, CpuMode::All, CpuDirection::Desc, 8).as_cpu_list(), + f(8, CpuMode::SubsequentSingle, CpuDirection::Desc, 8).as_cpu_list(), "0-7" ); assert_eq!( - f(8, CpuMode::All, CpuDirection::Desc, 9).as_cpu_list(), + f(8, CpuMode::SubsequentSingle, CpuDirection::Desc, 9).as_cpu_list(), "0-7" ); } diff --git a/crates/bencher/src/main.rs b/crates/bencher/src/main.rs index 4c2b305..e144323 100644 --- a/crates/bencher/src/main.rs +++ b/crates/bencher/src/main.rs @@ -13,7 +13,7 @@ use set::run_sets; struct Args { /// How to choose which virtual CPUs to allow trackers and load test /// executables on - #[arg(long, default_value_t = CpuMode::Split)] + #[arg(long, default_value_t = CpuMode::SplitPairs)] cpu_mode: CpuMode, /// Minimum number of tracker cpu cores to run benchmarks for #[arg(long)] From 38a12411e7b92767477fc567872e540fdbf55b37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Frosteg=C3=A5rd?= Date: Thu, 8 Feb 2024 10:06:04 +0100 Subject: [PATCH 2/6] bencher: add new cpu modes, rename previous --- crates/bencher/src/common.rs | 227 ++++++++++++++++++++++------------- 1 file changed, 141 insertions(+), 86 deletions(-) diff --git a/crates/bencher/src/common.rs b/crates/bencher/src/common.rs index dcff665..ec98e7c 100644 --- a/crates/bencher/src/common.rs +++ b/crates/bencher/src/common.rs @@ -57,6 +57,11 @@ impl TaskSetCpuList { ) -> Self { match direction { CpuDirection::Asc => match mode { + CpuMode::Subsequent => { + let range = 0..(available_parallelism.min(requested_cpus)); + + Self(vec![range.try_into().unwrap()]) + } CpuMode::SplitPairs => { let middle = available_parallelism / 2; @@ -68,13 +73,30 @@ impl TaskSetCpuList { range_b.try_into().unwrap(), ]) } - CpuMode::SubsequentSingle => { - let range = 0..(available_parallelism.min(requested_cpus)); + CpuMode::SubsequentPairs => { + let range = 0..(available_parallelism.min(requested_cpus * 2)); 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 { + 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; @@ -88,12 +110,24 @@ impl TaskSetCpuList { range_b.try_into().unwrap(), ]) } - CpuMode::SubsequentSingle => { - let range = - available_parallelism.saturating_sub(requested_cpus)..available_parallelism; + CpuMode::SubsequentPairs => { + let range = available_parallelism.saturating_sub(requested_cpus * 2) + ..available_parallelism; 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> for TaskSetCpuIndicator { #[derive(Debug, Clone, Copy, clap::ValueEnum)] pub enum CpuMode { + /// For 8 vCPU processor, use vCPU groups 0, 1, 2, 3, 4, 5, 6 and 7 + Subsequent, + /// For 8 vCPU processor, use vCPU groups 0 & 4, 1 & 5, 2 & 6 and 3 & 7 SplitPairs, - SubsequentSingle, + /// 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 { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { - Self::SubsequentSingle => f.write_str("subsequent-single"), - Self::SplitPairs => f.write_str("split-paris"), + Self::Subsequent => f.write_str("subsequent"), + 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::*; #[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; - assert_eq!( - f(8, CpuMode::SplitPairs, CpuDirection::Asc, 1).as_cpu_list(), - "0,4" - ); - assert_eq!( - f(8, CpuMode::SplitPairs, CpuDirection::Asc, 2).as_cpu_list(), - "0-1,4-5" - ); - assert_eq!( - f(8, CpuMode::SplitPairs, CpuDirection::Asc, 4).as_cpu_list(), - "0-3,4-7" - ); - assert_eq!( - f(8, CpuMode::SplitPairs, CpuDirection::Asc, 8).as_cpu_list(), - "0-3,4-7" - ); - assert_eq!( - f(8, CpuMode::SplitPairs, CpuDirection::Asc, 9).as_cpu_list(), - "0-3,4-7" - ); + let mode = CpuMode::SplitPairs; + let direction = CpuDirection::Asc; + + assert_eq!(f(8, mode, direction, 1).as_cpu_list(), "0,4"); + assert_eq!(f(8, mode, direction, 2).as_cpu_list(), "0-1,4-5"); + assert_eq!(f(8, mode, direction, 4).as_cpu_list(), "0-3,4-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"); } #[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; - assert_eq!( - f(8, CpuMode::SplitPairs, CpuDirection::Desc, 1).as_cpu_list(), - "3,7" - ); - assert_eq!( - f(8, CpuMode::SplitPairs, CpuDirection::Desc, 2).as_cpu_list(), - "2-3,6-7" - ); - assert_eq!( - f(8, CpuMode::SplitPairs, CpuDirection::Desc, 4).as_cpu_list(), - "0-3,4-7" - ); - assert_eq!( - f(8, CpuMode::SplitPairs, CpuDirection::Desc, 8).as_cpu_list(), - "0-3,4-7" - ); - assert_eq!( - f(8, CpuMode::SplitPairs, CpuDirection::Desc, 9).as_cpu_list(), - "0-3,4-7" - ); + let mode = CpuMode::SplitPairs; + let direction = CpuDirection::Desc; + + assert_eq!(f(8, mode, direction, 1).as_cpu_list(), "3,7"); + assert_eq!(f(8, mode, direction, 2).as_cpu_list(), "2-3,6-7"); + assert_eq!(f(8, mode, direction, 4).as_cpu_list(), "0-3,4-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"); } #[test] - fn test_task_set_cpu_list_all_asc() { + fn test_task_set_cpu_list_subsequent_asc() { let f = TaskSetCpuList::new_with_available_parallelism; - assert_eq!(f(8, CpuMode::SubsequentSingle, CpuDirection::Asc, 1).as_cpu_list(), "0"); - assert_eq!( - f(8, CpuMode::SubsequentSingle, CpuDirection::Asc, 2).as_cpu_list(), - "0-1" - ); - assert_eq!( - f(8, CpuMode::SubsequentSingle, CpuDirection::Asc, 4).as_cpu_list(), - "0-3" - ); - assert_eq!( - f(8, CpuMode::SubsequentSingle, CpuDirection::Asc, 8).as_cpu_list(), - "0-7" - ); - assert_eq!( - f(8, CpuMode::SubsequentSingle, CpuDirection::Asc, 9).as_cpu_list(), - "0-7" - ); + let mode = CpuMode::Subsequent; + 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-1"); + assert_eq!(f(8, mode, direction, 4).as_cpu_list(), "0-3"); + 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_all_desc() { + fn test_task_set_cpu_list_subsequent_desc() { let f = TaskSetCpuList::new_with_available_parallelism; - assert_eq!(f(8, CpuMode::SubsequentSingle, CpuDirection::Desc, 1).as_cpu_list(), "7"); - assert_eq!( - f(8, CpuMode::SubsequentSingle, CpuDirection::Desc, 2).as_cpu_list(), - "6-7" - ); - assert_eq!( - f(8, CpuMode::SubsequentSingle, CpuDirection::Desc, 4).as_cpu_list(), - "4-7" - ); - assert_eq!( - f(8, CpuMode::SubsequentSingle, CpuDirection::Desc, 8).as_cpu_list(), - "0-7" - ); - assert_eq!( - f(8, CpuMode::SubsequentSingle, CpuDirection::Desc, 9).as_cpu_list(), - "0-7" - ); + let mode = CpuMode::Subsequent; + let direction = CpuDirection::Desc; + + 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!(f(8, mode, direction, 4).as_cpu_list(), "4-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_asc() { + let f = TaskSetCpuList::new_with_available_parallelism; + let mode = CpuMode::SubsequentPairs; + let direction = CpuDirection::Asc; + + 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"); } } From 7ceb01f1ae58ae6c0a0b53e8e0dd76dd4c882faa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Frosteg=C3=A5rd?= Date: Thu, 8 Feb 2024 10:07:44 +0100 Subject: [PATCH 3/6] udp: change default ring_size to 128 --- crates/udp/src/config.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/crates/udp/src/config.rs b/crates/udp/src/config.rs index 988f799..d193cc5 100644 --- a/crates/udp/src/config.rs +++ b/crates/udp/src/config.rs @@ -102,8 +102,7 @@ pub struct NetworkConfig { pub poll_timeout_ms: u64, /// Number of ring entries (io_uring backend only) /// - /// Will be rounded to next power of two if not already one. Increasing - /// this value can help throughput up to a certain point. + /// Will be rounded to next power of two if not already one. #[cfg(feature = "io-uring")] pub ring_size: u16, /// 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, poll_timeout_ms: 50, #[cfg(feature = "io-uring")] - ring_size: 1024, + ring_size: 128, resend_buffer_max_len: 0, } } From 37e4514427f0bd687a1f3a2a3411e0be42f93df8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Frosteg=C3=A5rd?= Date: Thu, 8 Feb 2024 10:08:31 +0100 Subject: [PATCH 4/6] udp: change default max_response_peers to 30 --- crates/udp/src/config.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/udp/src/config.rs b/crates/udp/src/config.rs index d193cc5..7c209a6 100644 --- a/crates/udp/src/config.rs +++ b/crates/udp/src/config.rs @@ -152,7 +152,7 @@ impl Default for ProtocolConfig { fn default() -> Self { Self { max_scrape_torrents: 70, - max_response_peers: 50, + max_response_peers: 30, peer_announce_interval: 60 * 15, } } From ee4381035378a06214fc401b098d89f03614f011 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Frosteg=C3=A5rd?= Date: Thu, 8 Feb 2024 10:09:45 +0100 Subject: [PATCH 5/6] udp load test: change default request weights --- crates/udp_load_test/src/config.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/udp_load_test/src/config.rs b/crates/udp_load_test/src/config.rs index 27e7eb2..2316443 100644 --- a/crates/udp_load_test/src/config.rs +++ b/crates/udp_load_test/src/config.rs @@ -124,8 +124,8 @@ impl Default for RequestConfig { number_of_peers: 2_000_000, scrape_max_torrents: 10, announce_peers_wanted: 30, - weight_connect: 1, - weight_announce: 100, + weight_connect: 50, + weight_announce: 50, weight_scrape: 1, peer_seeder_probability: 0.75, } From a90f1ff7ccc783828ab182667ae73c55aca95129 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Frosteg=C3=A5rd?= Date: Thu, 8 Feb 2024 10:15:13 +0100 Subject: [PATCH 6/6] Update TODO --- TODO.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/TODO.md b/TODO.md index 351a248..541d786 100644 --- a/TODO.md +++ b/TODO.md @@ -2,10 +2,10 @@ ## High priority -* aquatic_bench - * Opentracker "slow to get up to speed", is it due to getting faster once - inserts are rarely needed since most ip-port combinations have been sent? - In that case, a shorter duration (e.g., 30 seconds) would be a good idea. +* aquatic_bencher + * bench aquatic_udp with io_uring too + * test with SubsequentOnePerPair + * include chihaya with higher core counts? ## Medium priority