19

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

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

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

我基本上想要的很简单。如果内存使用量是ram ,我想重新启动我的web进程。> 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'

非常感谢任何帮助!

4

2 回答 2

10

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

limit rss 157286400 157286400

此时进程可能会崩溃,也可能不会。那要看过程了!

这是 Upstart Source 中对此的测试

于 2011-06-09T00:41:06.470 回答
4

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

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

其他答案中已经建议的替代方法是设置虚拟内存地址空间大小限制。这将对设置“真实”内存限制产生非常不同的影响。

limit as <soft limit> <hard limit>

摘自 setrlimit 的手册页:

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

于 2016-06-02T08:59:38.010 回答