如何扩展Rails应用程序

时间:2015-12-02 11:56:26

标签: ruby-on-rails ruby

我使用apache和puma来部署app。我使用PostgreSQL。 Code on github。我的应用很慢。当我在一个表中生成几千行时,生产力开始变差但仍然可以接受。我仍然可以每秒处理5个请求。当我向一个表添加一百万行时,一个查询在8秒内执行,并且视图似乎永远生成。我添加了索引并多次编写原始SQL查询,但生产率仍然很慢。

在哪里可以开始优化rails应用程序?我怎样才能达到每秒至少50个请求?

2 个答案:

答案 0 :(得分:4)

我建议设置Mini Profiler以尝试识别您的瓶颈。特别要查找N+1 problem(如果此 是问题,请考虑使用Bullet。)

避免遍历所有行并为每个行实例化一个模型,从而吸收内存:

User.all.each do # Bad
User.find_each do # Better

使用分页(查看KaminariWillPaginate)以避免呈现包含太多行的网页。

答案 1 :(得分:0)

优化前 - 收集统计信息(例如使用request-log-analyzer gem)并确定哪些请求的平均缓慢度最高。

例如,您可能有一个8秒的请求,即每周执行一次,以及0.5秒的请求,每秒运行一次,以便更快地优化后者。

对于缓慢的请求 - 只需查看他们的日志并进一步缩小瓶颈 - db / views / etc.

然后去通用建议 - “没有代码比没有代码运行得更快”,然后进入原始SQL查询,编写C扩展等。首先考虑算法的复杂性,写得不好O(n)运行速度比高 - 优化O(n ^ 2),O(1)比O(n)

更具体的Web编程 - 对外部任何事物的每次查询(db / webservices / memcache / etc.)都需要花费时间,传输大量数据,避免单独查询集合中的每个元素,如果你可以一次获取它们或者在较少的请求中(由于这个原因,rails对关联有急切的加载)

首先,我会研究过多的数据库查询,删除不必要的查询,并查看执行计划(又名explain ..),以便保留

第三件事是垃圾收集,但我认为这不是你现在的瓶颈