3

私はスレッドを使用してpthreadsいて、スレッドをX秒間スリープさせようとしています。

私はsleep()、(偽のミューテックスロックをX秒間待機する)、スレッドがウェイクアップするたびに時間をチェックして、実行する時間かどうかを確認し、最後にX秒間待機するのに忙しいことnanosleep()を試しました。pthread_cond_timedwait()pthread_yield()

問題は、これらの方法はすべて、結果を考慮すると正常に機能しますが、期待するパフォーマンス結果が得られないことです。パフォーマンスは、時間ではなくスループット(1秒あたりの応答数)で測定されます。

私の構成では、2つのシミュレートされた物理コア(Ubuntu Serverを実行しているVirtualBox)上で3つのソフトウェアスレッドを実行しています。3つのスレッドのうち1つをスリープ状態にすると、他の2つのスレッドには実行する専用の物理コアが1つあるため、パフォーマンスが向上することが期待されます。ただし、(すべてのアプローチで)まったく逆の動作が発生します。スリープ時間を長くすると、パフォーマンスが低下します。(スリープスレッドのワークロードは130〜300ミリ秒であることに注意してください。)

仮想化(ホストマシンには4つのコアがある)が原因でしょうか?私が使用しているメソッドが、使用しているアプローチと同じように動作するためpthread_yieldでしょうか?

どのようsleep()nanosleep()実装されていますか?彼らは信号を使用していますか?シグナルハンドラーを使用した実装はalarm()、より良いアプローチだと思いますか?電話するとどうなりますpthread_cond_wait()か?それはどのように実装されていますか?

chrtまた、スケジュールポリシーを変更するために使用しようとしましたが、運がありませんでした。

4

2 に答える 2

3

私は@Aaron Digullaに同意します。ヒットアンドトライアルと当て推量では、パフォーマンスの質問に対する答えは決して得られません。しかし、それ以上に、あなたが正しいことを測定しているかどうかはわかりません.少なくとも、定期的なスレッド間のスリープが長くなると、スループットが低下するというあなたの主張に基づいています. その論理に従って、スリープ期間を無限数 (基本的に測定期間よりも大きい) に設定すると、スループットはセットの中で最悪になるはずです。そうですか?

サーバーのスループットを測定することは、測定とクライアントのセットアップに多くの落とし穴があるため、扱いにくいビジネスになる可能性があることに注意してください。以下は、合成ベンチマークの数字に騙されやすい例です: http://www.teamquest.com/pdfs/whitepaper/load-test.pdf

パフォーマンス測定に興味がある場合は、その記事を読んでください。純金です。

于 2012-06-19T19:25:54.603 に答える
1
  1. プロファイラーでコードを実行して、どこで時間が費やされているかを確認します。私の経験では、これらの推測は 90% の確率で間違っています。

  2. alarm()役立つかもしれませんが、実際には何をするべきなsleep()ので、違いはあまり期待できません。

これを引き起こす可能性のあるいくつかのアイデアを次に示します。

  • キャッシュのフラッシュ。2 つのワーク スレッドがキャッシュを十分に使用している場合、新しいスレッドに切り替えると、非常にコストがかかるキャッシュ フラッシュが発生する可能性があります。ここでの考え方は、スリーパーがワーカー スレッドを長時間そのままにしておくと、ワーカー スレッドがより多くのキャッシュを埋めることができるということです。

  • 2 つのワーカー スレッドには、スリーパーが占有/ロックするリソースが必要です。

  • パフォーマンスをどの程度測定しましたか? 他の効果を測定した可能性があります (デスクトップ検索でコンピューターのインデックスを作成するなど)。

これを突き止めるには、目的の動作が表示され始めるまでコード関数を関数ごとに減らし、プロファイラーで実行して予期しないことを確認する必要があります。

于 2012-06-19T18:56:34.533 に答える