2016-04-14 9 views
2

私は現在、Plone 4.3.8サイトを持っており、ポートレットを編集するとデッドロックが発生します。Ploneデッドロックの問題を解決する現代的な方法は何ですか?

私はこれを修正するためのツールを見つけようとしていますが、デッドロックツールの多くは機能しません。&少なくとも実行しているものからは良い情報(IMO)が得られません。

私が試してみた:

  • z3c.deadlockdebugger =>スタックトレースを取得することはできません
  • ZopeHealthWatcher =>
  • Products.LongRequestLoggerコマンドライン(またはWebページ)の結果を見ることができません=>おそらく最高のは、これまでのところ、私にいくつかのログ出力を提供します - しかし、トレースがジアゾコードに焦点を当てスタックだが、ジアゾがスコープ内にないときに問題がまだ(127.0.0.1に対して実行されている)
  • GDBが添付発生 - ちょうど上陸しました私のCコードで
  • winpdb => gdbと同じ方法で実行中のプロセスにアタッチすることはできません(winpdbによってアタッチされるようになったプロセスのみ)
  • Products.signalstack(OR Products.signalstacklogger)=> USR1シグナルは、ゾーププロセス!

注:z3c.deadlockdebugger(およびそれに依存するもの)は、source codeをチェックして、スレッドフレームの依存関係を削除する必要があります。

私の状況は、製品のアップグレード(おそらくplone.app.contenttypesまたはplone.app.multilingualのいずれかまたは両方)にリンクされているようですが、空のサイトにはこの問題はありませんが、 !

私はこれを進めるために何をすべきか?

EDIT:

私はマウリッツが最も正しいものであることを答えると信じて、それは私の場合には動作しませんでした。私がやったことは、pdbを使って、コードがぶら下がっていたポイントを追跡することでした(plone.app.debugtoolbarで起こります)

+0

:それはlongly非推奨ですが、あなたはまた、 'eggs'セクションに追加あなたのビルドアウトでそれを含めるように選択することができます。 pypiには公開されていないので、 'find-links'(' https:// majid.info/python/threadframe/')と' allow-hosts'も追加する必要があります。 –

+0

@keul majidのサイト[threadframeに関する記事](https://majid.info/blog/threadframe-multithreaded-stack-frame-ext-recovery-for-python/)によれば、「Python 2.5以降にはsys._current_frames関数が含まれています)」と言っているので、そのアドバイスを受けています – Danimal

+0

はい、本当ですが、ソースコードを変更したくない場合でも、スレッドフレームを使用することはできます(廃止予定と無用ですが)。 –

答えて

4

USR1シグナルを使用すると、Products.signalstackを使用するときにZopeがシャットダウンすると言います。しかし特別なパッケージは必要ありませんので、signalstackを追加することでZopeをシャットダウンするという副作用があるのだろうかと思います。

は、少なくとも私にとっては、数週間前に、これはPloneの4.3.somethingサイトにうまく働いた:

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

Ok - シグナルスタックを削除しましたが(Products.LongRequestLoggerを保持しています)、ポートレットを編集しようとする前にスタックトレースを渡しても動作しますが、残念ながら*後で動作しません。なぜ私は混乱しているのですか?私はこれを開発中に見つけたので、私はZEOクライアントではなくスタンドアロンのインスタンスをデバッグしています - それは問題ではないでしょうか? – Danimal

+0

確かに 'Products.singalstack'は2010年に[Zope 2.12.5に統合されました](https://github.com/zopefoundation/Zope/commit/16796274463f21327e1b7bb3831b39eb671460af)でした。 –

2

を@maurits答えは右である(そして、最も単純なもの)が、時々私は見て問題がありましたkillコマンドのトレースバックがイベントログに記録されることもあります。

私もmonitor long running requests featureを設定し、haufe.requestmonitoringと増築の統合を好みます。 イベントログにデッドロックされたトレースバックが表示され、Ploneの低性能を監視するためのツールも有効になります。 threadframe依存性について

+0

ありがとう - - いずれの場所にもトレースバックが見えません。 – Danimal

+0

トレースバックが表示されない場合は、リンクに記載されているように長時間実行されているリクエスト機能を設定していない可能性があります。 –

+0

これを行いましたが、@mauritsメソッドdidn '私のためにスタックトレースを生成する。心配しないでください - pdbは私を最後に連れてきました。ありがとう! – Danimal