Skip to content


Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

socket_helper: set SO_KEEPALIVE on TCP sockets

Even LANs can break or be unreliable sometimes and socket
disconnect messages get lost, which means we fall back to
the global (kill -9) timeout in Unicorn.

While the default global timeout is much shorter (60s) than
typical TCP timeouts, some HTTP application dispatches take much
I/O or computational time (streaming many gigabytes), so the
global timeout becomes ineffective.

Under Linux, sysadmins are encouraged to lower the default
net.ipv4.tcp_keepalive_* knobs in sysctl.  There should be
similar knobs in other operating systems (the default keepalive
intervals are usually ridiculously high, too high for anything).

When the listen socket has SO_KEEPALIVE set, the flag should be
inherited by accept()-ed sockets.
  • Loading branch information...
commit ee6ffca0a8d129dd930f4c63d0c4c9ef034b245f 1 parent 27f666a
Eric Wong authored
Showing with 4 additions and 0 deletions.
  1. +4 −0 lib/unicorn/socket_helper.rb
4 lib/unicorn/socket_helper.rb
@@ -51,6 +51,10 @@ def accf_arg(af_name)
def set_tcp_sockopt(sock, opt)
+ # just in case, even LANs can break sometimes. Linux sysadmins are
+ # can lower net.ipv4.tcp_keepalive_* sysctl knobs to very low values.
+ sock.setsockopt(SOL_SOCKET, SO_KEEPALIVE, 1) if defined?(SO_KEEPALIVE)
if defined?(TCP_NODELAY)
val = opt[:tcp_nodelay]
val = DEFAULTS[:tcp_nodelay] if nil == val
Please sign in to comment.
Something went wrong with that request. Please try again.