2012-08-28 113 views
30

我們有一個自定義的安裝程序,其中有幾個守護程序(web應用程序+後臺任務)正在運行。我正在研究如何使用服務來幫助我們監控這些守護進程,並在資源消耗超過一定水平時重新啓動它們。使用supervisord優於monit的優勢

我會很感激任何有關何時比其他人更好的見解。正如我所瞭解的,當supervisord啓動一個子進程時,monit將啓動一個新進程。這種方法的優點和缺點是什麼?

我也將用暴發戶監視monit或supervisord本身。 webapp部署將使用capistrano完成。

謝謝

回答

28

如果你想另外監視資源,你應該解決monit。除了僅檢查進程是否在運行(可用性)之外,monit還可以對資源使用情況(性能,容量使用情況),負載級別甚至基本安全檢查(bianry文件的md5sum,配置文件等)進行一些檢查。它有一個很容易理解的基於規則的配置。還有很多隨時可用的配置:http://mmonit.com/wiki/Monit/ConfigurationExamples

Monit需要進程來創建PID文件,這可能是一個缺陷,因爲如果一個進程不創建pid文件,你必須創建一些包裝。請參閱http://mmonit.com/wiki/Monit/FAQ#pidfile

另一方面,Supervisord更多地綁定到一個進程,它自己產生它。它不能將任何基於資源的檢查視爲monit。它有一個很好的CLI servicectl和一個Web GUI。

+1

創建這樣的包裝並不是一個真正的問題 - 如果您正在運行監控軟件,那麼通常您可以對文件系統進行一些控制。只需要創建一個簡單的腳本。 +1爲了很好的解釋。 –

+3

@xavier不同意,包裝腳本是SPOF的一部分,並不是每一個deamon都可以被確定性包裝,想到一些java的東西,例如 – Darek

+2

@Dārayavahuštdi,你有一個有效的點,但是用supervisord則是另一種方式:守護神,而supervisord需要一切留在前臺。儘管如此,爲monit寫封裝看起來更直截了當。 http://supervisord.org/subprocess.html#nondaemonizing-of-subprocesses http://www.mmonit.com/wiki/Monit/FAQ#pidfile – Amir

29

我沒有使用monit,但是supervisord有一些明顯的缺陷。

  1. 計劃應在前臺

這意味着你不能只執行/etc/init.d/apache2開始運行。大多數情況下,您只需編寫一行內容即可。 「源/ etc/apache2/envvars & & exec/usr/sbin/apache2 -DFOREGROUND」但有時您需要自己的包裝腳本。包裝腳本的問題是,你最終有兩個過程,一個父母和一個孩子。請參閱下一個缺陷......

  • supervisord不管理子進程
  • 如果你的程序啓動子進程,supervisord不會檢測這一點。如果父進程死亡(或者使用supervisorctl重啓),子進程將繼續運行,但會被init進程「採納」並保持運行。這可能會阻止您的程序未來的調用運行或消耗額外的資源。最近的配置選項stopasgroup和killasgroup應該可以解決這個問題,但對我來說並不適用。

  • supervisord沒有依賴關係管理 - 見#122
  • 我最近與qlproxy設置魷魚。 qlproxyd需要先啓動,否則squid可能會失敗。即使這兩個節目都是用supervisord管理的,也無法確保這一點。我需要爲魷魚寫一個啓動腳本,讓它等待qlproxyd進程。添加開始腳本導致缺陷描述的孤立進程問題2

  • supervisord不允許你控制startretries之間的延遲
  • 有時,當一個進程失敗開始(或崩潰),這是因爲它可能無法訪問另一個資源,可能是由於網絡抖動。 Supervisor可以設置爲多次重新啓動該進程。在重新啓動之間,進程將進入「BACKOFF」狀態,但沒有文檔或控制回退的持續時間。

    在其辯護主管確實滿足我們80%的時間需要。配置是明智的,文件相當不錯。

    +2

    好的答案。所以,你基本上喜歡supervisord,但它並不總是每個工作的正確工具。 –

    +0

    我喜歡你的答案,因爲你絕對顯示你的經驗,並試圖設置它來滿足你的需求(這可能與我的相同)。 –