给定此服务器日志,推荐的优化我的应用程序的方法是什么?

cam

这是我的服务器日志,用于加载我的Dashboard#Index操作:

Started GET "/" for 127.0.0.1 at 2014-10-27 03:26:56 -0500
  User Load (1.9ms)  SELECT  "users".* FROM "users"  WHERE "users"."id" = 1  ORDER BY "users"."id" ASC LIMIT 1
Processing by DashboardController#index as HTML
  FamilyTree Load (3.0ms)  SELECT  "family_trees".* FROM "family_trees"  WHERE "family_trees"."user_id" = $1 LIMIT 1  [["user_id", 1]]
  ReadMark Load (1.1ms)  SELECT  "read_marks".* FROM "read_marks"  WHERE "read_marks"."user_id" = $1 AND "read_marks"."readable_type" = 'PublicActivity::ORM::ActiveRecord::Activity' AND "read_marks"."readable_id" IS NULL  ORDER BY "read_marks"."id" ASC LIMIT 1  [["user_id", 1]]
  Membership Load (1.3ms)  SELECT  "memberships".* FROM "memberships"  WHERE "memberships"."user_id" = $1 LIMIT 3  [["user_id", 1]]
  Rendered shared/_profile_box.html.erb (3.2ms)
  Node Load (1.4ms)  SELECT "nodes".* FROM "nodes"  WHERE "nodes"."family_tree_id" = $1 AND "nodes"."is_comment" IS NULL  [["family_tree_id", 1]]
  User Load (1.5ms)  SELECT "users".* FROM "users" INNER JOIN "memberships" ON "users"."id" = "memberships"."user_id" WHERE "memberships"."family_tree_id" = $1  ORDER BY "users"."first_name" ASC  [["family_tree_id", 1]]
  Rendered shared/_upload.html.erb (13.2ms)
  User Load (1.3ms)  SELECT  "users".* FROM "users"  WHERE "users"."id" = $1 LIMIT 1  [["id", 1]]
  Video Load (1.3ms)  SELECT  "videos".* FROM "videos"  WHERE "videos"."id" = $1 LIMIT 1  [["id", 6]]
   (34.0ms)  SELECT COUNT(*) FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'admin') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 1]]
DEPRECATION WARNING: [Best_in_place] :type is deprecated in favor of :as . (called from best_in_place_deprecated_options at /Users/marcgayle/.rvm/gems/ruby-2.0.0-p353@kordli/bundler/gems/best_in_place-0a0f62e19a8b/lib/best_in_place/helper.rb:152)
DEPRECATION WARNING: [Best_in_place] :type is deprecated in favor of :as . (called from best_in_place_deprecated_options at /Users/marcgayle/.rvm/gems/ruby-2.0.0-p353@kordli/bundler/gems/best_in_place-0a0f62e19a8b/lib/best_in_place/helper.rb:152)
  Participant Load (2.0ms)  SELECT "participants".* FROM "participants"  WHERE "participants"."video_id" = $1  [["video_id", 6]]
  Rendered shared/_box.html.erb (14247.4ms)
  Comment Load (1.4ms)  SELECT "comments".* FROM "comments"  WHERE "comments"."node_id" = $1  [["node_id", 1]]
  NodeComment Load (1.2ms)  SELECT "node_comments".* FROM "node_comments"  WHERE "node_comments"."node_id" = $1  [["node_id", 1]]
  CACHE (0.0ms)  SELECT  "users".* FROM "users"  WHERE "users"."id" = $1 LIMIT 1  [["id", 1]]
DEPRECATION WARNING: [Best_in_place] :type is deprecated in favor of :as . (called from best_in_place_deprecated_options at /Users/marcgayle/.rvm/gems/ruby-2.0.0-p353@kordli/bundler/gems/best_in_place-0a0f62e19a8b/lib/best_in_place/helper.rb:152)
  CACHE (0.0ms)  SELECT  "users".* FROM "users"  WHERE "users"."id" = $1 LIMIT 1  [["id", 1]]
DEPRECATION WARNING: [Best_in_place] :type is deprecated in favor of :as . (called from best_in_place_deprecated_options at /Users/marcgayle/.rvm/gems/ruby-2.0.0-p353@kordli/bundler/gems/best_in_place-0a0f62e19a8b/lib/best_in_place/helper.rb:152)
  User Load (1.3ms)  SELECT  "users".* FROM "users"  WHERE "users"."id" = $1 LIMIT 1  [["id", 2]]
