Rails 5内存膨胀通过渲染

时间:2017-11-19 00:55:50

标签: ruby-on-rails ruby postgresql heroku memory-management

在过去几个月学习rails并启动我的第一个Web应用程序后,我发现我遇到了内存膨胀(有关详细信息,请参阅Scout屏幕截图)!

我试过查看Scout文档和StackOverflow,但目前没有任何效果。

这就是我所知道的:

  1. 在本地,我的渲染速度似乎正常。一旦我点击,bam一切都会快速显示(最多1秒钟)。

  2. 在我的Heroku服务器上,我正在经历剧烈的减速(大约12秒)!

  3. 在我渲染一次页面后,连续渲染的速度要快得多(不到1秒)。我的猜测是有某种形式的缓存可以帮助我。

  4. 先谢谢你!

    订单/ index.html.erb

    Scout已经说过内存膨胀了。

    <windows.h>

    订购部分(_order.html.erb)

    <table class="alt">
                <thead>
                  <tr>
                    <th class="2u">Frequency</th>
                    <th class="3u">Letters</th>
                    <th class="4u">Next Reminder</th>
                    <th class="1u">Active</th>
                    <th class="2u">View Order</th>
                  </tr>
                </thead>
                  <tbody>
                    <!-- Renders orders/_order.html.erb -->
                    <%#= render @orders %>
                    <% @orders.each do |order| %>
                      <%= render order %>
                    <% end %>
                  </tbody>
                  <tfoot>
                    <tr>
                      <td colspan="2"></td>
                      <td colspan="3"><%= will_paginate(@orders) %></td>
                    </tr>
                  </tfoot>
              </table>
    

    订单控制器

    <tr id="order-<%= order.id %>">
        <td><%= order.freq %></td>
        <td><%= pluralize(order.microposts.length, "post") %></td>
        <td><%= show_time(order.reminder) %></td>
        <td><%= human_boolean(order.continue) %></td>
        <td>
            <%= link_to "View", order_microposts_path(order) %>
        </td>
    </tr>
    

    本地日志渲染

      def index
        # @user from application controller
        # Get orders including microposts (for size)
        @orders = Order.includes(:microposts).where(user_id: params[:user_id])
                                  .paginate(page: params[:page], per_page: 5)
      end
    

    侦察渲染用法

    Scout Rendering

    Scout Memory Bloat

    Scout Memory Bloat

1 个答案:

答案 0 :(得分:0)

你在循环中呈现部分,这不是非常有效,推荐的方法是渲染部分一次,并将对象作为集合传递:

= render partial: 'orders/order', collection: @orders

或者你注释掉的速记也应该有用:

= render @orders