unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Robert Pluim <rpluim@gmail.com>
To: Eric Marsden <eric.marsden@risk-engineering.org>
Cc: emacs-devel@gnu.org
Subject: Re: PATCH: add support for TCP_NODELAY on network streams
Date: Wed, 11 Dec 2024 13:45:34 +0100	[thread overview]
Message-ID: <87ed2e5qxd.fsf@gmail.com> (raw)
In-Reply-To: <7292e8f5-2be9-4c76-b473-882ff437ad93@risk-engineering.org> (Eric Marsden's message of "Wed, 11 Dec 2024 11:51:27 +0100")

>>>>> On Wed, 11 Dec 2024 11:51:27 +0100, Eric Marsden <eric.marsden@risk-engineering.org> said:

    Eric> Hi,
    Eric> The attached patch adds support for the socket option TCP_NODELAY,
    Eric> to disable Nagle's algorithm. This means that network segments are
    Eric> sent as soon as possible, even when they contain little data. This
    Eric> reduces network latency on the network connection, but can lead to
    Eric> many small packets being sent.

    Eric> I have only tested on Linux/AMD64, but support for this socket option
    Eric> is very widespread.

If setting it fails you can get an error, so thatʼs not a big deal. I
should be able to verify it on macOS later this week.

    Eric> My motivation for adding this support is that Emacs is very slow
    Eric> when connecting to the PostgreSQL database over the network, using
    Eric> my pg-el library, and is unable to saturate CPU when sending a
    Eric> stream of messages. It is much faster when using a local Unix
    Eric> connection and saturates CPU.

    Eric> With this patch, a test case that takes 911 seconds goes down to
    Eric> 76 seconds (x 12 speedup).

    Eric> Eric

ENOCOMMITMESSAGE

    Eric> diff --git a/doc/lispref/processes.texi b/doc/lispref/processes.texi
    Eric> index 79ef959ae65..93ac5a6aa7d 100644
    Eric> --- a/doc/lispref/processes.texi
    Eric> +++ b/doc/lispref/processes.texi
    Eric> @@ -3090,6 +3090,13 @@ Network Options
    Eric>  may be a period of time after the last use of that port (by any
    Eric>  process on the host) where it is not possible to make a new server on
    Eric>  that port.
    Eric> +
    Eric> +@item :nodelay @var{nodelay-flag}
    Eric> +If @var{nodelay-flag} is non-@code{nil}, the @code{TCP_NODELAY} option
    Eric> +is enabled on the socket. This disables the Nagle algorithm, meaning
    Eric> +that network segments are sent as soon as possible, even when they
    Eric> +contain little data. This reduces network latency on the network
    Eric> +connection, but can lead to many small packets being sent.
    Eric>  @end table
 
    Eric>  @defun set-network-process-option process option value &optional no-error
    Eric> diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el
    Eric> index f058fc48cc7..07eb4690fce 100644
    Eric> --- a/lisp/emacs-lisp/bytecomp.el
    Eric> +++ b/lisp/emacs-lisp/bytecomp.el
    Eric> @@ -6049,8 +6049,8 @@ bytecomp--check-keyword-args
    Eric>              :buffer :host :service :type :family :local :remote :coding
    Eric>              :nowait :noquery :stop :filter :filter-multibyte :sentinel
    Eric>              :log :plist :tls-parameters :server :broadcast :dontroute
    Eric> -            :keepalive :linger :oobinline :priority :reuseaddr :bindtodevice
    Eric> -            :use-external-socket)
    Eric> +            :keepalive :linger :oobinline :priority :reuseaddr :nodelay
    Eric> +            :bindtodevice :use-external-socket)
    Eric>            '(:name :service))))

I think you need to update the docstring of `make-network-process' as
well, as itʼs possible to set options on process creation.

    Eric>  (provide 'byte-compile)
    Eric> diff --git a/src/process.c b/src/process.c
    Eric> index b71ba3daf2d..0b994d6c5b7 100644
    Eric> --- a/src/process.c
    Eric> +++ b/src/process.c
    Eric> @@ -38,6 +38,7 @@ Copyright (C) 1985-1988, 1993-1996, 1998-1999, 2001-2024 Free Software
    Eric>  #include <sys/socket.h>
    Eric>  #include <netdb.h>
    Eric>  #include <netinet/in.h>
    Eric> +#include <netinet/tcp.h>
    Eric>  #include <arpa/inet.h>
 
    Eric>  #else
    Eric> @@ -2860,6 +2861,9 @@ DEFUN ("set-process-datagram-address", Fset_process_datagram_address, Sset_proce
    Eric>  #endif
    Eric>  #ifdef SO_REUSEADDR
    Eric>      { ":reuseaddr", SOL_SOCKET, SO_REUSEADDR, SOPT_BOOL, OPIX_REUSEADDR },
    Eric> +#endif
    Eric> +#ifdef TCP_NODELAY
    Eric> +    { ":nodelay", IPPROTO_TCP, TCP_NODELAY, SOPT_BOOL, OPIX_MISC },
    Eric>  #endif
    Eric>      { 0, 0, 0, SOPT_UNKNOWN, OPIX_NONE }
    Eric>    };

Iʼm not sure why we have a separate field for the option type, when the
only socket option that gets special treatment is :reuseaddr. Oh well,
hysterical raisins :-)

Robert
-- 



  reply	other threads:[~2024-12-11 12:45 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-12-11 10:51 PATCH: add support for TCP_NODELAY on network streams Eric Marsden
2024-12-11 12:45 ` Robert Pluim [this message]
2024-12-11 15:37 ` Eli Zaretskii

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87ed2e5qxd.fsf@gmail.com \
    --to=rpluim@gmail.com \
    --cc=emacs-devel@gnu.org \
    --cc=eric.marsden@risk-engineering.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).