Skip to content

Commit

Permalink
Set TCP_NODELAY on the TcpStream to disable Nagle's algorithm.
Browse files Browse the repository at this point in the history
Due to the way the `async-h1` crate writes HTTP responses to the `TcpStream` the head
and body end up in separate write calls to the underlying socket.  If we're responding
to more than one request received from the same `TcpStream` it means that we did two
sends and then tried to read.  That read can take up to 500 milliseconds to complete due
to bad interactions between Nagle's algorithm and delayed ACK.  (In practice this is 40
ms on Linux.)

Disabling Nagle's algorithm works around this until `async-h1` is fixed.

http-rs/async-h1#199

Signed-off-by: Johannes Löthberg <[email protected]>
  • Loading branch information
kyrias committed Sep 9, 2022
1 parent e79e4f6 commit 2c360c2
Showing 1 changed file with 16 additions and 0 deletions.
16 changes: 16 additions & 0 deletions src/listener/tcp_listener.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,22 @@ impl<State> TcpListener<State> {

fn handle_tcp<State: Clone + Send + Sync + 'static>(app: Server<State>, stream: TcpStream) {
task::spawn(async move {
// Set `TCP_NODELAY` on the `TcpStream` to disable Nagle's algorithm.
//
// Due to the way the `async-h1` crate writes HTTP responses to the `TcpStream` the head
// and body end up in separate write calls to the underlying socket. If we're responding
// to more than one request received from the same `TcpStream` it means that we did two
// sends and then tried to read. That read can take up to 500 milliseconds to complete due
// to bad interactions between Nagle's algorithm and delayed ACK. (In practice this is 40
// ms on Linux.)
//
// Disabling Nagle's algorithm works around this until `async-h1` is fixed.
//
// https://github.com/http-rs/async-h1/issues/199
if let Err(err) = stream.set_nodelay(true) {
error!("Failed to set TCP_NODELAY: {}", err);
}

let local_addr = stream.local_addr().ok();
let peer_addr = stream.peer_addr().ok();

Expand Down

0 comments on commit 2c360c2

Please sign in to comment.