mirrored from git://git.bogomips.org/unicorn.git
-
Notifications
You must be signed in to change notification settings - Fork 258
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
bind listeners after loading for preload_app users
In the case where preload_app is true, delay binding new listeners until after loading the application. Some applications have very long load times (especially Rails apps with Ruby 1.9.2). Binding listeners early may cause a load balancer to incorrectly believe the unicorn workers are ready to serve traffic even while the app is being loaded. Once a listener is bound, connect() requests from the load balancer succeed until the listen backlog is filled. This allows requests to pile up for a bit (depending on backlog size) before getting rejected by the kernel. By the time the application is loaded and ready-to-run, requests in the listen backlog are likely stale and not useful to process. Processes inheriting listeners do not suffer this effect, as the old process should still be capable of serving new requests. This change does not improve the situation for the preload_app=false (default) use case. There may not be a solution for preload_app=false users using large applications. Fortunately Ruby 1.9.3+ improves load times of large applications significantly over 1.9.2 so this should be less of a problem in the future. Reported via private email sent on 2012-06-29T22:59:10Z
- Loading branch information
Eric Wong
committed
Aug 2, 2012
1 parent
91a3cde
commit 53c375d
Showing
4 changed files
with
49 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -0,0 +1,4 @@ | |||
use Rack::ContentLength | |||
use Rack::ContentType, "text/plain" | |||
names = Unicorn.listener_names.inspect # rely on preload_app=true | |||
run(lambda { |_| [ 200, {}, [ names ] ] }) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -0,0 +1,32 @@ | |||
#!/bin/sh | |||
. ./test-lib.sh | |||
|
|||
# Raindrops::Middleware depends on Unicorn.listener_names, | |||
# ensure we don't break Raindrops::Middleware when preload_app is true | |||
|
|||
t_plan 4 "Unicorn.listener_names available with preload_app=true" | |||
|
|||
t_begin "setup and startup" && { | |||
unicorn_setup | |||
echo preload_app true >> $unicorn_config | |||
unicorn -E none -D listener_names.ru -c $unicorn_config | |||
unicorn_wait_start | |||
} | |||
|
|||
t_begin "read listener names includes listener" && { | |||
resp=$(curl -sSf http://$listen/) | |||
ok=false | |||
t_info "resp=$resp" | |||
case $resp in | |||
*\"$listen\"*) ok=true ;; | |||
esac | |||
$ok | |||
} | |||
|
|||
t_begin "killing succeeds" && { | |||
kill $unicorn_pid | |||
} | |||
|
|||
t_begin "check stderr" && check_stderr | |||
|
|||
t_done |