Tom Pesman <[email protected]> wrote: > Eric Wong wrote: > > Tom Pesman <[email protected]> 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). > > > > [1] 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 > small.
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? > https://github.com/tompesman/rack-timeout/blob/master/lib/rack/timeout.rb Your env.inspect should show you @bytes_read in the Unicorn::TeeInput object before the timeout was hit. _______________________________________________ Unicorn mailing list - [email protected] http://rubyforge.org/mailman/listinfo/mongrel-unicorn Do not quote signatures (like this one) or top post when replying
