2015-12-02 65 views
2

我使用apache和puma来部署应用程序。我使用PostgreSQL。 Code on github。我的应用程序很慢。当我在一张桌子上生成几千行时,生产力开始变差,但仍然可以接受。我仍然可以每秒处理5个请求。当我将一百万行添加到一个表中时,一个查询在8秒内执行,并且视图似乎永远生成。我添加了索引并且多次写入原始SQL查询,但生产力仍然非常低。如何调整Rails应用程序

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

+3

首先,你需要找出根本原因。数据库查询是否缓慢 - 如果您在没有Rails的情况下直接在数据库上运行查询,该怎么办?请求是否太多(N + 1个查询)?你是否将太多的物体加载到内存中? – spickermann

+3

我提出这个问题,因为你提到它是课程项目:你是否在生产环境中测量?因为默认的开发环境不是为了扩展而设计的,而是为了简化开发。 – Martijn

+0

所有之前我的评论应遵循也我可以添加一个,你可以使用子弹为n + 1 http://railscasts.com/episodes/372-bullet?view=asciicast读这也用于计数器缓存和prod增加缓冲区大小用于pg并发性的maxclient –

回答

4

我建议设置Mini Profiler来尝试识别瓶颈。特别是看看N+1 problem(考虑使用Bullet如果这个的问题)。

避免遍历所有的行和实例化一个模型,每一个,从而吸干内存:

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

使用分页(看看KaminariWillPaginate),以避免渲染页面的行数过多。

0

优化之前 - 收集统计信息(例如使用请求日志分析器gem)并确定哪些请求的平均速度最慢。

例如,您可能需要每周执行一次的8秒请求,以及每秒执行一次0.5秒的请求,以便先优化后者,以便让应用更快。

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

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

更具体到网络编程 - 每个查询任何外部(db/webservices/memcache /等)花费时间,数据也会计数,避免单独查询集合中的每个元素,如果您可以一次获取所有元素或获取较少数量的请求(由于这个原因,导轨已经急切地加载关联)

首先,我会研究过量的db查询,删除Ë不必要的查询,并考虑执行计划(又名explain ..)对于那些仍然

第三件事是垃圾回收,但我不认为这是你的瓶颈,此刻

相关问题