How to track down never-ending requests

Occasionally, my server gets nearly completely unresponsive. Nearly the
entire CPU usage is spent in IO wait. I'm forced to kill the ruby
processes to get the server back up. The log files are not very useful
because the request never finishes so I can't simply search for requests
that took at least x seconds. Are there any tools are techniques to
determine what request is currently in progress?

I'm running Apache 2.2 and Passenger.

Thanks.

Does it happen on a certain action or when accessing actions in a
certain controller?

Srdjan Pejic wrote:

Does it happen on a certain action or when accessing actions in a
certain controller?

That’s what I’m trying to find out. The request never finishes so
examining the log file is of limited help.

Put logging statements in your controllers and/or look at your DB log(s)
(if MySQL, both the query and slow-query logs may be useful).

HTH,

Sorry, I wasn't clear. Does it happen on a certain portion of the site
or is it pretty random? Also, is it reproducible in development or is
it a production issue? If you're at your wits end, you could use
before_filter to log any and all hits to controllers and actions. If
it your code is OK, then the timeouts are happening on the DB server
or there's a communication problem between the app servers and the DB
server.

HTH

Srdjan Pejic wrote:

Sorry, I wasn't clear. Does it happen on a certain portion of the site
or is it pretty random? Also, is it reproducible in development or is
it a production issue? If you're at your wits end, you could use
before_filter to log any and all hits to controllers and actions. If
it your code is OK, then the timeouts are happening on the DB server
or there's a communication problem between the app servers and the DB
server.

It has only happened in production and I haven’t been able to duplicate
it. I may go weeks or more without any issues and then have several
slowdowns/lockups in a few days. Extra logging might do the trick.
Hmmm. I could add a database table with PID, controller, action, and
start time. In the before_filter log the action completed and in an
after_filter mark it completed or delete it. When it locks up I could
just look in the database for incomplete actions. Might be worth a try.