2011-02-23 62 views
1

根據請求,我們正在使用大量內存的單個apache進程出現問題,並且從不將它釋放回主系統。由於這些請求可能隨時發生,因此隨着時間的推移,Web服務器被推送到交換中,即使對SSH也無法響應。更糟糕的是,在請求完成後,Python無法將內存釋放回野生環境,導致數個500mb-1gb的Apache進程處於閒置狀態。在mod_python中殺死單個Apache進程

我們每秒推送很少的請求,但每個請求都有可能非常大。

我想要做的是有一種方法來殺死一個單獨的apache進程的孩子,如果它的駐留內存超過了一定的閾值,完成服務請求。我嘗試了幾種在mod_python中實際執行此操作的方法,但似乎任何形式的系統退出都會導致響應未完成到客戶端。

在優化所有進程(我們真正想要避免的)時,除非發生這種情況,否則無論如何要告訴Apache在完成服務請求後任意地終止進程?所有想法都歡迎。

作爲一個額外的警告,由於系統的傳統特性,我們無法升級到更高版本的Python,所以我們無法利用改進的2.5內存性能。同樣,我們堅持使用我們當前的操作系統。

版本: 系統:紅帽企業4

的Apache:2.0.55

的Python:2.3.5

+0

爲什麼要移動到一些不死的東西,比如mod_wsgi而不是一個選項? – 2011-02-23 19:36:30

+0

時間限制主要。最終這就是計劃,但是我們使用的框架需要一些真正的工作來遷移。我們希望黑客能夠在這個版本中滿足要求,並在接下來的版本中換出mod_python。 – Andrew 2011-02-23 19:55:17

回答

0

我會說,即使有可能,這將是一個巨大的hack(和不穩定) - 在這種情況下,你應該建立一個外部於apache的進程,當超出內存/時間預定義的限制時,監督正在運行的進程並殺死一個單獨的apache。

這樣的腳本可以持續運行,主循環每隔幾秒執行一次檢查,甚至可以放在crontab中以便每分鐘運行一次。

我看不出有任何理由嘗試從服務過程本身。

+0

我已經爲進程失控的進程編寫了一個收割者守護進程,但是我希望找到一個解決方案,讓這些長時間運行的進程之一有機會完成,然後優雅地退出。 – Andrew 2011-02-24 15:28:00

+0

@Andrew我認爲它是「仍然在瀏覽器中打開時運行」。這接近於「失去控制的流程」。你可以分享這個守護進程嗎?我很感興趣。 Pastebin可能?謝謝。 – erm3nda 2015-09-19 03:15:13