0

我的故障排除陷入了死胡同,我真的希望有人能提供帮助。

我正在使用rack-mini-profiler来帮助定位我的 Rails 网站中的潜在内存泄漏。我将其缩小到正在调用的方法。

高级配置文件:rack-mini-profiler high-level

SQL 配置文件:rack-mini-profiler 结果

在 SQL 配置文件图片中,请注意灰色条正上方和正下方的查询开始时间相差 1037 毫秒。这是我注意到的延迟,它会一直增长,直到我重新启动应用程序。

在本地运行时,我可以监控终端。当请求该方法时,只有 1 秒的延迟,然后它会执行。在此延迟期间,终端中不会显示任何查询或命令。

有人对我如何找出导致这种延迟的原因有任何想法吗?

我将 Ruby 2.2.0 与 Rails 4.1.6 一起使用。

谢谢!!

编辑:

这是 rack-mini-profiler 指向的方法:

def submit_answer
    quiz_attempt = CourseCompletion.find_by_id(params[:course_completion_id]).quiz_started
    choice = Choice.new(:answer_id => params[:answer], :quiz_attempt_id => quiz_attempt.id)
    @success = choice.save
    @answer = choice.answer
    @question = @answer.question
    @quiz_attempt = choice.quiz_attempt
    render :layout => false
  end
4

1 回答 1

0

看看 ruby ​​-prof github.com/ruby-prof/ruby-prof。尝试将您的操作主体包装到块中:

require 'ruby-prof'

# profile the code
RubyProf.start
# ... code to profile ...
result = RubyProf.stop

# print a flat profile to text
printer = RubyProf::FlatPrinter.new(result)
printer.print(STDOUT)

并且您应该在控制台中收到如下输出: 在此处输入图像描述

您还可以将探查器的输出重定向到日志或服务器上的某个文件。

所以在你的情况下编辑代码:

def submit_answer
    require 'ruby-prof'
    # profile the code
    RubyProf.start


    quiz_attempt = CourseCompletion.find_by_id(params[:course_completion_id]).quiz_started
    choice = Choice.new(:answer_id => params[:answer], :quiz_attempt_id => quiz_attempt.id)
    @success = choice.save
    @answer = choice.answer
    @question = @answer.question
    @quiz_attempt = choice.quiz_attempt
    render :layout => false

    result = RubyProf.stop
    # print a flat profile to text
    printer = RubyProf::FlatPrinter.new(result)
    printer.print(STDOUT)
  end

添加到宝石文件

gem 'ruby-prof'

运行bundle install并重新启动服务器。尝试再次运行操作并检查 rails 控制台输出。表格顶部的方法最耗时。

于 2021-01-30T09:24:00.507 回答