Unicorn hangs on POST request
normalperson at yhbt.net
Mon Mar 11 19:49:12 UTC 2013
Tom Pesman <tom at tnux.net> wrote:
> Eric Wong wrote:
> > Tom Pesman <tom at tnux.net> wrote:
> >> I'm trying to fix a problem I'm experiencing with my Rails
> >> application hosted at Heroku. I've one POST request which hangs and
> >> with the help of a customized rack-timeout gem
> >> (https://github.com/tompesman/rack-timeout) I managed to get a
> >> stacktrace: https://gist.github.com/tompesman/7b13e02d349aacc720e0
> >> How can I debug this further to get to the bottom of this and is
> >> this a rack or a unicorn problem?
> > It's a client or proxy problem.
> > The request was too large to be transferred within your configured
> > timeout, or the client or proxy layer was too slow at transferring the
> > POST to unicorn, or the host running unicorn was too overloaded/slow
> > to buffer the request.
> > Factors:
> > 1) Disk/filesystem/memory speed on the (client|proxy) talking to unicorn
> > 2) Disk/filesystem/memory speed on the host running unicorn.
> > 3) The network link between the (client|proxy) <-> unicorn.
> > I don't know about Heroku, but nginx will fully buffer the request body
> > before sending to unicorn, so all 3 factors are within your control.
> > Does Heroku limit (or allow limiting of) the size of request bodies?
> > Maybe a bad client sent a gigantic request. nginx limits request bodies
> > to 1M by default (client_max_body_size config directive).
> >  unicorn buffers request bodies to TMPDIR via TeeInput
> I agree with you if the POST request has a file to upload, but the
> requests we're dealing with do not upload a file and are actually quite
Do you have error logs from the proxy Heroku uses?
Even with small requests, clients/networks can fail to send the entire
request. nginx will log prematurely aborted client requests; check
if whatever proxy Heroku uses does the same.
> Can I modify the my customized rack-timeout gem to get more information to
> debug this problem?
Your env.inspect should show you @bytes_read in the Unicorn::TeeInput
object before the timeout was hit.
More information about the mongrel-unicorn