3

Il y a une semaine, j'ai commencé à déplacer mon ancienne application écrite dans Rails 2.3.5 vers new 3.0. Malheureusement, j'ai découvert que certaines vues se chargent étonnamment lentement.Rails3 - Pourquoi mes temps de chargement sont si longs?

Exemple:

Rails 2.3.5 Ruby 1.8.7 -> WEBrick: Completed in 297ms (View: 143, DB: 40) 
Rails 3.0.0 Ruby 1.8.7 -> WEBrick: Completed in 3081ms (View: 261, ActiveRecord: 108) 
Rails 3.0.0 Ruby 1.8.7 -> WEBrick: Completed in 2495ms (View: 356, ActiveRecord: 76), slightly improved version -> less SQL queries, more counting in the view 
Rails 3.0.0 Ruby 1.9.2 -> WEBrick: Completed in 2941ms (View: 423, ActiveRecord: 90), imp. version 

Les temps diffèrent avec chaque reload bien sûr, mais vous pouvez obtenir l'idée - dans Rails 3 ce point de vue des charges 10 fois plus lente, peu importe si j'utiliser Ruby 1.8.7 ou 1.9 .2. J'ai vérifié cela dans les environnements de développement et de production ainsi que sur Heroku - à chaque fois, il se ressemble. Les temps de chargement des autres vues sont environ 2 fois plus lents dans 3.0.

Ici vous pouvez trouver tous les journaux:

http://img811.imageshack.us/img811/8514/1rails235ruby187oldver.jpg

http://img217.imageshack.us/img217/5521/2rails300ruby187oldver.jpg

http://img7.imageshack.us/img7/3089/3rails300ruby187diffver.jpg

http://img534.imageshack.us/img534/5138/4rails300ruby192diffver.jpg

Quel est le problème ici? J'ai été occupé pendant une semaine à adapter tous mes contrôleurs, vues, gemmes, plugins et configs à Rails3 et maintenant je suis bloqué ... Je pense que je devrais apprendre un peu de PHP, car cela me donnerait plus de contrôle sur ce qui est réellement événement.

La vue va ici:

<%= render :partial => 'menu' %> 

<div id="preload"> 
    <%= image_tag("/images/next_big.png") %> 
