From 1fe42f0f8e7f0902eb02860fb098cbd73ddf4e5d Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Fri, 6 Feb 2009 18:00:08 -0800 Subject: Use read(2) and blocking I/O for clients Unicorn is only designed for fast internal networks (and loopback); so avoid wasting time with userspace I/O buffering. This should not significantly affect userspace threading on 1.8 in case your application itself is running threads for some (masochistic) reason as long as the clients you're serving directly with Unicorn are fast. --- lib/unicorn.rb | 5 +++-- lib/unicorn/socket.rb | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/unicorn.rb b/lib/unicorn.rb index 794786a..bc940f0 100644 --- a/lib/unicorn.rb +++ b/lib/unicorn.rb @@ -6,6 +6,7 @@ require 'uri' require 'stringio' require 'fcntl' require 'logger' +require 'io/nonblock' # Compiled extension require 'http11' @@ -82,7 +83,7 @@ module Unicorn parser, params = @parser, @params parser.reset params.clear - data = client.readpartial(Const::CHUNK_SIZE) + data = client.sysread(Const::CHUNK_SIZE) nparsed = 0 # Assumption: nparsed will always be less since data will get filled with more @@ -119,7 +120,7 @@ module Unicorn break #done else # Parser is not done, queue up more data to read and continue parsing - chunk = client.readpartial(Const::CHUNK_SIZE) + chunk = client.sysread(Const::CHUNK_SIZE) break if !chunk or chunk.length == 0 # read failed, stop processing data << chunk diff --git a/lib/unicorn/socket.rb b/lib/unicorn/socket.rb index 1f0f03f..3f567c6 100644 --- a/lib/unicorn/socket.rb +++ b/lib/unicorn/socket.rb @@ -28,6 +28,7 @@ class Socket def unicorn_client_init self.sync = true + self.nonblock = false self.setsockopt(IPPROTO_TCP, TCP_NODELAY, 1) if defined?(TCP_NODELAY) self.setsockopt(SOL_TCP, TCP_CORK, 1) if defined?(TCP_CORK) end -- cgit v1.2.3-24-ge0c7