Selenium WebDriver を使用して並列化された入れ子になったループの Web ストレス テストを実行すると、デッド インスタンスの奇妙さがいくつか見られます。単純な例として、それぞれ 100 インプレッションで 300 の一意のページにヒットしたとします。
を使用して 4 ~ 8 個の WebDriver インスタンスを「正常に」取得して、ThreadLocal<FirefoxWebDriver>
タスク スレッドごとにそれらを分離し、ParallelOptions インスタンスで MaxDegreeOfParallelism を使用してスレッドを制限しています。外側のループ (ページのコレクション) のみを分割して並列化し、各パーティションの「長時間実行タスク」メソッドの先頭にあるコンテナーをチェック.IsValueCreated
しています。ThreadLocal<>
後でクリーンアップを容易にするために、スレッド ID をキーとする ConcurrentDictionary に新しいインスタンスをそれぞれ追加します。
私が使用する並列化または分割戦略に関係なく、WebDriver インスタンスは次のいずれかを実行することがあります。
- 起動するが、URL を表示したり、インプレッションを実行したりしない
- ローンチし、インプレッションを何回でも実行してから、ある時点でアイドル状態にします
これらのいずれかが発生すると、並列ループは最終的にスレッドが何もしていないことに気づき、新しいパーティションを生成します。nが許容されるスレッドの数である場合、n 個の生産的なスレッドは時間の約 50 ~ 60% しか持たないという結果になります。
クリーンアップは最後でも問題なく機能します。2n 以上のブラウザーが開いている可能性がありますが、生産的なブラウザーも非生産的なブラウザーも同様にクリーンアップされます。
これらの役に立たない WebDriver インスタンスを監視し、a) それらをすぐに清掃し、さらに b) 現在のように数分間遅れる代わりに、並列ループを取得してタスク セグメントをすぐに置き換える方法はありますか?