DEPRECATION WARNING: [Best_in_place] :type is deprecated in favor of :as . (called from best_in_place_deprecated_options at /Users/marcgayle/.rvm/gems/ruby-2.0.0-p353@kordli/bundler/gems/best_in_place-0a0f62e19a8b/lib/best_in_place/helper.rb:152)
  CACHE (0.0ms)  SELECT  "users".* FROM "users"  WHERE "users"."id" = $1 LIMIT 1  [["id", 1]]
DEPRECATION WARNING: [Best_in_place] :type is deprecated in favor of :as . (called from best_in_place_deprecated_options at /Users/marcgayle/.rvm/gems/ruby-2.0.0-p353@kordli/bundler/gems/best_in_place-0a0f62e19a8b/lib/best_in_place/helper.rb:152)
  CACHE (0.0ms)  SELECT  "users".* FROM "users"  WHERE "users"."id" = $1 LIMIT 1  [["id", 2]]
DEPRECATION WARNING: [Best_in_place] :type is deprecated in favor of :as . (called from best_in_place_deprecated_options at /Users/marcgayle/.rvm/gems/ruby-2.0.0-p353@kordli/bundler/gems/best_in_place-0a0f62e19a8b/lib/best_in_place/helper.rb:152)
  CACHE (0.0ms)  SELECT  "users".* FROM "users"  WHERE "users"."id" = $1 LIMIT 1  [["id", 1]]
DEPRECATION WARNING: [Best_in_place] :type is deprecated in favor of :as . (called from best_in_place_deprecated_options at /Users/marcgayle/.rvm/gems/ruby-2.0.0-p353@kordli/bundler/gems/best_in_place-0a0f62e19a8b/lib/best_in_place/helper.rb:152)
  CACHE (0.0ms)  SELECT  "users".* FROM "users"  WHERE "users"."id" = $1 LIMIT 1  [["id", 1]]
