Hi everyone,
My name is Michael S. 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:
-
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. -
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. -
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. -
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.
- 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