Skip to content

Commit bc622a1

Browse files
pablorfb-metafacebook-github-bot
authored andcommitted
Summary: Measures: - [Throughput] How much data can be processed per sec ? - [Parallelism] How long does it take to process a burst of X 1KB msg/sec ? # Mailbox Send/Receive | Payload Size | Throughput (GiB/s) | Throughput Change % | Time Min (ms) | Time Median (ms) | Time Max (ms) | |---------------|--------------------|---------------------|---------------|------------------|---------------| | 10,000 | 7.7868 | 0.00% | 0.0011907 | 0.0011960 | 0.0012014 | | 100,000 | 7.4149 | -4.77% | 0.012444 | 0.012560 | 0.012677 | | 1,000,000 | 2.3116 | -70.30% | 0.39953 | 0.40289 | 0.40668 | | 10,000,000 | 1.7613 | -77.37% | 5.2436 | 5.2877 | 5.3270 | | 100,000,000 | 1.6510 | -78.78% | 56.264 | 56.411 | 56.573 | | 1,000,000,000 | 1.6439 | -78.88% | 565.78 | 566.54 | 567.21 | # Mailbox Message Rate | Rate | Time Min (ms) | Time Median (ms) | Time Max (ms) | |---------|---------------|------------------|---------------| | 100 mps | 0.23001 | 0.23246 | 0.23559 | | 1000 mps| 2.1806 | 2.1931 | 2.2075 | | 5000 mps| 10.634 | 10.788 | 10.963 | Differential Revision: D80209682
1 parent 7f363d0 commit bc622a1

File tree

1 file changed

+135
-3
lines changed

1 file changed

+135
-3
lines changed

hyperactor/benches/main.rs

Lines changed: 135 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,12 @@ use hyperactor::channel::Rx;
2626
use hyperactor::channel::Tx;
2727
use hyperactor::channel::dial;
2828
use hyperactor::channel::serve;
29+
use hyperactor::mailbox::Mailbox;
30+
use hyperactor::mailbox::PortSender;
31+
use hyperactor::mailbox::monitored_return_handle;
32+
use hyperactor::reference::ActorId;
33+
use hyperactor::reference::ProcId;
34+
use hyperactor::reference::WorldId;
2935
use serde::Deserialize;
3036
use serde::Serialize;
3137
use tokio::runtime;
@@ -56,6 +62,7 @@ impl Message {
5662
}
5763
}
5864

65+
// CHANNEL
5966
// Benchmark message sizes
6067
fn bench_message_sizes(c: &mut Criterion) {
6168
let transports = vec![
@@ -234,11 +241,136 @@ async fn channel_ping_pong(
234241
start.elapsed()
235242
}
236243

244+
// MAILBOX
245+
246+
fn bench_mailbox_message_sizes(c: &mut Criterion) {
247+
let sizes: Vec<usize> = vec![
248+
10_000,
249+
100_000,
250+
1_000_000,
251+
10_000_000,
252+
100_000_000,
253+
1_000_000_000,
254+
];
255+
256+
for size in sizes {
257+
let mut group = c.benchmark_group("mailbox_send_receive".to_string());
258+
group.throughput(Throughput::Bytes(size as u64));
259+
group.sampling_mode(criterion::SamplingMode::Flat);
260+
group.sample_size(10);
261+
group.bench_function(BenchmarkId::from_parameter(size), move |b| {
262+
let mut b = b.to_async(Runtime::new().unwrap());
263+
b.iter_custom(|iters| async move {
264+
let proc_id = ProcId::Ranked(WorldId("world".to_string()), 0);
265+
let actor_id = ActorId(proc_id, "actor".to_string(), 0);
266+
let mbox = Mailbox::new_detached(actor_id);
267+
let (port, mut receiver) = mbox.open_port::<Message>();
268+
let port = port.bind();
269+
270+
let msg = Message::new(0, size);
271+
let start = Instant::now();
272+
for _ in 0..iters {
273+
mbox.serialize_and_send(&port, msg.clone(), monitored_return_handle())
274+
.unwrap();
275+
receiver.recv().await.unwrap();
276+
}
277+
start.elapsed()
278+
});
279+
});
280+
group.finish();
281+
}
282+
}
283+
284+
// Benchmark message rates for mailbox
285+
fn bench_mailbox_message_rates(c: &mut Criterion) {
286+
let mut group = c.benchmark_group("mailbox_message_rates");
287+
let rates = vec![100, 1000, 5000];
288+
let payload_size = 1024; // 1KB payload
289+
290+
for rate in &rates {
291+
let rate = *rate;
292+
group.bench_function(format!("rate_{}mps", rate), move |b| {
293+
let mut b = b.to_async(Runtime::new().unwrap());
294+
b.iter_custom(|iters| async move {
295+
let proc_id = ProcId::Ranked(WorldId("world".to_string()), 0);
296+
let actor_id = ActorId(proc_id, "actor".to_string(), 0);
297+
let mbox = Mailbox::new_detached(actor_id);
298+
let (port, mut receiver) = mbox.open_port::<Message>();
299+
let port = port.bind();
300+
301+
// Spawn a task to receive messages
302+
let total_msgs = iters * rate;
303+
let receiver_task = tokio::spawn(async move {
304+
let mut received_count = 0;
305+
while received_count < total_msgs {
306+
match receiver.recv().await {
307+
Ok(_) => received_count += 1,
308+
Err(e) => {
309+
panic!("Error receiving message: {}", e);
310+
}
311+
}
312+
}
313+
});
314+
315+
let message = Message::new(0, payload_size);
316+
let start = Instant::now();
317+
318+
for _ in 0..iters {
319+
let mut response_handlers: Vec<tokio::task::JoinHandle<()>> =
320+
Vec::with_capacity(rate as usize);
321+
322+
for _ in 0..rate {
323+
let (return_sender, return_receiver) = oneshot::channel();
324+
let msg_clone = message.clone();
325+
let port_clone = port.clone();
326+
let mbox_clone = mbox.clone();
327+
328+
let handle = tokio::spawn(async move {
329+
mbox_clone
330+
.serialize_and_send(
331+
&port_clone,
332+
msg_clone,
333+
monitored_return_handle(),
334+
)
335+
.unwrap();
336+
let _ = return_sender.send(());
337+
338+
select! {
339+
_ = return_receiver => {},
340+
_ = tokio::time::sleep(Duration::from_millis(5000)) => {
341+
panic!("Did not get ack within timeout");
342+
}
343+
}
344+
});
345+
346+
response_handlers.push(handle);
347+
348+
let delay_ms = if rate > 0 { 1000 / rate } else { 0 };
349+
let elapsed = start.elapsed().as_millis();
350+
let effective_delay = (delay_ms as u128).saturating_sub(elapsed);
351+
if effective_delay > 0 {
352+
tokio::time::sleep(Duration::from_millis(effective_delay as u64)).await;
353+
}
354+
}
355+
join_all(response_handlers).await;
356+
}
357+
358+
receiver_task.await.unwrap();
359+
start.elapsed()
360+
});
361+
});
362+
}
363+
364+
group.finish();
365+
}
366+
237367
criterion_group!(
238368
benches,
239-
bench_message_sizes,
240-
bench_message_rates,
241-
bench_channel_ping_pong
369+
// bench_message_sizes,
370+
// bench_message_rates,
371+
bench_mailbox_message_sizes,
372+
bench_mailbox_message_rates,
373+
// bench_channel_ping_pong,
242374
);
243375

244376
criterion_main!(benches);

0 commit comments

Comments
 (0)