DEPRECATION WARNING: [Best_in_place] :type is deprecated in favor of :as . (called from best_in_place_deprecated_options at /Users/marcgayle/.rvm/gems/ruby-2.0.0-p353@kordli/bundler/gems/best_in_place-0a0f62e19a8b/lib/best_in_place/helper.rb:152)
  Rendered shared/_comments.html.erb (23.9ms)
  Rendered dashboard/index.html.erb within layouts/application (14295.0ms)
  Rendered shared/_nav.html.erb (0.4ms)
  Rendered shared/_search.html.erb (0.5ms)
  Rendered devise/registrations/_edit.html.erb (12.8ms)
  Rendered shared/_edit_account_popup.html.erb (13.5ms)
   (1.8ms)  SELECT COUNT(*) FROM "activities" LEFT JOIN read_marks as read_marks ON read_marks.readable_type  = 'PublicActivity::ORM::ActiveRecord::Activity'
                                   AND read_marks.readable_id    = activities.id
                                   AND read_marks.user_id        = 1
                                   AND read_marks.timestamp     >= activities.created_at WHERE "activities"."owner_id" = 1 AND (read_marks.id IS NULL)
  Notification Load (2.4ms)  SELECT "activities".* FROM "activities" LEFT JOIN read_marks as read_marks ON read_marks.readable_type  = 'PublicActivity::ORM::ActiveRecord::Activity'
                                   AND read_marks.readable_id    = activities.id
                                   AND read_marks.user_id        = 1
                                   AND read_marks.timestamp     >= activities.created_at WHERE "activities"."owner_id" = 1 AND (read_marks.id IS NULL)
  Rendered public_activity/node/_create.html.erb (0.1ms)
  Rendered public_activity/node/_create.html.erb (0.1ms)
  Rendered public_activity/node/_create.html.erb (0.1ms)
  Rendered public_activity/comment/_create.html.erb (0.2ms)
  Rendered public_activity/node/_destroy.html.erb (0.2ms)
  Rendered public_activity/comment/_destroy.html.erb (0.1ms)
  Rendered public_activity/comment/_create.html.erb (0.1ms)
  Rendered public_activity/node/_create.html.erb (0.1ms)
  Rendered public_activity/node/_destroy.html.erb (0.1ms)
  Rendered public_activity/comment/_destroy.html.erb (0.1ms)
  Rendered public_activity/comment/_create.html.erb (0.1ms)
  Rendered public_activity/comment/_create.html.erb (0.1ms)
  Rendered public_activity/comment/_create.html.erb (0.1ms)
  Rendered public_activity/comment/_create.html.erb (0.1ms)
  Rendered public_activity/comment/_create.html.erb (0.1ms)
  Rendered public_activity/participant/_create.html.erb (0.1ms)
  Rendered public_activity/participant/_create.html.erb (0.1ms)
  Rendered public_activity/comment/_destroy.html.erb (0.1ms)
  Rendered public_activity/comment/_destroy.html.erb (0.1ms)
  Rendered public_activity/comment/_create.html.erb (0.1ms)
  Rendered public_activity/comment/_create.html.erb (0.1ms)
  Rendered public_activity/comment/_destroy.html.erb (0.1ms)
  Rendered public_activity/comment/_create.html.erb (0.1ms)
  Rendered public_activity/comment/_create.html.erb (0.1ms)
  Rendered public_activity/comment/_destroy.html.erb (0.1ms)
  Rendered public_activity/comment/_destroy.html.erb (0.1ms)
  Rendered public_activity/comment/_destroy.html.erb (0.1ms)
  Rendered public_activity/comment/_create.html.erb (0.1ms)
  Rendered public_activity/comment/_create.html.erb (0.1ms)
  Rendered public_activity/comment/_create.html.erb (0.1ms)
  Rendered public_activity/comment/_destroy.html.erb (0.1ms)
  Rendered public_activity/comment/_destroy.html.erb (0.1ms)
  Rendered public_activity/comment/_create.html.erb (0.1ms)
  Rendered public_activity/comment/_create.html.erb (0.1ms)
  Rendered public_activity/comment/_create.html.erb (0.1ms)
  Rendered public_activity/comment/_create.html.erb (0.1ms)
  Rendered public_activity/comment/_destroy.html.erb (0.1ms)
  Rendered public_activity/comment/_destroy.html.erb (0.1ms)
  Rendered public_activity/comment/_destroy.html.erb (0.1ms)
  Rendered public_activity/comment/_create.html.erb (0.1ms)
  Rendered public_activity/comment/_create.html.erb (0.1ms)
  Rendered public_activity/comment/_create.html.erb (0.1ms)
  Rendered public_activity/comment/_create.html.erb (0.1ms)
  Rendered public_activity/comment/_create.html.erb (0.1ms)
  Rendered public_activity/comment/_destroy.html.erb (0.1ms)
  Rendered public_activity/comment/_destroy.html.erb (0.1ms)
  Rendered public_activity/comment/_destroy.html.erb (0.1ms)
  Rendered public_activity/comment/_destroy.html.erb (0.1ms)
  Rendered public_activity/comment/_destroy.html.erb (0.1ms)
  Rendered public_activity/comment/_create.html.erb (0.1ms)
  Rendered public_activity/comment/_create.html.erb (0.1ms)
  Rendered public_activity/comment/_create.html.erb (0.1ms)
  Rendered public_activity/comment/_create.html.erb (0.1ms)
  Rendered public_activity/comment/_create.html.erb (0.1ms)
  Rendered public_activity/comment/_destroy.html.erb (0.1ms)
  Rendered public_activity/comment/_destroy.html.erb (0.1ms)
  Rendered public_activity/comment/_create.html.erb (0.1ms)
  Rendered public_activity/comment/_create.html.erb (0.1ms)
  Rendered shared/_notifications.html.erb (127.8ms)
  Rendered shared/_profile.html.erb (143.7ms)
  Rendered devise/registrations/_edit.html.erb (15.2ms)
  Rendered shared/_edit_account_popup.html.erb (16.0ms)
  CACHE (0.0ms)  SELECT "users".* FROM "users" INNER JOIN "memberships" ON "users"."id" = "memberships"."user_id" WHERE "memberships"."family_tree_id" = $1  ORDER BY "users"."first_name" ASC  [["family_tree_id", 1]]
  Rendered shared/_upload_video_popup.html.erb (7.2ms)
  Rendered shared/_navbar.html.erb (173.1ms)
  Rendered shared/_footer.html.erb (0.9ms)
Completed 200 OK in 14510ms (Views: 14448.1ms | ActiveRecord: 55.1ms)

我很想使用渴望的加载和所有这些爵士乐来进行ActiveRecord优化....但是考虑到时间之间的Views时间差异ActiveRecord,这种方法似乎很愚蠢。

这是我的Dashboard#Index控制器:

  def index
    @family_tree = current_user.family_tree
    @nodes = @family_tree.nodes.includes(:comments)
    @video = Video.new
    @videos = Video.all.where(:is_complete => true)
    @node = current_user.nodes.new
    @memberships = current_user.memberships.limit(3)    

    if params[:search]
      @nodes = Node.node_search(params[:search])
    else
      @videos = Video.all.order('created_at DESC')
      # flash[:notice] = "No results found"
    end
  end

这是我的Dashboard/index.html.erb

<% if !resource.errors.messages.empty? %>
    <!-- <div><%#= resource.errors.inspect %></div> -->
    <div><%= devise_error_messages2! %></div>
<% end %>

