rabbitmq キューから受信したメッセージの処理速度を上げる方法を探していました。私が見つけた唯一の方法は、受信と処理という同じことを行う複数のスレッドを作成することです。そして、これは私にいくらかの利益をもたらしました。4 つのスレッドを作成した後、速度は 4 倍になりました。私は 8 コア プロセッサを使用しているため、スレッド数を 8 に増やすことにしました。しかし、これではパフォーマンスが向上しません。YourKit は、CPU の 50% しか使用されていないことを示しています。私のアプリは軽量であると誰かが言うことができます。なぜこれが機能しないのですか?
5 に答える
特定のシステムで一部のアプリケーションの最大速度を制限するさまざまな問題があります。たとえば、メモリ帯域幅、アムダールの法則効果 (同期ブロックを含む非並列コードに必要な時間)、I/O 帯域幅、およびキャッシュ領域によって制限される可能性があります。
さらに改善が必要な場合は、測定とプロファイリングを行って、時間がどこに向かっているのかを見つけてから、それに取り組む必要があります。
CPU や IO の待機がボトルネックである場合は、独立したスレッドを追加すると大きな違いが生じる可能性があります。
L3 キャッシュ、ネットワーク アダプタ、カーネルなどの共有リソースがボトルネックになっている場合、CPU が問題ではないため、スレッドを追加しても役に立ちません。実際、オーバーヘッドを追加することでさらに悪化することがよくあります。
私のアプリは軽量です
この場合、CPU が問題になる可能性は低く、2 つ以上の CPU で速度が向上していることがわかります。おそらく、RabbitMQ が使用する CPU を高速化しています。理想的には、より効率的である必要があり、これはあまり役に立たないはずです。私見ですが、より効率的なメッセージング ソリューションは、CPU のボトルネックにならないため、複数の CPU を使用してもあまり効果がありません。
あなたのアプリケーションは直線的なスピードアップをしていないため、スケーラビリティが十分ではありません。
スレッドの数を増やし続けるには、処理されるデータがそれに応じて増加していることを確認する必要があります。固定量のデータの場合、スレッド (および/またはコア) の数を増やすと、スレッドを作成するオーバーヘッドがスレッドの計算時間を上回るため、ある時点で利益が減少します。
次のリンクを参照してください。
グスタフソンの法則は、アームダルの法則に対する優れた対比であるため、その記事を理解することを強くお勧めします。