2012-02-17 23 views
1

私は、リアルタイムモーショントラッキングとカメラの動きを制御する非常に大きなアプリケーションに取り組んでいます。そのタスクは次のとおり管理対象スレッドをフリーズする

  • (ネットワークカメラからのビデオストリームをデコードして、1280×720画素、コールバックを介して管理アプリケーションの追跡結果と同じ大きさの両方の画像バッファを供給するネイティブモジュールによって行わ)モーショントラッキング
  • から位置フィードバックデータを受信し、ライブ視覚化の
  • エンコーディング及び書き込みを含む画像データを表示/カメラへ
  • から20倍第二ならびにズームコマンドのパン/チルトのハードウェアに移動データを送信します画像とセッションのデータ
  • ビデオの自動後処理は別のプロセスで行われます

このアプリケーションは.NET 4.0を使用し、WPFユーザーインターフェイスを備えています。私たちは、このようなリアルタイムアプリケーションのために本当に多くである、1500msする500の間のために凍結し、管理スレッドに直面しなければならなかった最初から

を凍結

管理スレッド。

これらのハングが発生したときに私はスレッドを作成しましたが、そのタスクは常に100msのスリープを行うことだけです。私は睡眠が本当にどのくらいの時間を取ったかを計算し、カメラの動きが止まった時を正確に得ました。それは非常に確実に動作し、スレッドはすべて同時にハングアップします!すべての管理対象のスレッドが管理対象外のスレッドは問題なく動作している間凍結

管理されていないスレッドが

を凍結しないでください。アプリケーションの管理対象部分から独立して書かれたログによって確認します。

分析

私は多分、この動作を引き起こす可能性がある現象を把握しようとした:

  • 我々は、これらの問題が発生したとき、マシン全体が減速:Windowsは、非常にゆっくりと応答している(例えばディレクトリ一覧Windowsエクスプローラとアプリケーションの両方で30分間ハングアップする、またはアプリケーションを起動すると時間がかかります)
  • 同時に数千ものファイルを読み書きします(追跡および後処理アプリケーション)。これはウィンドウを超過するか
  • GUIの応答は非常に遅くなります
  • このアプリケーションでは、約1.3GBの仮想メモリ(Process.VirtualMemory64による)/ 500MBのワーキングセットメモリ(Process.WorkingSet64)を使用します。そのうちのいくつかはハードディスクにスワップされていますか?もちろん(どのようにそれが確認または解決することができる?)
  • 我々はWindowsが高速に再び応答しているプロセスを強制終了しますが、これに調査する方法に再び正常に

ヒントを応答するためにしばらくのWindowsを取る場合非常に高く評価されるだろう。どうもありがとうございました!

+0

スラッシングのようなもの:http://en.wikipedia.org/wiki/Thrashing_%28computer_science%29 FileMonとDiskMonを使用して、実際にディスクアクセスに何が起こっているのかを確認してください。 – Candide

+0

taskmgr.exe、[プロセス]タブを実行します。 View + Columnsを選択し、 "Page fault delta"にチェックを入れます。通常の次の結論は「ああ、もっとRAMが必要」です。 –

+0

@HansPassant: "Page fault delta"の下で70.000までの値を取得します。それは「スラッシング」を指していますか? (Btw:あなたはコメントの代わりにこの記事への新しい回答を作成できたかもしれません) – nepa

答えて

1

GCが動作している可能性がありますか? 偉大な記事を参照してください:http://samsaffron.com/archive/2011/10/28/in-managed-code-we-trust-our-recent-battles-with-the-net-garbage-collector

+0

ヒントをありがとう、私たちはそれを解決しました:多くのヒープオブジェクトを作成するいくつかのコードがありました。非常に多くのオブジェクトの作成を防ぎ、完全なパフォーマンスが必要なときにGCを収集して、GCを後で行うだけです( - > GCSettings.GCLatencyMode)。 – nepa

1

パフォーマンスの問題が発生しているので、プロセスダンプを取ることをお勧めします。いくつかの方法(SysInternalsからtaskmgr.exeまたはprocdump.exe)を実行できます。完全なメモリダンプを取る。

.dmpファイルを作成したら、windbg(またはVisual Studio 2010)で解析することができます。管理対象プロセスの場合は、sos.dll拡張をロードする必要があります。

あり良いwindbgのリソースの多くはそこにありますが、ここで私を助けているという一部です:

1)テスフェルナンデスvideo(ASP.NETプロセスが、技術が同じである)

は、

2)WinDbg cheatsheet

メモリ分析は、問題が発生している間、あなたのスタック(!clrstack)を得て、あなたに正確な犯人を伝えることができるようになります。

関連する問題