2010-07-05 200 views
2

我想知道檢查進程健康狀況的方法是什麼。考慮到在一個系統 10000進程正在運行,你必須確保萬一任何這些進程停止,我們需要使進程升級。應用程序健康檢查

+0

我的問題是關於使這個過程具有可擴展性,並且更多地瞭解不同的方法如何實現。 – Arpit 2010-07-07 06:09:32

回答

2

使用進程ID(PID)並查詢進程是否仍然存在或者週期性死機;如果它已經死了,然後重新啓動它。

但是,如果您有10000個進程,您可能會首先觸發操作系統的進程限制。我建議重新設計你的程序,這樣你就不需要那麼多的程序了。

+0

Ryan,你是對的,我們可以做進程ID的輪詢,但可以說我有PID從1到1000000(假設我們已經允許創建那麼多進程),在這種情況下,如果PID發生了什麼情況可以說2,並在我們的情況下輪詢在PID 3,那麼它將花費3到1000000 PID,然後到PID 2檢測到PID 2不存在。因此性能下降更多。 如果我這樣做,而不是輪詢,如果可以註冊應用程序關閉時會出現的一些回調。這個怎麼樣? (基於事件) 此解決方案在可擴展性方面會有什麼問題嗎? – Arpit 2010-07-07 06:13:46

+0

回調如何比投票更快?它們都是O(n),所以除非用於回調的原語比用於PID輪詢的原語快得多,否則不會有太大的區別。 – 2010-07-07 16:44:52

1

停止重新產卵的進程通常由具有特定的啓動程序來處理exec()程序並等待SIGCHILD指示子進程結束。

對於啓動時應用程序(服務器等),守護程序如upstart可以爲您自動執行此操作。

0

有一個實用工具叫做monit它可以做你正在尋找的東西。但是對於Linux中的某些重要進程,所有10000個進程都很重要!

1

雖然其他人指出應用程序已經存在(你真的應該使用,除非你有明確的理由不會),我會拋出一個隨機的想法來定製解決方案。

如果你控制所有的N進程,那麼使它們都有一個共享內存區域N比特大(因此,10000進程~1KB,不壞)。當啓動每個進程時,給它一個編號爲i的數字,範圍從0到N.每個T秒有每個進程會將共享內存中的位i設置爲1.監控進程可以檢查所有N位是否爲1,每k*T秒,重置他們在這個過程中都是0。

這仍然是O(n),你不會迴避,但是基元都非常快,並且應該很好地擴展到操作系統線程限制。

獲得i的另一種方法就是使用PID,但共享內存必須更大(儘管如此,可能仍然是OK;例如,Linux PID範圍很小)。

+0

在共享內存中設置一點聲音聽起來不錯,但這不適用於所有舊式Linux服務的情況。 – Arpit 2010-08-06 17:21:20