</div> 

    <div class="clearer"><hr /></div> 

    <div class="picture"> 
     <%= link_to image_tag(@picture.img.url(:page), :alt => @picture.title.gsub("; "," "), :border => 0), :action => "fullsize", :link => @picture.link %> 
    </div> 

    <div class="right"> 
     <div class="title"><%= raw @picture.title.gsub("; ","<br />") %></div> 
     <div class="tags"> 
      <% taglist = @picture.cached_tag_list.split(", ") %> 
      <% x = taglist.length %> 
      <% y = 0 %> 
      <% x.times do %> 
       <a href = "/tag/<%= taglist[y].gsub(" ", "_") %>"><%= taglist[y] %></a><% y += 1 %><% if y != x %>,<% end %> 
      <% end %>   
     </div> 
     <div class="datetime">Posted <%= time_ago_in_words(@picture.created_at) %> ago</div> 
     <% this_voting = "voting" %> 
     <div id="<%= this_voting %>" class="voting"> 
      <%= link_to image_tag("/images/yes.png", :alt => "Vote up", :class => 'vote_button'), {:action => :yes_vote, :id => @picture.id}, :remote => true %> 
      <span id="<%= this_voting + '_result' %>"><%= @picture.voting %></span> 
      <%= link_to image_tag("/images/no.png", :alt => "Vote against", :class => 'vote_button'), {:action => :no_vote, :id => @picture.id}, :remote => true %> 
      Pageviews: <%= @picture.views %>  
     </div> 
     <div class="link">Link:<br /><input type="text" value="http://bzzzzzzzzzzz.com/<%= @picture.link %>" /></div> 
     <div class="share">Share:<br /> 
      <a href="http://facebook.com/sharer.php?u=http://bzzzzzzzzzzz.com/<%= @picture.link %>" target="_blank"> 
       <img src="/images/mfb.png" alt="Facebook" onmouseover="puttext(fb, 0)" onmouseout="cleartext(0)" border="0" /></a> 
      <a href="http://twitter.com/home?status=http://bzzzzzzzzzzz.com/<%= @picture.link %>" target="_blank"> 
       <img src="/images/mtwitter.png" alt="Twitter" onmouseover="puttext(twitter, 0)" onmouseout="cleartext(0)" border="0" /></a> 
      <a href="http://digg.com/submit?url=http://bzzzzzzzzzzz.com/<%= @picture.link %>&amp;title=<%= @picture.title.gsub("; "," ") %>&amp;media=image&amp;topic=comedy" target="_blank"> 
       <img src="/images/mdigg.png" alt="Digg" onmouseover="puttext(digg, 0)" onmouseout="cleartext(0)" border="0" /></a> 
      <a href="http://reddit.com/submit?url=http://bzzzzzzzzzzz.com/<%= @picture.link %>&amp;title=<%= @picture.title.gsub("; "," ") %>" target="_blank"> 
       <img src="/images/mreddit.png" alt="Reddit" onmouseover="puttext(reddit, 0)" onmouseout="cleartext(0)" border="0" /></a> 
      <a href="http://stumbleupon.com/submit?url=http://bzzzzzzzzzzz.com/<%= @picture.link %>" target="_blank"> 
       <img src="/images/msu.png" alt="StumbleUpon" onmouseover="puttext(su, 0)" onmouseout="cleartext(0)" border="0" /></a> 
     </div> 
      <div id="share_caption0" class="share_caption"></div> 
      <div class="small_clearer"></div> 
     <% if @picture.last_comment_body %> 
     <div class="links_to_c"> 
      <a href="#comments"><%= @picture.comments_count %> comment<% if @picture.comments_count > 1 %>s<% end %></a> 
      | <%= link_to "Write a comment", :anchor => "add_comment" %> 
     </div> 
     <% else %> 
     <div class="links_to_c"> 
      <%= link_to "No comments, write a comment", :anchor => "add_comment" %> 
     </div> 
     <% end %> 
     <% if @picture.fullsize == true %> 
      <div class="fullsize"> 
       <%= link_to "Fullsize", :action => "fullsize", :link => @picture.link %> 
      </div> 
     <% end %>  
    </div> 
    <div class="next"> 
    <% if @picture.id != 1 %> 
     <% next_pict_link = Picture.find(@picture.id.to_i - 1).link %> 
     <%= link_to image_tag("/images/next.png", :alt => 'Next picture', :border=>0, :onmouseover => "this.src='/images/next_big.png'", :onmouseout => "this.src='/images/next.png'"), :action => 'show', :link => next_pict_link %> 
    <% else %> 
     <% last_pict_link = Picture.find(:last).link %> 
     <%= link_to image_tag("/images/next.png", :alt => 'Latest picture', :border=>0, :onmouseover => "this.src='/images/next_big.png'", :onmouseout => "this.src='/images/next.png'"), :action => 'show', :link => last_pict_link %> 
    <% end %> 
    </div> 

    <div class="clearer" style="padding-bottom: 0px"><hr /></div> 
    <h1><%= @thumbnails_text %></h1> 
    <% @pictures.each do |pict| %> 
     <%= link_to image_tag(pict.img.url(:thumb), :alt => "", :border => 1, :class => 'thumbnail'), :action => "show", :link => pict.link %> 
    <% end %> 
    <div class="clearer" style="padding-top: 6px; padding-bottom: 15px"><hr /></div> 
     <% if @picture.last_comment_body != nil %> 
      <a name="comments"><h1>Comments:</h1></a> 
      <% @picture.comments.each do |comment| %> 
      <div id="<%= comment.id %>" class="comment"> 
       <font class="c_author"><%= comment.author %></font> 
       <font class="c_datetime"><%= time_ago_in_words(comment.created_at) %> ago</font> 
       <font class="c_id">#<%= comment.id %></font><br /> 
       <div class="c_body"><%= comment.body.gsub(/\n/, '<br />') %></div> 
      </div> 
      <% end %> 
     <% end %>  
    <div id="insert_here"></div> 
    <a name="add_comment"></a> 
    <%= form_for [@picture, Comment.new], :remote => true do |f| %> 
    <div id="add_comment" <% if @picture.last_comment_body == nil %>style="margin-top: 15px"<% end %>> 
     <div class="f_section"> 
      <div class="f_type" style="padding-right: 46px"><%= f.label :author, "Nick:" %></div> 
      <div class="f_field"><%= f.text_field :author, :maxlength => 40 %></div> 
     </div> 
     <div class="f_section"> 
      <div class="f_type"><%= f.label :body, "Comment:" %></div> 
      <div class="f_field"><%= f.text_area :body, :maxlength => 2000, :rows => 6 %></div> 
     </div> 
     <div class="f_section"> 
      <div class="f_type" style="padding-right: 20px"><%= f.label :captcha, "Captcha:" %></div> 
      <div class="f_captcha"><%= raw recaptcha_tags %></div> 
     </div> 
     <div class="f_submit"> 
      <%= f.submit "Submit", :class => 'submit' %> 
     </div> 
    </div> 
    <% end %> 