<!-- Content -->
<div id="content">
  <% if current_user.sign_in_count == 1 %>
    <div class="hidden" id="new-user"></div>
  <% end %>
  <div class="container">
        <div class="row">
            <!-- Profile -->
                <%= render "shared/profile_box" %>
                <!-- // Profile -->
            </div> <!-- //row -->
      <!-- Video -->
      <div id="video">
          <!-- Box Add -->
          <div class="box add-video" data-popup="add-video-step-1" data-step="3" data-intro="To upload a video simply click in this box or the upload a video button in the main bar.">
                        <a class="upload popupbox" href="#" data-popup="add-video-step-1">
              <%= image_tag("buttons/upload-video.gif")%>
                        </a>
          </div>
          <!-- Box -->
          <% @nodes.each do |node| %>
                <!-- Upload Video Comment Popup -->
           <%= render partial: "shared/upload", locals: {node: node} %>

          <div class="box">
              <%= render partial: "shared/box", locals: {node: node} %>

              <%= render partial: "shared/comments", locals: {node: node} %>
          </div>
          <% end %> <!-- node -->
      </div>
  </div>
</div>

我认为我不会把问题放在我的局部代码中,而是让它留在原处,如果你们要求的话,我会在以后添加它们。

我怀疑我可以做一两件事来大大减少视图渲染时间。它高得离谱。

我也在使用Turbolinks,但没有缓存。

考虑到我使用Turbolinks,会在这里建议使用俄语玩偶缓存吗?我的分析是否正确,即与AR查询相比,我更适合专注于视图渲染?还是我应该继续进行优化?

我不一定需要绝对100%的效率,我只是不希望加载时间超过14秒。在我看来,这太疯狂了。

cam

因此,事实证明,我最大的影响变化是摆脱了N + 1问题,这是我对这个急切的加载任务所做的:

@nodes = @family_tree.nodes.includes(:comments => :user)

这些就是结果。原始的加载时间是这样的:

Completed 200 OK in 14510ms (Views: 14448.1ms | ActiveRecord: 55.1ms)

这是随机刷新的3个主页的示例:

Completed 200 OK in 1125ms (Views: 1093.1ms | ActiveRecord: 24.6ms)

Completed 200 OK in 994ms (Views: 963.3ms | ActiveRecord: 23.8ms)

Completed 200 OK in 1428ms (Views: 1375.8ms | ActiveRecord: 47.5ms)

平均

Completed 200 OK in 1182.3ms (Views: 1144.07ms | ActiveRecord: 31.97ms)

改进

Completed: 91% improvement overall

Views: 92.1% improvement

ActiveRecord: 41.97% improvement.

由于费尔在这个答案- https://stackoverflow.com/a/26625454/91970 -提供清晰度如何解决这一点。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Bokeh(0.11)服务器应用程序中刷新/更新图的快速正确方法是什么?

推荐对Python GUI应用程序进行单元测试的推荐方法是什么?

推荐对Python GUI应用程序进行单元测试的推荐方法是什么?

在应用程序服务器的生产中使用Google Guice的正确阶段是什么?

使用服务器更新您的应用程序的最佳方法是什么?

在同构React Web应用程序中选择性地服务器渲染的最佳方法是什么?

http服务器的责任与使用此服务器托管的Web应用程序的责任

什么是应用程序服务器?

在Wildfly应用程序服务器上配置摘要身份验证的正确方法是什么

授权从我的react native应用程序到我的节点服务器的API调用的推荐策略是什么?

intellij中“应用程序服务器”窗口中的空白部分是什么

我的Ubuntu服务器推荐的分区方案是什么?

在服务器上运行我的Rails应用程序

在ubuntu上运行服务器应用程序的最佳方法是什么?

仅使用UDP托管小型服务器应用程序的缺点是什么?

glassfish应用程序服务器中的Web服务器是什么?

将数据从android应用程序传输到服务器上的数据库的最佳方法是什么?

对于基于服务器的应用程序,我需要在浏览器客户端上使用MVC模型的原因是什么?

该错误是什么意思““ /”应用程序中的服务器错误”。

应用程序启动后,在服务器中创建文件的正确方法是什么?

express logger、morgan logger 等为什么我的服务器应用程序中需要这个?

在android中制作聊天应用程序的最佳服务器是什么?

无法将日志从我在 heroku 上的 nodejs 应用程序保存到服务器

我的 laravel+Vuejs2 应用程序的最佳服务器或云托管是什么?

使用 Elastic-Stack 收集服务器硬件利用率、应用程序日志、应用程序 jvm 指标的最有益方法是什么?

离线构建无服务器应用程序的最佳方法是什么?

我应该使用什么来将 Rails 应用程序连接到远程服务器?

为什么我在闪亮的应用程序中收到“找不到服务器”错误?

从服务器获取我的应用程序的文本