diff options
author | Eric Wong <normalperson@yhbt.net> | 2009-06-30 19:16:43 -0700 |
---|---|---|
committer | Eric Wong <normalperson@yhbt.net> | 2009-07-08 14:49:52 -0700 |
commit | f63f79f24ea3c6419b2664cbda5f2cbb41225bbe (patch) | |
tree | 6cb7ec609a27dfbdaed1b527603b9fe13422f923 /lib/unicorn/configurator.rb | |
parent | 98e77adbdcdd96d24c98fd098d9a046f152d6535 (diff) | |
download | unicorn-f63f79f24ea3c6419b2664cbda5f2cbb41225bbe.tar.gz |
Now that we support tunnelling arbitrary protocols over HTTP as well as "100 Continue" responses, TCP_NODELAY actually becomes useful to us. TCP_NODELAY is actually reasonably portable nowadays; even. While we're adding non-portable options, TCP_CORK/TCP_NOPUSH can be enabled, too. Unlike some other servers, these can't be disabled explicitly/intelligently to force a flush, however. However, these may still improve performance with "normal" HTTP applications (Mongrel has always had TCP_CORK enabled in Linux). While we're adding OS-specific features, we might as well support TCP_DEFER_ACCEPT in Linux and FreeBSD the "httpready" accept filter to prevent abuse. These options can all be enabled on a per-listener basis. (cherry picked from commit 563d03f649ef31d2aec3505cbbed1e015493b8fc)
Diffstat (limited to 'lib/unicorn/configurator.rb')
-rw-r--r-- | lib/unicorn/configurator.rb | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/lib/unicorn/configurator.rb b/lib/unicorn/configurator.rb index a432f64..860962a 100644 --- a/lib/unicorn/configurator.rb +++ b/lib/unicorn/configurator.rb @@ -207,7 +207,24 @@ module Unicorn # specified. # # Defaults: operating system defaults - def listen(address, opt = { :backlog => 1024 }) + # + # +tcp_nodelay+: disables Nagle's algorithm on TCP sockets + # + # This has no effect on UNIX sockets. + # + # Default: operating system defaults (usually Nagle's algorithm enabled) + # + # +tcp_nopush+: enables TCP_CORK in Linux or TCP_NOPUSH in FreeBSD + # + # This will prevent partial TCP frames from being sent out. + # Enabling +tcp_nopush+ is generally not needed or recommended as + # controlling +tcp_nodelay+ already provides sufficient latency + # reduction whereas Unicorn does not know when the best times are + # for flushing corked sockets. + # + # This has no effect on UNIX sockets. + # + def listen(address, opt = {}) address = expand_addr(address) if String === address Hash === @set[:listener_opts] or @@ -217,6 +234,11 @@ module Unicorn Integer === value or raise ArgumentError, "not an integer: #{key}=#{value.inspect}" end + [ :tcp_nodelay, :tcp_nopush ].each do |key| + (value = opt[key]).nil? and next + TrueClass === value || FalseClass === value or + raise ArgumentError, "not boolean: #{key}=#{value.inspect}" + end @set[:listener_opts][address].merge!(opt) end |