Ruby on rails 批量邮寄时内存泄漏

Ruby on rails 批量邮寄时内存泄漏,ruby-on-rails,ruby,heroku,actionmailer,amazon-ses,Ruby On Rails,Ruby,Heroku,Actionmailer,Amazon Ses,我在后台发送电子邮件(超过1k封信)。服务器在Heroku上。对于后台任务,我使用吸盘\u punch。Rails是4.1.6,web服务器是乘客。这是我的代码: def email_blast message, child_message_id, resend @download_url = message.doc_file_size ? message.doc.url : '' @subscriber = message.subscriber @message = m

我在后台发送电子邮件(超过1k封信)。服务器在Heroku上。对于后台任务,我使用
吸盘\u punch
。Rails是4.1.6,web服务器是乘客。这是我的代码:

def email_blast message, child_message_id, resend
    @download_url = message.doc_file_size ? message.doc.url : ''
    @subscriber = message.subscriber
    @message = message
    send_message child_message_id, resend
end

def send_message child_message_id, resend
    messages = child_message_id ? Message.where(id: child_message_id) : Message.where(parent_message_id: @message.id)
    messages = messages.joins(:pending_messages).uniq if resend && child_message_id.nil?
    subject = 'New Message'
    type = @message.type.split('::').second || @message.type.split('::').first
    messages.each do |message|
      send_mail message.all_email_addresses, action_name, subject, message, type
    end
end


def send_mail emails, template, subject, model, type
    response = mail(to: emails, subject: subject,
                    template_name: template).deliver!
    create_track_emails response.string.split(' ').third.strip, get_status(response), 'delivered', emails, model, type
  rescue => e
    create_track_emails '00000', 'failed', e.message, emails, model, type
end

def get_status response
    response.status == '250' ? 'success' : 'failed'
end

def create_track_emails smtp_message_id, status, description, emails, model, type
    id = type == 'Logon' ? model.id : model.to_id
    emails.each do |email|
      model.track_emails.create(email_address: email,
                                status: status,
                                status_description: description,
                                smtp_message_id: smtp_message_id,
                                subscriber_id: model.subscriber_id,
                                user_id: id,
                                message_type: type)
    end
end
我观察到内存泄漏。我还看到部分渲染时间随着每个字母的增加而增加:


请告诉我问题出在哪里,以及在哪里挖掘。

model。跟踪电子邮件。如果在通话之间重复使用
model
,create
将继续向同一数组追加记录。这可能会导致大量内存使用,因为垃圾收集器无法释放其中保留的任何内容,这些记录被视为“正在使用”。您有时可以在该关联之外创建电子邮件以避免这种情况。@tadman是的,该模型被重复使用。这是一个典型的信息。至于电子邮件,最多可以有两个电子邮件地址。你能告诉我,你建议做什么样的决定吗?你确定渲染时间和内存泄漏与此有关吗?@tadman如果我在创建后在回调中创建track\u电子邮件,会不会出现内存泄漏?Ruby没有传统的内存泄漏。它“无意中保留”了一些物体。@tadman你能告诉我,在这种情况下,你会建议什么样的解决方案吗?