我最近非常喜欢Upstart。以前我一直在使用God,Monit和Bluepill,但我并不喜欢这些解决方案,所以我试试Upstart。
我一直在使用Foreman gem为/etc/init
中的进程生成一些基本的Upstart配置文件。但是,这些生成的文件只处理崩溃进程的重新生成。我想知道是否有可能告诉Upstart重新启动一个消耗例如> 150mb
内存的进程,就像使用Monit,God或Bluepill一样。
我通读Upstart docs和this看起来像我正在寻找的东西。虽然我不知道如何配置这样的东西。
我基本上想要的很简单。如果内存使用量为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'
非常感谢任何帮助!
答案 0 :(得分:10)
将此附加到myapp-web-*.conf
的末尾将导致任何分配调用尝试分配超过150mb
的内存以返回ENOMEM
:
limit rss 157286400 157286400
此过程可能会崩溃,或者可能不会崩溃。这取决于这个过程!
答案 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,或者此资源不受限制。