使用Upstart设置内存消耗限制

时间:2011-06-07 14:35:50

标签: process limit upstart memory-consumption

我最近非常喜欢Upstart。以前我一直在使用God,Monit和Bluepill,但我并不喜欢这些解决方案,所以我试试Upstart。

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

我通读Upstart docsthis看起来像我正在寻找的东西。虽然我不知道如何配置这样的东西。

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

|-- 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

MyApp的-web.conf

start on starting myapp
stop on stopping myapp

myapp-web-1.conf / myapp-web-2.conf / myapp-web-3.conf

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'

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:10)

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

limit rss 157286400 157286400

此过程可能会崩溃,或者可能不会崩溃。这取决于这个过程!

Here's a test for this in the Upstart Source

答案 1 :(得分:4)

在Upstart文档中,限制来自rlimit系统调用选项。 (http://upstart.ubuntu.com/cookbook/#limit

由于Linux 2.4+设置rss(驻留集大小)无效。

在其他答案中已经建议的替代方法是 as ,它设置虚拟内存地址空间大小限制。这将设置“实际”内存限制的效果非常不同。

limit as <soft limit> <hard limit>

摘自setrlimit的手册页:

  

RLIMIT_AS                 进程的虚拟内存(地址空间)的最大大小(以字节为单位)。此限制会影响对brk(2),mmap(2)和mremap(2)的调用,                 超过此限制时,错误ENOMEM失败。自动堆栈扩展也会失败(并生成一个SIGSEGV                 如果没有通过sigaltstack(2)提供备用堆栈,则终止进程。由于价值很长,在机器上有一个                 32位长此限制最多为2 GiB,或者此资源不受限制。