about summary refs log tree commit homepage
DateCommit message (Collapse)
2009-05-04Inline and remove the HttpRequest#reset method
These potentially leaves an open file handle around until the next request hits the process, but this makes the common case faster.
2009-05-04Fix a warning about @pid being uninitialized
2009-05-03Speed up the worker accept loop
First, reduce no-op fchmod syscalls under heavy traffic. gettimeofday(2) is a cheaper syscall than fchmod(2). Since ctime resolution is only in seconds on most filesystems (and Ruby can only get to seconds AFAIK), we can avoid fchmod(2) happening within the same second. This allows us to cheat on synthetic benchmarks where performance is measured in requests-per-second and not seconds-per-request :) Secondly, cleanup the acceptor loop and avoid nested begins/loops as much as possible. If we got ECONNABORTED, then there's no way the client variable would've been set correctly, either. If there was something there, then it is at the mercy of the garbage collector because a method can't both return a value and raise an exception.
2009-05-04test_signals: ready workers before connecting
Otherwise there's a chance a child won't have a socket bound by the time we're trying to connect.
2009-05-03Instant shutdown signals really mean instant shutdown
Use SIGQUIT if you're going to be nice and do graceful shutdowns. Sometimes people run real applications on this server and SIGINT/SIGTERM get lost/trapped when Object is rescued and that is not good. Also make sure we break out of the loop properly when the master is dead. Testcases added for both SIGINT and dead master handling.
2009-05-04Remove redundant socket closing/checking
If our response succeeds, we've already closed the socket. Otherwise, we would've raised an exception at some point hit one of the rescue clauses.
2009-05-03TUNING: add a note about somaxconn with UNIX sockets
2009-05-03Ignore unhandled master signals in the workers
This makes it easier to use "killall -$SIGNAL unicorn" without having to lookup the correct PID.
2009-05-03Safer timeout handling and test case
Timeouts of less than 2 seconds are unsafe due to the lack of subsecond resolution in most POSIX filesystems. This is the trade-off for using a low-complexity solution for timeouts. Since this type of timeout is a last resort; 2 seconds is not entirely unreasonable IMNSHO. Additionally, timing out too aggressively can put us in a fork loop and slow down the system. Of course, the default is 60 seconds and most people do not bother to change it.
2009-05-03Merge commit 'origin/benchmark'
* commit 'origin/benchmark': benchmark/*: updates for newer versions of Unicorn
2009-05-03No point in unsetting the O_NONBLOCK flag
Since we've switched to readpartial, we'll already be protected from any unpleasant errors that might get thrown at us. There's no easy way to prevent MRI from calling a select() internally to check for readiness, so speculative+blocking read() calls are out already. Additionally, most requests come in the form of GETs which are fully-buffered in the kernel before we even accept() the socket; so a single readpartial call will be enough to fully consume it.
2009-05-03http_request: switch to readpartial over sysread
readpartial is actually as low-level as sysread is, except it's less likely to throw exceptions and won't change the blocking/non-blocking status of a file descriptor (we explicitly enable blocking I/O)
2009-05-03benchmark/*: updates for newer versions of Unicorn
* explain unicorn_peeraddr * support #readpartial in request * support #write in responses
2009-05-03http_response: luserspace buffering is barely faster
Simpler code on our end can be just a tick faster because syscalls are still not as cheap as normal functions and this still manages to play well with our lack of keepalive support as closing the socket will flush it immediately.
2009-05-03http_request: avoid StringIO.new for GET/HEAD requests
Since the vast majority of web traffic is GET/HEAD requests without bodies, avoid creating a StringIO object for every single request that comes in.
2009-05-03app/old_rails: correctly log errors in output
"out" was an invalid variable in that context...
2009-05-02Make speculative accept() faster for the common case
Only do speculative accept on the previous ready set of listeners. This makes it less CPU-intensive to have per-process debug listeners configured. Unfortunately, this makes non-primary listeners unable to accept connections if the server is under extremely heavy load and speculative accept() on the previous listener is always succeeding and hogging the process. Fortunately, this is an uncommon case.
2009-05-02Add TUNING document
Most of this should be applicable to Mongrel and other web servers, too.
2009-05-02app/exec_cgi: GC prevention
Don't allow newly created IO objects to get GC'ed and subsequently close(2)-ed. We're not reopening the {$std,STD}{in,out,err} variables since those can't be trusted to have fileno 1, 2 and 3 respectively.
2009-04-29Add example init script
This was done in Bourne shell because it's easier for UNIX sysadmins who don't know Ruby to understand and modify. Additionally, it can be used for nginx or anything else that shares compatible signal handling.
2009-04-27test_upload: still uncomfortable with 1.9 IO encoding...
It seems most applications use buffered IO#read instead of IO#sysread. So make sure our encoding is set correctly for buffered IO#read applications, too.
2009-04-26Small cleanup
No need to use ensure since process_client will handle errors regardless. And if not, there's a bug on our side that needs to fixed.
2009-04-25test_request: enable with Ruby 1.9 now Rack 1.0.0 is out
2009-04-25unicorn 0.7.0 v0.7.0
2009-04-25Rack 1.0.0 compatibility
Keep in mind that it's plenty possible to use Unicorn as a library without using Rack itself. Most of the unit tests do not depend on Rack, for example.
2009-04-25Fix log rotation being delayed in workers when idle
We were closing a no-longer-existent I/O object to break out of IO.select. This was broken in 0.6.0 but did not affect the worker when it was busy.
2009-04-24configurator: "listen" directive more nginx-like
The following specifications to bind port 8080 on all interfaces are now accepted in the configuration file: listen "8080" # (with quotes) listen 8080 # (without quotes)
2009-04-24doc: formatting changes for SIGNALS doc
2009-04-24unicorn 0.6.0 v0.6.0
2009-04-24cleanup: avoid duped self-pipe init/replacement logic
We do this in both the worker and master processes, so avoid repeating ourselves.
2009-04-24SIGTT{IN,OU} {in,de}crements worker_processes
This allows dynamic tuning of the worker_processes count without having to restart existing ones. This also allows worker_processes to be set to a low initial amount in the config file for low-traffic deployments/upgrades and then scaled up as the old processes are killed off. Remove the proposed reexec_worker_processes from TODO since this is far more flexible and powerful. This will allow not-yet-existent third-party monitoring tools to dynamically change and scale worker processes according to site load without increasing the complexity of Unicorn itself.
2009-04-24Allow std{err,out}_path to be changed via HUP
Seems like a good idea to be able to relocate log files on a config reload.
2009-04-24minor cleanups and save a few variables
Saying to the world that I may have OCD...
2009-04-24Avoid getppid() if serving heavy traffic
As long as our speculative accept()s are succeeding, then avoid checking for master process death and keep processing requests. This allows us to save some syscalls under extremely heavy traffic spikes.
2009-04-24Fixup reference to a dead variable
Oops, this was broken in another yak-shaving commit: 9206bb5e54a0837e394e8b1c1a96e27ebaf44e77
2009-04-23Describe the global constants we use.
Avoid scaring the thread-safety-first crowd (as much :)
2009-04-23make SELF_PIPE is a global constant
Since it has to work inside signal handlers, there's no point in making it a per-object instance variable given the price of an instance variable in MRI...
2009-04-23http_response: minor performance gains
Avoid creating garbage every time we lookup the status code along with the message. Also, we can use global const arrays for a little extra performance because we only write one-at-a time Looking at MRI 1.8, Array#join with an empty string argument is slightly better because it skips an append for every iteration.
2009-04-23http_response: just barely faster
2009-04-23test_socket_helper: disable GC for this test
Otherwise the GC will unlink sockets. A better solution (purgatory?) may be needed...
2009-04-23Make LISTENERS and WORKERS global constants, too
Instance variables are expensive and we'd be encouraging something like a thread-safe mentality for using ivars when dealing with things that are global to the entire process.
2009-04-23IO_PURGATORY should be a global constant
Since file descriptors are only private to a process, do not treat them as Object-specific.
2009-04-23http_request: micro optimizations
This leads to a ~10% improvement in test/benchmark/request.rb Some of these changes will need to be reworked for multi-threaded servers (Mongrel); but Unicorn will always be single-threaded.
2009-04-23Merge commit 'v0.5.4'
* commit 'v0.5.4': unicorn 0.5.4 Fix data corruption with small uploads via browsers Conflicts: lib/unicorn/http_request.rb
2009-04-23test_exec: cleanup stale socket on exit
2009-04-23unicorn_rails: avoid nesting lambdas
I've experienced occasional problems with this so it's probably best to stay on the safe side.
2009-04-23GNUmakefile: mark test_upload as a slow test
2009-04-23Get rid of UNICORN_TMP_BASE constant
It was just a waste of space and would've caused line wrapping. This reinstates the "unicorn" prefix when we create tempfiles, too.
2009-04-23unicorn 0.5.4 v0.5.4
2009-04-23Fix data corruption with small uploads via browsers
StringIO.new(partial_body) does not update the offset for new writes. So instead create the StringIO object and then syswrite to it and try to follow the same code path used by large uploads which use Tempfiles.