From 2c4a6a9384bdda228909a783225f30083cf24711 Mon Sep 17 00:00:00 2001 From: Christophe Geuzaine <cgeuzaine@ulg.ac.be> Date: Fri, 29 Apr 2016 06:57:00 +0000 Subject: [PATCH] previous commits (disabling Nagle's buffering algorithm) seem to fix the performance problem for TCP/IP connections on Linux --- Common/GmshSocket.h | 1 + utils/solvers/c++/GmshSocket.h | 20 ++++++++++++++------ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/Common/GmshSocket.h b/Common/GmshSocket.h index 66ba024387..b2905a2f3f 100644 --- a/Common/GmshSocket.h +++ b/Common/GmshSocket.h @@ -280,6 +280,7 @@ class GmshClient : public GmshSocket { _sock = socket(AF_INET, SOCK_STREAM, 0); if(_sock < 0) return -1; char one = 1; + // disable Nagle's algorithm (very slow for many small messages) setsockopt(_sock, IPPROTO_TCP, TCP_NODELAY, &one, sizeof(one)); // try to connect socket to host:port const char *port = strstr(sockname, ":"); diff --git a/utils/solvers/c++/GmshSocket.h b/utils/solvers/c++/GmshSocket.h index 42664f8526..f2e28096e4 100644 --- a/utils/solvers/c++/GmshSocket.h +++ b/utils/solvers/c++/GmshSocket.h @@ -45,6 +45,7 @@ #include <sys/un.h> #include <sys/time.h> #include <netinet/in.h> +#include <netinet/tcp.h> #include <netdb.h> #if defined(HAVE_NO_SOCKLEN_T) typedef int socklen_t; @@ -276,6 +277,9 @@ class GmshClient : public GmshSocket { // TCP/IP socket _sock = socket(AF_INET, SOCK_STREAM, 0); if(_sock < 0) return -1; + char one = 1; + // disable Nagle's algorithm (very slow for many small messages) + setsockopt(_sock, IPPROTO_TCP, TCP_NODELAY, &one, sizeof(one)); // try to connect socket to host:port const char *port = strstr(sockname, ":"); int portno = atoi(port + 1); @@ -324,13 +328,13 @@ class GmshServer : public GmshSocket{ public: GmshServer() : GmshSocket(), _portno(-1) {} virtual ~GmshServer(){} - virtual int NonBlockingSystemCall(const char *exe, const char *args) = 0; + virtual int NonBlockingSystemCall(const std::string &exe, const std::string &args) = 0; virtual int NonBlockingWait(double waitint, double timeout, int socket=-1) = 0; // start the client by launching "exe args" (args is supposed to contain // '%s' where the socket name should appear) - int Start(const char *exe, const char *args, const char *sockname, double timeout) + int Start(const std::string &exe, const std::string &args, const std::string &sockname, + double timeout) { - if(!sockname) throw "Invalid (null) socket name"; _sockname = sockname; int tmpsock; if(strstr(_sockname.c_str(), "/") || strstr(_sockname.c_str(), "\\") || @@ -366,6 +370,9 @@ class GmshServer : public GmshSocket{ _portno = atoi(port + 1); // create a socket tmpsock = socket(AF_INET, SOCK_STREAM, 0); + char one = 1; + setsockopt(tmpsock, IPPROTO_TCP, TCP_NODELAY, &one, sizeof(one)); + #if !defined(WIN32) || defined(__CYGWIN__) if(tmpsock < 0) #else @@ -393,9 +400,9 @@ class GmshServer : public GmshSocket{ } } - if((exe && strlen(exe)) || (args && strlen(args))){ + if(exe.size() || args.size()){ char s[1024]; - sprintf(s, args, _sockname.c_str()); + sprintf(s, args.c_str(), _sockname.c_str()); NonBlockingSystemCall(exe, s); // starts the solver } else{ @@ -433,9 +440,10 @@ class GmshServer : public GmshSocket{ struct sockaddr_in from_in; socklen_t len = sizeof(from_in); _sock = accept(tmpsock, (struct sockaddr *)&from_in, &len); + char one = 1; + setsockopt(_sock, IPPROTO_TCP, TCP_NODELAY, &one, sizeof(one)); } CloseSocket(tmpsock); - if(_sock < 0) throw "Socket accept failed"; return _sock; -- GitLab