Re: [systemd-devel] [PATCH 3/3] socket: Add support for TCP defer accept

2014-08-14 Thread Zbigniew Jędrzejewski-Szmek
On Tue, Jul 29, 2014 at 11:10:09PM +0530, Susant Sahani wrote:
 TCP_DEFER_ACCEPT Allow a listener to be awakened only when data
 arrives on the socket. If TCP_DEFER_ACCEPT set on a server-side
 listening socket, the TCP/IP stack will not to wait for the final
 ACK packet and not to initiate the process until the first packet
 of real data has arrived. After sending the SYN/ACK, the server will
 then wait for a data packet from a client. Now, only three packets
 will be sent over the network, and the connection establishment delay
 will be significantly reduced.
 ---
  man/systemd.socket.xml | 16 
  src/core/dbus-socket.c |  1 +
  src/core/socket.c  | 11 +++
  src/core/socket.h  |  1 +
  4 files changed, 29 insertions(+)
 
 diff --git a/man/systemd.socket.xml b/man/systemd.socket.xml
 index e6bbb2e..9ce94aa 100644
 --- a/man/systemd.socket.xml
 +++ b/man/systemd.socket.xml
 @@ -539,6 +539,22 @@
  /varlistentry
  
  varlistentry
 +termvarnameDeferAccept=/varname/term
 +listitemparaTakes time (in seconds) as 
 argument
 +Allow a listener to be awakened only when 
 data arrives on the socket.
 +If TCP_DEFER_ACCEPT set on a server-side 
 listening socket,
 +the TCP/IP stack will not to wait for the 
 final ACK packet and not to
 +initiate the process until the first packet 
 of real data has arrived.
 +After sending the SYN/ACK, the server will 
 then wait for a data packet
 +from a client. Now, only three packets will 
 be sent over the network,
 +and the connection establishment delay will 
 be significantly reduced.
 +This controls the TCP_DEFER_ACCEPT socket 
 option (see
 +
 citerefentryrefentrytitlesocket/refentrytitlemanvolnum7/manvolnum/citerefentry
 +Defaults to
 +optiondisabled/option./para/listitem
I think this needs to be cleaned up to be gramatically correct. Right now
some guesswork is required to gather the true meaning.

Maybe something like this:

---

paraTakes time (in seconds) as argument. If set, the listening process
will be awakened only when data arrives on the socket, and not immediately
when connection is established. When this option is set, the
constantTCP_DEFER_ACCEPT/constant socket option will be used
(see
citerefentryrefentrytitletcp/refentrytitlemanvolnum7/manvolnum/citerefentry),
and the kernel will ignore initial ACK packets without any data.
The argument specifies the approximate amount
of time the kernel should wait for incoming data before falling
back to the normal behaviour of honouring empty ACK packets.
This option beneficial for protocols where the client sends the data
first (e.g. HTTP, in contrast to SMTP), because the server
process will not be woken up unnecessarily before it can take any action.
/para

paraIf the client also uses the constantTCP_DEFER_ACCEPT/constant
option, the latency of the initial connection may be
reduced, because the kernel will send data in the
final packet establishing the connection (the third packet in the
three-way handshake)./para

paraDisabled by default./para

---

(Note that TCP_DEFER_ACCEPT is described in tcp(7), not socket(7), and this
description is so terse that it is nearly useless anyway.)

Zbyszek

 +/varlistentry
 +
 +varlistentry
  termvarnamePriority=/varname/term
  listitemparaTakes an integer
  argument controlling the priority for
 diff --git a/src/core/dbus-socket.c b/src/core/dbus-socket.c
 index f9ef7ef..1142ca5 100644
 --- a/src/core/dbus-socket.c
 +++ b/src/core/dbus-socket.c
 @@ -101,6 +101,7 @@ const sd_bus_vtable bus_socket_vtable[] = {
  SD_BUS_PROPERTY(KeepAliveInterval, t, bus_property_get_usec, 
 offsetof(Socket, keep_alive_interval), SD_BUS_VTABLE_PROPERTY_CONST),
  SD_BUS_PROPERTY(KeepAliveProbes, i, bus_property_get_int, 
 offsetof(Socket, keep_alive_cnt), SD_BUS_VTABLE_PROPERTY_CONST),
  SD_BUS_PROPERTY(FastOpen , b, bus_property_get_bool, 
 offsetof(Socket, fast_open), SD_BUS_VTABLE_PROPERTY_CONST),
 +SD_BUS_PROPERTY(DeferAccept , t, bus_property_get_usec, 
 offsetof(Socket, defer_accept), SD_BUS_VTABLE_PROPERTY_CONST),
  SD_BUS_PROPERTY(Priority, i, bus_property_get_int, 
 offsetof(Socket, priority), SD_BUS_VTABLE_PROPERTY_CONST),
  SD_BUS_PROPERTY(ReceiveBuffer, t, bus_property_get_size, 
 offsetof(Socket, receive_buffer), SD_BUS_VTABLE_PROPERTY_CONST),
  SD_BUS_PROPERTY(SendBuffer, t, bus_property_get_size, 
 

Re: [systemd-devel] [PATCH 3/3] socket: Add support for TCP defer accept

2014-08-13 Thread Lennart Poettering
On Tue, 29.07.14 23:10, Susant Sahani (sus...@redhat.com) wrote:

 +if(s-defer_accept)
 +fprintf(f,
 +%sDeferAccept: %lo\n,
 +prefix, s-defer_accept / USEC_PER_SEC);
 +

As in the other patch, please use format_timespan() for this!

Otherwise looks good, but please also rebase after updating the other
two patches!

Thanks!

Lennart

-- 
Lennart Poettering, Red Hat
___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel


[systemd-devel] [PATCH 3/3] socket: Add support for TCP defer accept

2014-07-29 Thread Susant Sahani
TCP_DEFER_ACCEPT Allow a listener to be awakened only when data
arrives on the socket. If TCP_DEFER_ACCEPT set on a server-side
listening socket, the TCP/IP stack will not to wait for the final
ACK packet and not to initiate the process until the first packet
of real data has arrived. After sending the SYN/ACK, the server will
then wait for a data packet from a client. Now, only three packets
will be sent over the network, and the connection establishment delay
will be significantly reduced.
---
 man/systemd.socket.xml | 16 
 src/core/dbus-socket.c |  1 +
 src/core/socket.c  | 11 +++
 src/core/socket.h  |  1 +
 4 files changed, 29 insertions(+)

diff --git a/man/systemd.socket.xml b/man/systemd.socket.xml
index e6bbb2e..9ce94aa 100644
--- a/man/systemd.socket.xml
+++ b/man/systemd.socket.xml
@@ -539,6 +539,22 @@
 /varlistentry
 
 varlistentry
+termvarnameDeferAccept=/varname/term
+listitemparaTakes time (in seconds) as 
argument
+Allow a listener to be awakened only when data 
arrives on the socket.
+If TCP_DEFER_ACCEPT set on a server-side 
listening socket,
+the TCP/IP stack will not to wait for the 
final ACK packet and not to
+initiate the process until the first packet of 
real data has arrived.
+After sending the SYN/ACK, the server will 
then wait for a data packet
+from a client. Now, only three packets will be 
sent over the network,
+and the connection establishment delay will be 
significantly reduced.
+This controls the TCP_DEFER_ACCEPT socket 
option (see
+
citerefentryrefentrytitlesocket/refentrytitlemanvolnum7/manvolnum/citerefentry
+Defaults to
+optiondisabled/option./para/listitem
+/varlistentry
+
+varlistentry
 termvarnamePriority=/varname/term
 listitemparaTakes an integer
 argument controlling the priority for
diff --git a/src/core/dbus-socket.c b/src/core/dbus-socket.c
index f9ef7ef..1142ca5 100644
--- a/src/core/dbus-socket.c
+++ b/src/core/dbus-socket.c
@@ -101,6 +101,7 @@ const sd_bus_vtable bus_socket_vtable[] = {
 SD_BUS_PROPERTY(KeepAliveInterval, t, bus_property_get_usec, 
offsetof(Socket, keep_alive_interval), SD_BUS_VTABLE_PROPERTY_CONST),
 SD_BUS_PROPERTY(KeepAliveProbes, i, bus_property_get_int, 
offsetof(Socket, keep_alive_cnt), SD_BUS_VTABLE_PROPERTY_CONST),
 SD_BUS_PROPERTY(FastOpen , b, bus_property_get_bool, 
offsetof(Socket, fast_open), SD_BUS_VTABLE_PROPERTY_CONST),
+SD_BUS_PROPERTY(DeferAccept , t, bus_property_get_usec, 
offsetof(Socket, defer_accept), SD_BUS_VTABLE_PROPERTY_CONST),
 SD_BUS_PROPERTY(Priority, i, bus_property_get_int, 
offsetof(Socket, priority), SD_BUS_VTABLE_PROPERTY_CONST),
 SD_BUS_PROPERTY(ReceiveBuffer, t, bus_property_get_size, 
offsetof(Socket, receive_buffer), SD_BUS_VTABLE_PROPERTY_CONST),
 SD_BUS_PROPERTY(SendBuffer, t, bus_property_get_size, 
offsetof(Socket, send_buffer), SD_BUS_VTABLE_PROPERTY_CONST),
diff --git a/src/core/socket.c b/src/core/socket.c
index b798d4e..32cadf9 100644
--- a/src/core/socket.c
+++ b/src/core/socket.c
@@ -610,6 +610,11 @@ static void socket_dump(Unit *u, FILE *f, const char 
*prefix) {
 %sKeepAliveProbes: %u\n,
 prefix, s-keep_alive_cnt);
 
+if(s-defer_accept)
+fprintf(f,
+%sDeferAccept: %lo\n,
+prefix, s-defer_accept / USEC_PER_SEC);
+
 LIST_FOREACH(port, p, s-ports) {
 
 if (p-type == SOCKET_SOCKET) {
@@ -831,6 +836,12 @@ static void socket_apply_socket_options(Socket *s, int fd) 
{
 log_warning_unit(UNIT(s)-id, TCP_FASTOPEN failed: 
%m);
 }
 
+if (s-defer_accept) {
+int value = s-defer_accept / USEC_PER_SEC;
+if (setsockopt(fd, SOL_TCP, TCP_DEFER_ACCEPT, value, 
sizeof(value))  0)
+log_warning_unit(UNIT(s)-id, TCP_DEFER_ACCEPT 
failed: %m);
+}
+
 if (s-broadcast) {
 int one = 1;
 if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST, one, 
sizeof(one))  0)
diff --git a/src/core/socket.h b/src/core/socket.h
index 9cb82fa..7452d27 100644
--- a/src/core/socket.h
+++ b/src/core/socket.h
@@ -104,6 +104,7 @@ struct Socket {
 usec_t timeout_usec;
 usec_t keep_alive_time;
 usec_t keep_alive_interval;
+usec_t defer_accept;