Commit b45fec33 authored by Martin Sustrik's avatar Martin Sustrik

Tuning of TCP sockets is done at a single place

Instead of being spread throughout the codebase, the tuning
is done in tune_tcp_socket() function.
Signed-off-by: 's avatarMartin Sustrik <sustrik@250bpm.com>
parent 46b053b8
...@@ -344,3 +344,27 @@ int zmq::resolve_local_path (sockaddr_storage *addr_, socklen_t *addr_len_, ...@@ -344,3 +344,27 @@ int zmq::resolve_local_path (sockaddr_storage *addr_, socklen_t *addr_len_,
#endif #endif
} }
void zmq::tune_tcp_socket (fd_t s_)
{
// Disable Nagle's algorithm. We are doing data batching on 0MQ level,
// so using Nagle wouldn't improve throughput in anyway, but it would
// hurt latency.
int nodelay = 1;
int rc = setsockopt (s_, IPPROTO_TCP, TCP_NODELAY, (char*) &nodelay,
sizeof (int));
#ifdef ZMQ_HAVE_WINDOWS
wsa_assert (rc != SOCKET_ERROR);
#else
errno_assert (rc == 0);
#endif
#ifdef ZMQ_HAVE_OPENVMS
// Disable delayed acknowledgements as they hurt latency is serious manner.
int nodelack = 1;
rc = setsockopt (s_, IPPROTO_TCP, TCP_NODELACK, (char*) &nodelack,
sizeof (int));
errno_assert (rc != SOCKET_ERROR);
#endif
}
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#define __ZMQ_IP_HPP_INCLUDED__ #define __ZMQ_IP_HPP_INCLUDED__
#include "platform.hpp" #include "platform.hpp"
#include "fd.hpp"
#ifdef ZMQ_HAVE_WINDOWS #ifdef ZMQ_HAVE_WINDOWS
#include "windows.hpp" #include "windows.hpp"
...@@ -30,6 +31,7 @@ ...@@ -30,6 +31,7 @@
#include <sys/socket.h> #include <sys/socket.h>
#include <arpa/inet.h> #include <arpa/inet.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <netinet/tcp.h>
#include <netdb.h> #include <netdb.h>
#endif #endif
...@@ -63,6 +65,9 @@ namespace zmq ...@@ -63,6 +65,9 @@ namespace zmq
// This function sets up address for UNIX domain transport. // This function sets up address for UNIX domain transport.
int resolve_local_path (sockaddr_storage *addr_, socklen_t *addr_len_, int resolve_local_path (sockaddr_storage *addr_, socklen_t *addr_len_,
const char* pathname_); const char* pathname_);
// Tunes the supplied TCP socket for the best latency.
void tune_tcp_socket (fd_t s_);
} }
#endif #endif
...@@ -26,8 +26,8 @@ ...@@ -26,8 +26,8 @@
#include "io_thread.hpp" #include "io_thread.hpp"
#include "platform.hpp" #include "platform.hpp"
#include "random.hpp" #include "random.hpp"
#include "ip.hpp"
#include "err.hpp" #include "err.hpp"
#include "ip.hpp"
#if defined ZMQ_HAVE_WINDOWS #if defined ZMQ_HAVE_WINDOWS
#include "windows.hpp" #include "windows.hpp"
...@@ -106,25 +106,7 @@ void zmq::tcp_connecter_t::out_event () ...@@ -106,25 +106,7 @@ void zmq::tcp_connecter_t::out_event ()
return; return;
} }
// Disable Nagle's algorithm. We are doing data batching on 0MQ level, tune_tcp_socket (fd);
// so using Nagle wouldn't improve throughput in anyway, but it would
// hurt latency.
int nodelay = 1;
int rc = setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, (char*) &nodelay,
sizeof (int));
#ifdef ZMQ_HAVE_WINDOWS
wsa_assert (rc != SOCKET_ERROR);
#else
errno_assert (rc == 0);
#endif
#ifdef ZMQ_HAVE_OPENVMS
// Disable delayed acknowledgements as they hurt latency is serious manner.
int nodelack = 1;
rc = setsockopt (fd, IPPROTO_TCP, TCP_NODELACK, (char*) &nodelack,
sizeof (int));
errno_assert (rc != SOCKET_ERROR);
#endif
// Create the engine object for this connection. // Create the engine object for this connection.
tcp_engine_t *engine = new (std::nothrow) tcp_engine_t (fd, options); tcp_engine_t *engine = new (std::nothrow) tcp_engine_t (fd, options);
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include "session.hpp" #include "session.hpp"
#include "config.hpp" #include "config.hpp"
#include "err.hpp" #include "err.hpp"
#include "ip.hpp"
#ifdef ZMQ_HAVE_WINDOWS #ifdef ZMQ_HAVE_WINDOWS
#include "windows.hpp" #include "windows.hpp"
...@@ -86,25 +87,7 @@ void zmq::tcp_listener_t::in_event () ...@@ -86,25 +87,7 @@ void zmq::tcp_listener_t::in_event ()
if (fd == retired_fd) if (fd == retired_fd)
return; return;
// Disable Nagle's algorithm. We are doing data batching on 0MQ level, tune_tcp_socket (fd);
// so using Nagle wouldn't improve throughput in anyway, but it would
// hurt latency.
int nodelay = 1;
int rc = setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, (char*) &nodelay,
sizeof (int));
#ifdef ZMQ_HAVE_WINDOWS
wsa_assert (rc != SOCKET_ERROR);
#else
errno_assert (rc == 0);
#endif
#ifdef ZMQ_HAVE_OPENVMS
// Disable delayed acknowledgements as they hurt latency is serious manner.
int nodelack = 1;
rc = setsockopt (fd, IPPROTO_TCP, TCP_NODELACK, (char*) &nodelack,
sizeof (int));
errno_assert (rc != SOCKET_ERROR);
#endif
// Create the engine object for this connection. // Create the engine object for this connection.
tcp_engine_t *engine = new (std::nothrow) tcp_engine_t (fd, options); tcp_engine_t *engine = new (std::nothrow) tcp_engine_t (fd, options);
......
...@@ -30,8 +30,8 @@ ...@@ -30,8 +30,8 @@
#include "platform.hpp" #include "platform.hpp"
#include "random.hpp" #include "random.hpp"
#include "likely.hpp" #include "likely.hpp"
#include "ip.hpp"
#include "err.hpp" #include "err.hpp"
#include "ip.hpp"
#if defined ZMQ_HAVE_WINDOWS #if defined ZMQ_HAVE_WINDOWS
#include "windows.hpp" #include "windows.hpp"
...@@ -220,6 +220,8 @@ zmq::fd_t zmq::vtcp_connecter_t::connect () ...@@ -220,6 +220,8 @@ zmq::fd_t zmq::vtcp_connecter_t::connect ()
return retired_fd; return retired_fd;
} }
tune_tcp_socket (s);
fd_t result = s; fd_t result = s;
s = retired_fd; s = retired_fd;
return result; return result;
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include "session.hpp" #include "session.hpp"
#include "stdint.hpp" #include "stdint.hpp"
#include "err.hpp" #include "err.hpp"
#include "ip.hpp"
zmq::vtcp_listener_t::vtcp_listener_t (io_thread_t *io_thread_, zmq::vtcp_listener_t::vtcp_listener_t (io_thread_t *io_thread_,
socket_base_t *socket_, options_t &options_) : socket_base_t *socket_, options_t &options_) :
...@@ -95,6 +96,8 @@ void zmq::vtcp_listener_t::in_event () ...@@ -95,6 +96,8 @@ void zmq::vtcp_listener_t::in_event ()
if (fd == retired_fd) if (fd == retired_fd)
return; return;
tune_tcp_socket (fd);
// Create the engine object for this connection. // Create the engine object for this connection.
tcp_engine_t *engine = new (std::nothrow) tcp_engine_t (fd, options); tcp_engine_t *engine = new (std::nothrow) tcp_engine_t (fd, options);
alloc_assert (engine); alloc_assert (engine);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment