From 60647a2f8c704a18701819ec2cc609847b32121b Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Wed, 9 Dec 2015 00:58:06 -0800 Subject: [PATCH] Turn off Nagle algorithm to decrease latency. This is safe because of the way writes are performed: for each transmission, all outgoing messages are concatenated in memory and only a single write() syscall is made. --- src/NetworkConnection.cpp | 3 +++ src/tcpsockets/NetworkStream.h | 1 + src/tcpsockets/TCPStream.cpp | 6 ++++++ src/tcpsockets/TCPStream.h | 1 + 4 files changed, 11 insertions(+) diff --git a/src/NetworkConnection.cpp b/src/NetworkConnection.cpp index 743f399b17..b2b741eb6d 100644 --- a/src/NetworkConnection.cpp +++ b/src/NetworkConnection.cpp @@ -32,6 +32,9 @@ NetworkConnection::NetworkConnection(std::unique_ptr stream, m_proto_rev = 0x0300; m_state = static_cast(kCreated); m_last_update = 0; + + // turn off Nagle algorithm; we bundle packets for transmission + m_stream->setNoDelay(); } NetworkConnection::~NetworkConnection() { Stop(); } diff --git a/src/tcpsockets/NetworkStream.h b/src/tcpsockets/NetworkStream.h index 3803796586..63aedb4f2f 100644 --- a/src/tcpsockets/NetworkStream.h +++ b/src/tcpsockets/NetworkStream.h @@ -30,6 +30,7 @@ class NetworkStream { virtual llvm::StringRef getPeerIP() const = 0; virtual int getPeerPort() const = 0; + virtual void setNoDelay() = 0; NetworkStream(const NetworkStream&) = delete; NetworkStream& operator=(const NetworkStream&) = delete; diff --git a/src/tcpsockets/TCPStream.cpp b/src/tcpsockets/TCPStream.cpp index 2fcee36da3..3149be6f55 100644 --- a/src/tcpsockets/TCPStream.cpp +++ b/src/tcpsockets/TCPStream.cpp @@ -27,6 +27,7 @@ #include #else #include +#include #include #endif @@ -136,6 +137,11 @@ llvm::StringRef TCPStream::getPeerIP() const { return m_peerIP; } int TCPStream::getPeerPort() const { return m_peerPort; } +void TCPStream::setNoDelay() { + int optval = 1; + setsockopt(m_sd, IPPROTO_TCP, TCP_NODELAY, (char*)&optval, sizeof optval); +} + bool TCPStream::WaitForReadEvent(int timeout) { fd_set sdset; struct timeval tv; diff --git a/src/tcpsockets/TCPStream.h b/src/tcpsockets/TCPStream.h index a64df3ef6a..21ef6fdbed 100644 --- a/src/tcpsockets/TCPStream.h +++ b/src/tcpsockets/TCPStream.h @@ -53,6 +53,7 @@ class TCPStream : public NetworkStream { llvm::StringRef getPeerIP() const override; int getPeerPort() const override; + void setNoDelay() override; TCPStream(const TCPStream& stream) = delete; TCPStream& operator=(const TCPStream&) = delete;