diff options
author | Martin Sustrik <sustrik@250bpm.com> | 2011-07-28 15:13:04 +0200 |
---|---|---|
committer | Martin Sustrik <sustrik@250bpm.com> | 2011-07-28 15:13:04 +0200 |
commit | b45fec337aff8e04bebaf6e898a499f05ee6b0d6 (patch) | |
tree | c0e86a97203c533e9808a5c81ace8e1ee4717bf1 | |
parent | 46b053b8d67ba4826302d53268edccf919e6d785 (diff) |
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: Martin Sustrik <sustrik@250bpm.com>
-rw-r--r-- | src/ip.cpp | 24 | ||||
-rw-r--r-- | src/ip.hpp | 7 | ||||
-rw-r--r-- | src/tcp_connecter.cpp | 22 | ||||
-rw-r--r-- | src/tcp_listener.cpp | 21 | ||||
-rw-r--r-- | src/vtcp_connecter.cpp | 4 | ||||
-rw-r--r-- | src/vtcp_listener.cpp | 3 |
6 files changed, 40 insertions, 41 deletions
@@ -344,3 +344,27 @@ int zmq::resolve_local_path (sockaddr_storage *addr_, socklen_t *addr_len_, #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 @@ #define __ZMQ_IP_HPP_INCLUDED__ #include "platform.hpp" +#include "fd.hpp" #ifdef ZMQ_HAVE_WINDOWS #include "windows.hpp" @@ -30,6 +31,7 @@ #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> +#include <netinet/tcp.h> #include <netdb.h> #endif @@ -60,9 +62,12 @@ namespace zmq int resolve_ip_hostname (sockaddr_storage *addr_, socklen_t *addr_len_, const char *hostname_); - // 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_, const char* pathname_); + + // Tunes the supplied TCP socket for the best latency. + void tune_tcp_socket (fd_t s_); } #endif diff --git a/src/tcp_connecter.cpp b/src/tcp_connecter.cpp index 76ec0bc..27e56a1 100644 --- a/src/tcp_connecter.cpp +++ b/src/tcp_connecter.cpp @@ -26,8 +26,8 @@ #include "io_thread.hpp" #include "platform.hpp" #include "random.hpp" -#include "ip.hpp" #include "err.hpp" +#include "ip.hpp" #if defined ZMQ_HAVE_WINDOWS #include "windows.hpp" @@ -106,25 +106,7 @@ void zmq::tcp_connecter_t::out_event () return; } - // 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 (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 + tune_tcp_socket (fd); // Create the engine object for this connection. tcp_engine_t *engine = new (std::nothrow) tcp_engine_t (fd, options); diff --git a/src/tcp_listener.cpp b/src/tcp_listener.cpp index 07e2803..1bb6deb 100644 --- a/src/tcp_listener.cpp +++ b/src/tcp_listener.cpp @@ -29,6 +29,7 @@ #include "session.hpp" #include "config.hpp" #include "err.hpp" +#include "ip.hpp" #ifdef ZMQ_HAVE_WINDOWS #include "windows.hpp" @@ -86,25 +87,7 @@ void zmq::tcp_listener_t::in_event () if (fd == retired_fd) return; - // 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 (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 + tune_tcp_socket (fd); // Create the engine object for this connection. tcp_engine_t *engine = new (std::nothrow) tcp_engine_t (fd, options); diff --git a/src/vtcp_connecter.cpp b/src/vtcp_connecter.cpp index 3fedd6d..842aa3a 100644 --- a/src/vtcp_connecter.cpp +++ b/src/vtcp_connecter.cpp @@ -30,8 +30,8 @@ #include "platform.hpp" #include "random.hpp" #include "likely.hpp" -#include "ip.hpp" #include "err.hpp" +#include "ip.hpp" #if defined ZMQ_HAVE_WINDOWS #include "windows.hpp" @@ -220,6 +220,8 @@ zmq::fd_t zmq::vtcp_connecter_t::connect () return retired_fd; } + tune_tcp_socket (s); + fd_t result = s; s = retired_fd; return result; diff --git a/src/vtcp_listener.cpp b/src/vtcp_listener.cpp index 60fad8c..8fbefb2 100644 --- a/src/vtcp_listener.cpp +++ b/src/vtcp_listener.cpp @@ -30,6 +30,7 @@ #include "session.hpp" #include "stdint.hpp" #include "err.hpp" +#include "ip.hpp" zmq::vtcp_listener_t::vtcp_listener_t (io_thread_t *io_thread_, socket_base_t *socket_, options_t &options_) : @@ -95,6 +96,8 @@ void zmq::vtcp_listener_t::in_event () if (fd == retired_fd) return; + tune_tcp_socket (fd); + // Create the engine object for this connection. tcp_engine_t *engine = new (std::nothrow) tcp_engine_t (fd, options); alloc_assert (engine); |