<div class="clearer bottom_clearer fifty_from_top"><hr /></div> 
+1

Nous avons besoin de votre vue pour dire ce qui vous arrive – shingara

Répondre

1

Il y a beaucoup qui peut aller mal dans tout environnement, en particulier PHP. Ce qui pourrait être le problème ici est d'utiliser WEBrick avec Rails 3. L'utilisation d'une alternative comme le mongrel ou le passager pourrait aider à affiner ce problème.

Vous pourriez avoir une situation où quelque chose qui devrait fonctionner est expirant, par exemple, Memcache n'est pas configuré correctement, ou une demande CURL est faite qui échoue finalement.

Il est toujours pratique d'avoir une vue très basique, sans rien de ce que vous pouvez utiliser pour comparer les performances de base de votre application. Un contrôleur simple avec une seule action et une vue vide peut faire l'affaire ici. Le diagnostic du problème consistera à ajouter une partie du code de votre contrôleur à cette action vide jusqu'à ce que vous puissiez déclencher le problème, ou à retirer des parties de vos vues pour voir si c'est ce qui le cause.

Je commence généralement à commenter les partiels pour voir si l'un d'entre eux cause le glissement, et à partir de là revenir au contrôleur pour porter une attention particulière à ce qui est chargé.

+0

J'ai vérifié chaque vue une fois de plus et il semble que presque tous d'entre eux chargent au moins 2 fois plus lent que dans 2.3.5, alors maintenant je ne pense pas que c'est le problème de cette vue particulière. L'autre chose étrange est la suivante: 3081ms (Vue: 261, ActiveRecord: 108). 108 pour le db, 261 pour la vue et que se passe-t-il avec l'autre 2,7 sec? :) J'ai téléchargé la nouvelle version de l'application à Heroku et tandis que je les passe en revue il est évident que le nouveau est beaucoup, beaucoup plus lent, donc le problème ne réside pas dans le WEBrick je suppose ... – sNiCKY

+0

C'est assez particulier . Si vous créez une application Rails vide dans la version 3.0, cela vous pose-t-il le même problème? J'ai le sentiment que c'est quelque chose qui stagne depuis environ trois secondes. Cela peut expliquer pourquoi l'heure n'est pas prise en compte dans les métriques de vue ou de base de données. Je ne pense pas que ce soit une chose 3.0. Peut-être essayer de se cogner à la dernière version 3.0.1 au cas où il pourrait y remédier. – tadman

+0

Il y avait quelques requêtes étranges se produisant dans 3.0 tout en travaillant sur Postgres. Im sur 3.0.2pre et MySQL maintenant et il semble que le problème est parti, mais encore, les requêtes sont environ 2 fois plus lent que dans 2.3.5. Im attendant AREL2. – sNiCKY

1

Donc .. Je pense que j'ai trouvé le problème. J'ai vu que WEBrick me rend deux avertissements de dépréciation (liés à RAILS_ROOT et RAILS_ENV). Je n'ai utilisé aucune de ces phrases par moi-même, alors j'ai commencé à les chercher dans mes plugins et gemmes. J'ai découvert qu'ils sont utilisés par trombone (2.3.4) et recaptcha gem (recaptcha par ambethia 0.2.3). Ensuite, j'ai retiré un trombone de mon Gemfile et j'ai commenté tous les paramètres liés au trombone de mon modèle. Les temps de chargement ont chuté à 400-500ms.

Donc je suppose que je dois attendre jusqu'à ce que quelqu'un va réparer un trombone ...Im un ruby-newbie, donc je ne serai pas capable de le faire moi-même:/

+1

Hey sNICKY, j'utilise edge Paperclip avec Rails 3.0 et je ne vois pas de retard ... Je suggérerais de donner un essai à Paperclip edge du repo git: – bouchard

Questions connexes