2011-06-07 127 views
19

我最近變得非常喜歡Upstart。以前我一直在使用上帝,Monit和Bluepill,但我不太喜歡這些解決方案,所以我會試試Upstart。使用Upstart設置內存消耗限制

我一直在使用Foreman Gem來爲我的進程生成一些基本的Upstart配置文件,文件名爲/etc/init。但是,這些生成的文件只能處理崩潰進程的重新生成。我想知道是否可以告訴Upstart重啓一個正在消耗內存的進程,例如Monit,God或者Bluepill。

我通過Upstart docsthis閱讀看起來像我正在尋找的東西。雖然我不知道如何配置這樣的東西。

我基本上想要的是很簡單。如果內存使用量爲> 150mb ram,我想重新啓動我的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 

MYAPP-web.conf

start on starting myapp 
stop on stopping myapp 

MYAPP-W EB-1.conf/MYAPP-網絡2.conf/MYAPP-網絡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' 

任何幫助,非常感謝!

回答

10

追加這的myapp-web-*.conf到底會造成什麼分配調用試圖分配超過150mb的內存返回ENOMEM

limit rss 157286400 157286400 

的過程可能會崩潰,在這一點上,也可能不是。這取決於過程!

Here's a test for this in the Upstart Source

+0

嘿,謝謝你的回答。我不太熟悉所有這些,但如果我理解正確,我的(Ruby)應用程序會在超過150MB內存時嘗試分配內存,此時(定義:limit rss 157286400 157286400')會引發異常(在做了一些研究之後,我認爲這個例外會引發:Errno :: ENOMEM),並且通常會導致進程崩潰。雖然可能不在Rails框架中。我得看看這個。謝謝!我想我可以通過你的回答找出其他問題! – 2011-06-09 10:13:39

+1

你有沒有發現這將如何與Ruby/Rails的工作?我非常有興趣爲我們的服務拱門嘗試這一點。 – localshred 2011-06-22 17:03:57

+0

@jnewland Rails應用程序的任何進展? – Autodidact 2011-10-20 15:08:07

3

從Upstart文檔中,限制來自rlimit系統調用選項。 (http://upstart.ubuntu.com/cookbook/#limit

由於Linux 2.4+設置rss(Resident Set Size)不起作用。

在其他答案中已經提出的替代方法是作爲它設置虛擬內存地址空間大小限制。這會對設置「真實」內存限制產生非常不同的影響。從手冊頁

limit as <soft limit> <hard limit> 

爲摘錄的setrlimit:

RLIMIT_AS 以字節爲單位的進程的虛擬內存(地址空間)的最大尺寸。此限制會影響對brk(2),mmap(2)和mremap(2), 的調用,超過此限制後會失敗並顯示錯誤ENOMEM。此外,自動堆棧擴展將失敗(並且如果沒有通過sigaltstack(2)提供備用堆棧,則會生成一個SIGSEGV,以殺死進程。由於該值長,因此在32位長的 的計算機上,此限制最多爲2 GiB,或者此資源不受限制。