Michael Solovyov
2014-Jul-23 02:59 UTC
Scaling/optimizing a slow ruby on rails application.
Hi everyone, My name is Michael Solovyov and I'm the co-founder & CTO of a rails-based start-up. We have built a product for other businesses to help their users adopt their products. We've built the application, delivered to a few customers and now we've hit scaling and performance issues. I'd love your feedback on how we proceed as we try to resolve them: 1) These are the problems we've encountered: The main user dashboard takes between 7-15 seconds to load. The maximum requests per second that we can support are 100-150. 2) Why we think they're happening: We're using couchdb with an ORM that has our data modeled relationally. This causes the ORM to launch an extraordinary amount of http requests to couchdb to load all our data. The more data and users in the project, the longer the delay. There's also potentially inefficient code, extra loops etc. We're not using caching to it's fullest extent. 3) What we're using/what we've done: Our architecture: rails '3.2.12', ruby 1.9.3p374, nginx + unicorn (main server), elasticsearch (separate server), couchdb (separate server). All on AWS. We've added some view level caching where we can get away with stale data. We've tried using higher tiered/ssd aws servers but it doesn't look to be our main bottleneck. 4) How we plan on completing it: We're mostly done a rewrite to migrate our data and data model to activerecord. We've hit a snag in migrating s3 attachment code built into the couchdb ORM that we're using. Following the completion of the migration to sql/activerecord we are going to do the following in an attempt to increase performance: A. Use percono mysql server. B. Run tools such as bullet to analyze performance and where we might have bad queries/lookups. C. Update to latest Rails and Ruby versions. D. Look into Puma and paralelization of DB access calls. E. Break apart the application into separate services. 5) What we don't know right now: Whether switching to Activerecord or any of the above ideas will inherently give us any performance benefits. Whether we will have any other unexpected surprises or loss of functionality due to switching to ActiveRecord. How long this all will take and whether there's other areas that we need to focus to get sub 1 second performance that we're missing. Do you all have any feedback/ideas/insights completing projects like these? In particular, I would be curious about: a) How would you approach it? b) Anything that's worked for you in the past on suitable projects? c) Anything to avoid doing? d) Where to find good additional team members & advisors to help us complete the project? e) How long to expect it to take? Here are our application rake stats: http://pastie.org/private/qrxkytk4uur9odndydv5dq -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To view this discussion on the web visit https://groups.google.com/d/msgid/rubyonrails-talk/dab7f05f-a3bd-4716-8f9d-7b8007f5582d%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.