突然,在我的暂存服务器和prod服务器上(不同但使用相同的VPS提供程序),我在使用我的ruby rails应用程序时收到了以下错误:
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’"我怎么才能解决这个问题?
我临时解决了这个问题,重新启动了服务器
下面是导致此问题的项目更新文件:
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发布于 2014-11-28 15:10:30
显然,projects#update以某种方式触发了对identify -format ...的系统调用。gem 可卡因用于此。它在自述文件中写道:
https://github.com/thoughtbot/cocaine#posix-spawn
您可以通过安装posix派生gem来提高性能。在分叉命令行进程时,这个gem可以防止复制应用程序的堆。对于具有大堆的应用程序,增益可能很大。
我对此进行了测试并复制了错误。
#!/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://stackoverflow.com/questions/23759508
复制相似问题