2016-04-14 44 views
2

我目前有一個Plone 4.3.8站點,編輯portlet會導致死鎖。解決Plone僵局問題的現代方法是什麼?

我正在嘗試找到解決此問題的工具,但大多數死鎖工具不起作用&我沒有從至少運行那些信息獲取良好信息(IMO)。

我已經試過:

  • z3c.deadlockdebugger =>不能得到一個堆棧跟蹤
  • ZopeHealthWatcher =>無法看到命令行(或網頁)
  • Products.LongRequestLogger結果=>可能是迄今爲止最好的,給了我一些日誌輸出 - 但它的堆棧跟蹤重點是重數代碼,但問題仍然發生時,重氮不在範圍內(針對127.0.0.1運行)
  • gdb attach - 剛剛降落我在C代碼
  • winpdb =>它不能以與gdb相同的方式附加到正在運行的進程(僅適用於以winpdb附件爲目的的進程啓動的進程)
  • Products.signalstack = = USR1信號只會關閉一個zope過程!

注意:z3c.deadlockdebugger(以及依賴於它的東西)需要檢出source code以刪除線程框依賴關係。

我的情況似乎與產品升級有關 - 可能是一個或兩個plone.app.contenttypes或plone.app.multilingual,一個空的網站沒有這個問題,但我顯然需要我的網站數據!

該怎麼辦?

編輯:

我相信Maurits的回答是最正確的,但它並沒有我的情況下工作。我最終做的是使用pdb來追蹤代碼掛起的點(在plone.app.debugtoolbar中,因爲它發生了)

+0

關於線程框依賴關係:它被長期棄用,但您也可以選擇將其包含在您的構建中,並將其添加到「eggs」部分。因爲它沒有在pypi上發佈,所以你還必須添加一個'find-links'('https://majid.info/python/threadframe/')和'allow-hosts'。 –

+0

@keul majid的網站[threadframe上的文章](https://majid.info/blog/threadframe-multithreaded-stack-frame-extraction-for-python/)說:「Python 2.5及更高版本包含一個函數sys._current_frames( )「所以我採取的建議 – Danimal

+0

是的,這是真的,但如果你不想修改源代碼,你仍然可以使用線程框架(儘管不建議使用和無用)。 –

回答

4

你說在使用Products.signalstack時使用USR1信號會關閉Zope。但是沒有特別的軟件包是必要的,所以我想知道添加signalstack是否會導致關閉Zope的副作用。

至少對我來說,在幾個星期前,這個工作在一個Plone 4.3.something現場罰款:

kill -USR1 $(cat var/zeoclient.pid) 
+1

好的 - 我已經刪除了signalstack(但保留了Products.LongRequestLogger) - 並且在我嘗試編輯portlet之前提供了堆棧跟蹤,但是很遺憾,*之後不能工作。我很困惑,爲什麼?我在開發過程中發現了這個問題,所以我正在調試一個獨立的實例,而不是ZEO客戶端 - 這應該沒關係? – Danimal

+0

事實上,'Products.singalstack'已於[2010年整合到Zope 2.12.5](https://github.com/zopefoundation/Zope/commit/16796274463f21327e1b7bb3831b39eb671460af)於2010年。 –

2

雖然@maurits答案是正確的(和最簡單的)有時我看到的問題由kill命令產生的回溯:有時可在事件日誌中找到,有時在shell中找到。

我更喜歡將構建與haufe.requestmonitoring集成,並配置monitor long running requests feature。 您將在事件日誌中看到死鎖的回溯,並激活一個工具來監測Plone的低性能。

+0

謝謝 - 但這對我來說也不適用 - 我在任一位置都看不到回溯 – Danimal

+0

如果您沒有看到回溯,您可能未配置我給你的鏈接中描述的長時間運行的請求功能 –

+0

我確實這樣做了,但是@ maurits方法沒有做到這一點,爲我生成一個堆棧跟蹤。不用擔心 - pdb最終讓我到那裏。謝謝! – Danimal

相關問題