Process 使用Upstart设置内存消耗限制

Process 使用Upstart设置内存消耗限制,process,limit,upstart,memory-consumption,Process,Limit,Upstart,Memory Consumption,我最近很喜欢暴发户。以前我一直在使用上帝,莫尼特和蓝丸,但我真的不喜欢这些解决方案,所以我给暴发户一个尝试 我一直在使用Foreman gem为/etc/init中的流程生成一些基本的Upstart配置文件。但是,这些生成的文件只处理崩溃进程的重新启动。我想知道是否有可能告诉Upstart重新启动一个消耗了150mb内存的进程,就像Monit、God或Bluepill一样 我通读了这本书,看起来像是我要找的东西。虽然我不知道如何配置这样的东西 我基本上想要的很简单。如果内存使用量为150mb,我

我最近很喜欢暴发户。以前我一直在使用上帝,莫尼特和蓝丸,但我真的不喜欢这些解决方案,所以我给暴发户一个尝试

我一直在使用Foreman gem为
/etc/init
中的流程生成一些基本的Upstart配置文件。但是,这些生成的文件只处理崩溃进程的重新启动。我想知道是否有可能告诉Upstart重新启动一个消耗了150mb内存的进程,就像Monit、God或Bluepill一样

我通读了这本书,看起来像是我要找的东西。虽然我不知道如何配置这样的东西

我基本上想要的很简单。如果内存使用量为150mb,我想重新启动
web
进程。以下是我拥有的文件:

|-- myapp-web-1.conf
|-- myapp-web-2.conf
|-- myapp-web-3.conf
|-- myapp-web.conf
|-- myapp.conf
其内容包括:

myapp.conf

pre-start script

bash << "EOF"
  mkdir -p /var/log/myapp
  chown -R deployer /var/log/myapp
EOF

end script
start on starting myapp
stop on stopping myapp
start on starting myapp-web
stop on stopping myapp-web
respawn

exec su - deployer -c 'cd /var/applications/releases/20110607140607; cd myapp && bundle exec unicorn -p $PORT >> /var/log/myapp/web-1.log 2>&1'
myapp-web-1.conf/myapp-web-2.conf/myapp-web-3.conf

pre-start script

bash << "EOF"
  mkdir -p /var/log/myapp
  chown -R deployer /var/log/myapp
EOF

end script
start on starting myapp
stop on stopping myapp
start on starting myapp-web
stop on stopping myapp-web
respawn

exec su - deployer -c 'cd /var/applications/releases/20110607140607; cd myapp && bundle exec unicorn -p $PORT >> /var/log/myapp/web-1.log 2>&1'

非常感谢任何帮助

将此附加到
myapp web-*.conf
的末尾将导致任何试图分配超过
150mb
内存的分配调用返回
ENOMEM

limit rss 157286400 157286400
进程可能会在此时崩溃,也可能不会。这取决于过程


.

从Upstart文档中,限制来自
rlimit
系统调用选项。()

因为Linux2.4+设置rss(常驻集大小)没有效果

其他答案中已经建议的另一种选择是as,它设置虚拟内存地址空间大小限制。这将对设置“真实”内存限制产生非常不同的效果

limit as <soft limit> <hard limit>
限制为
setrlimit手册页摘录:

利米特阿什 进程虚拟内存(地址空间)的最大大小(字节)。此限制会影响对brk(2)、mmap(2)和mremap(2)的调用, 当超过此限制时,会出现错误ENOMEM。自动堆栈扩展也将失败(并生成一个 如果没有通过sigaltstack(2)提供备用堆栈,则终止进程。由于值是长的,因此在具有 32位长此限制最多为2 GiB,或者此资源不受限制


嘿,谢谢你的回答。我对所有这些都不太熟悉,但如果我理解正确,我的(Ruby)应用程序将在超过150mb ram后尝试分配内存,在这一点上(定义:
限制rss 157286400 157286400
时),它将引发异常(以Ruby为例,在做了一些研究之后,我认为会出现这个例外:
Errno::ENOMEM
)通常会使过程崩溃。但可能不在Rails框架中。我必须仔细研究一下。谢谢!我想我能够找出剩下的部分,这要感谢你的回答!你知道ruby/Rails如何工作吗?我很有兴趣在我们的服务架构中试一下。@jnewland Rails应用程序有什么进展吗?我收到了Nly试图实现这一点,但发现rss限制没有任何效果。From
man 2 getrlimit
:“RLIMIT_rss指定进程驻留集的限制(以页为单位)(驻留在RAM中的虚拟页数)。此限制仅在Linux 2.4.x,x<30中有效,并且只影响对madvise(2)的调用,指定MADV_WILLNEED。“我最终使用
限制为
,这导致我的失控进程接收到一个
ENOMEM
@MichaelHale“as”是什么意思,而不是使用“rss”?我在使其工作时也遇到问题,但找不到任何关于upstart limit节条款的文档。。。