Skip to content

Commit 3711ad5

Browse files
pablorfb-metafacebook-github-bot
authored andcommitted
Mailbox
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 Performance Table | 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 Performance Table | 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 c803f47 commit 3711ad5

File tree

1 file changed

+134
-1
lines changed

1 file changed

+134
-1
lines changed

hyperactor/benches/main.rs

Lines changed: 134 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,20 @@ use criterion::criterion_group;
1919
use criterion::criterion_main;
2020
use futures::future::join_all;
2121
use hyperactor::Named;
22+
use hyperactor::accum;
2223
use hyperactor::channel;
2324
use hyperactor::channel::ChannelAddr;
2425
use hyperactor::channel::ChannelTransport;
2526
use hyperactor::channel::Rx;
2627
use hyperactor::channel::Tx;
2728
use hyperactor::channel::dial;
2829
use hyperactor::channel::serve;
30+
use hyperactor::mailbox::Mailbox;
31+
use hyperactor::mailbox::PortSender;
32+
use hyperactor::mailbox::monitored_return_handle;
33+
use hyperactor::reference::ActorId;
34+
use hyperactor::reference::ProcId;
35+
use hyperactor::reference::WorldId;
2936
use serde::Deserialize;
3037
use serde::Serialize;
3138
use tokio::runtime;
@@ -56,6 +63,7 @@ impl Message {
5663
}
5764
}
5865

66+
// CHANNEL
5967
// Benchmark message sizes
6068
fn bench_message_sizes(c: &mut Criterion) {
6169
let transports = vec![
@@ -183,7 +191,6 @@ fn bench_message_rates(c: &mut Criterion) {
183191
fn bench_channel_ping_pong(c: &mut Criterion) {
184192
let transport = ChannelTransport::Unix;
185193

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

244377
criterion_main!(benches);

0 commit comments

Comments
 (0)