首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >A Errno::ENOMEM问题

A Errno::ENOMEM问题
EN

Stack Overflow用户
提问于 2014-05-20 12:12:58
回答 1查看 1.5K关注 0票数 1

突然,在我的暂存服务器和prod服务器上(不同但使用相同的VPS提供程序),我在使用我的ruby rails应用程序时收到了以下错误:

代码语言:javascript
复制
An Errno::ENOMEM occurred in projects#update:

Cannot allocate memory - identify -format %wx%h '/tmp/Lanscape_originalV220140520-32388-1alg9vz.png[0]'
vendor/bundle/ruby/1.9.1/gems/cocaine-0.3.0/lib/cocaine/command_line/runners/process_runner.rb:17:in `spawn’"

我怎么才能解决这个问题?

我临时解决了这个问题,重新启动了服务器

下面是导致此问题的项目更新文件:

代码语言:javascript
复制
class ProjectUpdatesController < ApplicationController
  before_filter :get_project
  def index
    @project_updates = @project.project_updates
    @project_update = ProjectUpdate.new
  end

  def show
    @project_update = ProjectUpdate.find(params[:id])
  end

  def new
    @project_update = ProjectUpdate.new
  end

  def edit
    @project_update = ProjectUpdate.find(params[:id])
  end

  def create
    @project_update = ProjectUpdate.new(params[:project_update])
    @project_update.project = @project
    return redirect_to :back, :alert => 'abc.' unless current_user.owner?(@project_update.project)
      if @project_update.save
        redirect_to project_project_updates_path(@project), :notice => 'abc.'
      else
        redirect_to project_project_updates_path(@project), :alert => 'abc.'
      end
  end

  def update
    @project_update = ProjectUpdate.find(params[:id])
    return redirect_to :back, :notice => 'you cannot edit project update.' unless current_user.owner?(@project_update.project)
      if @project_update.update_attributes(params[:project_update] )
        redirect_to project_project_updates_path(@project), :notice => 'abc.'
      else
        redirect_to project_project_updates_path(@project), :alert => 'abcy.'
      end
  end

  def destroy
    @project_update = ProjectUpdate.find(params[:id])
    return redirect_to :back, :alert => 'abc.' unless current_user.owner?(@project_update.project)
    @project_update.destroy

    respond_to do |format|
      format.html { redirect_to project_project_updates_url(@project) }
      format.json { head :no_content }
    end
  end

  def get_project
    @project = Project.find(params[:project_id])
  end

  def feed
    @project = Project.find(params[:project_id])
    @project_updates = @project.project_updates
    respond_to do |format|
      format.rss { render :layout => false }
    end
  end
end
EN

回答 1

Stack Overflow用户

发布于 2014-11-28 15:10:30

显然,projects#update以某种方式触发了对identify -format ...的系统调用。gem 可卡因用于此。它在自述文件中写道:

https://github.com/thoughtbot/cocaine#posix-spawn

您可以通过安装posix派生gem来提高性能。在分叉命令行进程时,这个gem可以防止复制应用程序的堆。对于具有大堆的应用程序,增益可能很大。

我对此进行了测试并复制了错误。

代码语言:javascript
复制
#!/usr/bin/env ruby

require 'posix/spawn'

@arrays = []

def do_echos
        begin
                IO.popen('echo I am a child started with popen') { |io| puts io.read }
        rescue  Errno::ENOMEM => e
                puts "IO.popen: #{e.message}"
        end

        begin
                pid = Process.spawn('echo I am a child started with Process.spawn')
                Process.wait(pid)
        rescue Errno::ENOMEM => e
                puts "Process.spawn: #{e.message}"
        end

        child = POSIX::Spawn::Child.new('echo', 'I am a child started with posix_spawn');
        puts child.out
end

def fill_mem
        begin
                while true
                        @arrays << Array.new(10000000)
                end
        rescue NoMemoryError
                puts "Allocated arrays until out of memory..."
        end
end

do_echos
fill_mem
do_echos

这一产出如下:

我是个从波芬开始的孩子 我是一个从Process.spawn开始的孩子 我是一个从posix_spawn开始的孩子 分配数组直到内存耗尽..。 IO.popen:无法分配内存回显 Process.spawn:无法分配内存回显 我是一个从posix_spawn开始的孩子

最后,我建议你听从可卡因的建议。

要包含posix-派生,只需将其添加到您的Gemfile中,或者,如果您不使用bundler,则安装gem。

https://github.com/rtomayko/posix-spawn

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23759508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档