2012-03-20 50 views
1

我有一個自定義日誌記錄進程,它正在從STDIN中讀取數據,並通過TCP將數據發送到劃線日誌記錄服務器。 STDIN是在我的情況下,附加到Apache的訪問日誌在httpd.conf的httpd 2.2這樣的: 的CustomLog「|在/ usr/local/bin目錄/ serelog」默認FreeBSD 9.0下的進程掛在不可中斷的睡眠中,顯然沒有系統調用(空wchan)

我serelog過程中有時會進入睡眠不間斷下FreeBSD 9.0並不會從它返回。儘管它在其他操作系統下仍然可靠運行,包括FreeBSD 8,Linux 2.6和Linux 3.1。

我怎樣才能找出什麼可能是不間斷睡眠的原因?

整體結構是這樣的: 的httpd - [PIPE] - > serelog - [TCP的連接] - >劃

到現在爲止我做了如下分析:

  • 使用ps:stat是「D」而wchan是「 - 」。所以顯然沒有系統調用,這對我來說太不合理了,因爲這個過程在不間斷的睡眠中,應該在內核的土地上。
  • 由於進程處於狀態「D」,進程不會按預期反應kill -9。
  • 將桁架從外殼附加到外部:只要連接桁架,serelog就可以平穩運行。 從serelog分離桁架後不久(秒),serelog進入「D」狀態。
  • 當後已進入安裝桁架serelog「d」的狀態,桁架打印什麼
  • 在「d」的狀態,lsof的表明,進入管線已滿。這被執行,如在「D」狀態中,該過程「睡眠」 並且不能再讀取。傳出的TCP連接是空的。
  • 如果我殺死了「周圍的」Apache httpd服務器,serelog進程最終會在(例如)40分鐘後終止。
  • 檢查其他人在論壇中報告的不間斷問題是不成功的:在我的設置中沒有NFS。 因爲它是一臺服務器,所以用戶不需要與CD驅動器或可插拔硬件進行交互。

因此,我現在堅持一個不間斷的進程,顯然不是系統調用, 和跟蹤時可靠工作。唯一的好處是,當我通過JMeter loadtest(JMeter中的5個線程)發送大量HTTP請求時,我能夠在幾秒或幾分鐘內重現行爲。

有關調試,內核參數調整的任何提示,我們讚賞。

問候

+0

什麼是系統調用它掛起之前? – janm 2012-03-21 13:57:51

+0

我不知道系統調用。這正是重點。在發生問題後連接時,桁架不會打印任何內容。在發生問題之前,在安裝桁架時,問題根本不會發生。並且ps顯示「 - 」爲wchan。 – 2012-03-21 14:19:23

+0

可能是內核錯誤或迴歸。你提交了PR嗎? – 2012-03-26 22:06:48

回答