NServiceBus サービスに使用する最適なスレッド数を見つけようとしています。2 つのクアッド コアを搭載したマシンで実行しています。キューのバックアップに問題がありました。100 スレッドから始めて 200 スレッドに増やしたところ、事態はさらに悪化しました。75 に下げ、次に 50 に下げたところ、さらに良くなりました。実行するスレッドの数を決定するために使用する必要がある CPU の数または経験則に基づく最適な数はありますか?
1 に答える
実行しているすべてのスレッドには、オーバーヘッドが付随しています。2 つのクアッド コアがある場合、一度に正確に 8 つのスレッドを実行できます。各スレッドはコアを消費します。
スレッドが 8 つを超えると、有用な作業が少なくなる可能性があります。これは、Windows が現在コアを消費していないスレッドの 1 つに何かを実行することを決定するたびに、実行中のスレッドの 1 つの状態を保存し、実行しようとしているスレッドの古い状態を復元する必要があるためです。次に、スレッドをそれに行かせます。膨大な数のスレッドがある場合、スレッドを切り替えるだけで何の役にも立たないことに多くの時間を費やすことになります。
IO を待ってブロックされているスレッドがたくさんある場合 (たとえば、ディスクへの書き込みを終了して取得できるようにするメッセージ)、コアよりも多くのスレッドを実行して、何か有用なことを実行できる可能性があります。これらのスレッドの多くは、他の何かが完了するのを待っています。これは複雑な問題であり、「使用するスレッドの数」に対する本当の答えはありません。経験則としては、すべてのコアにスレッドを用意し、より多くのスループットを達成したい場合は、それを少し試してみることをお勧めします。実際の条件下でテストすることが、スイート スポットを見つける唯一の現実的な方法です。メッセージを処理するために必要なスレッドは 1 つだけで、そのスレッドの半分の時間は、メッセージが着信するのを待ってブロックされていることに気付くかもしれません....
明らかに、私が説明したことでさえ単純化しすぎています。WindowsはOSyのことを行うためにコアにアクセスする必要があるため、8つのコアがあっても、Windowsスレッドが回転しているため、8つのスレッドすべてが常に実行されているとは限りません...その後、IOスレッドなどがあります....