У меня есть сайт, построенный на Rails, на Heroku, который, как правило, работает нормально, используя около 90% памяти.
Через Scout я выделил проблему в своем Rails-приложении, где мои комментарии # create-controller иногда выделяют 860 КБ памяти, что приводит к выключению моего приложения на долгое время в течение следующих тайм-аутов и т. Д. Большую часть времени выделенная память является частью этого, поэтому проблема периодически.
Функция комментария сама по себе не супер важна, но она мне все еще нужна. Я полагаю, что три его части могут вызвать проблемы с памятью:
Слишком длинная строка содержимого (то есть сам комментарий). Например, если спамер публикует супер длинный текст. Я не верю, что это проблема, поскольку мой последний всплеск памяти был вызван обычным пользователем, который оставил очень короткий комментарий.
Мой rakismet-gem (https://github.com/joshfrench/rakismet) и проверка на спам. Я использую последнюю версию (1.5.4). Вполне вероятно, что это проблема, поскольку я действительно не знаю, что загружается в память при использовании.
Мой уведомитель-звонок в коде.
Могу ли я что-нибудь сделать, чтобы выявить проблемы с памятью и спасти в контроллере, поэтому, если есть какие-либо "плохие" комментарии, они не нарушат весь сайт?
Видите ли вы что-нибудь, что может вызвать выделение памяти монстра в коде?
Код ниже:
Комментарии # Создать:
def create
require 'memory_profiler'
report = MemoryProfiler.report do
@comment = Comment.new(comment_params)
spam_features = %w(\xA cialis informative the that this buy href)
unless @current_administrator.present?
if spam_features.any? {|str| @comment.content.include? str}
logger.info "L: Comment include spam features"
redirect_to article_path(Article.find('din-kommentar-har-inte-sparats')) and return
elsif @comment.author.size > 40 || @comment.author_email.size > 40
logger.info "L: Comment author name or email too long (suspicious)"
redirect_to article_path(Article.find('din-kommentar-har-inte-sparats')) and return
end
end
# This shouldn't be here (but don't know how to put it in the model)
if !@comment.blog_post_id.blank? # This is a comment on a blog post
return_to_path = blog_post_path(BlogPost.find(@comment.blog_post_id))
elsif !@comment.gift_id.blank? # This is a comment on a gift
return_to_path = gift_path(Gift.find(@comment.gift_id))
elsif !@comment.contest_id.blank? # This is a comment on a contest
return_to_path = contest_path(Contest.find(@comment.contest_id))
elsif !@comment.christmas_fair_id.blank? # This is a comment on a christmas fair
return_to_path = christmas_fair_path(ChristmasFair.find(@comment.christmas_fair_id))
elsif @comment.tmp_julrim # This is a comment on a christmas fair
return_to_path = rhymes_path
else
raise ActionController::RoutingError.new('Not Found')
end
return_to_path << "#comments"
@comment.status_id = 3
@comment.user_ip = request.remote_ip
@comment.user_agent = request.env['HTTP_USER_AGENT']
@comment.marked_as_spam = @comment.spam? # Using rakismet to check for spam
#if !@comment.marked_as_spam || @current_administrator.present?
respond_to do |format|
#@comment.status_id = 1 if @comment.contest_id == 44
if @comment.save
Notifier.new_comment(@comment).deliver if Rails.env == 'production' unless @comment.marked_as_spam
format.html { redirect_to return_to_path, notice: 'Din kommentar har registrerats och kommer att ses över innan den godkänns.' }
# format.json { render action: 'show', status: :created, location: @comment }
else
format.html { render action: 'new' }
format.json { render json: @comment.errors, status: :unprocessable_entity }
end
end
end