0

私のプログラムはICAPServer(httpserverと同様)です。主な仕事は、クライアントからデータを受信し、そのデータをDBに保存することです。

2つの主要なステップと2つのスレッドがあります。

  1. ICAPServerはクライアントからデータを受信し、データをキューに入れます(50kb <1ms)。
  2. 別のスレッドがキューからデータをポップし、それらをDB SOに書き込みます。2番目のステップが遅すぎる場合、キューはそれらのデータでメモリをいっぱいにします。

誰かが何か提案があるかどうか疑問に思います...

4

3 に答える 3

2

確かに言うのは難しいですが、おそらくスレッドの代わりに2つのプロセスを使用すると、この状況で役立つでしょう。Pythonにはグローバルインタープリターロック(GIL)があるため、いつでも1つのスレッドのみがPython命令を実行できるようにする効果があります。

プロセスを中心にシステムを設計することには、次の利点があります。

  • 特にマルチプロセッサマシンでの同時実行性の向上
  • おそらく複数のキューコンシューマー/DBライタープロセスを生成して作業を分散できるため、スループットが向上します。ただし、これがボトルネックであり、DBに書き込むプロセスではなく、実際にDBである場合、この影響は最小限である可能性があります。
于 2009-07-12T15:22:35.670 に答える
0

注:最適化を行う前に、適切な測定とプロファイリングを行うことが非常に重要です。

そうは言っても、2番目のステップの遅い部分はデータベース通信だと思います。SQLステートメントとその実行プランの分析を試みることができます。次にそれを最適化します(これはSQLAlchemyの機能の1つです)。それでも遅すぎる場合は、データベースの最適化について確認してください。

もちろん、ボトルネックがまったく別の場所にある可能性もあります。この場合でも、Cコード、専用ネットワーク、またはより多くのスレッドを使用して最適化する機会があります。これは、まったく異なる種類の最適化の3つの可能な例を示すためです。

もう1つのポイント:I / O操作は通常GILを解放するため、別のリーダースレッドを追加するだけでパフォーマンスを向上させることもできます。これは、はるかに安価なソリューションになると思います。

于 2009-07-12T18:16:55.210 に答える
0

キュー内のデータ量に上限を設定しますか?

于 2009-07-12T14:59:42.690 に答える