3

Webサーバーが特定のクエリのAPIサーバーからデータを要求/受信するまでの時間を短縮したいと思います。

MySQLをボトルネックと想定して、APIサーバーデータベースをCassandraに更新しましたが、それでも完了時間は同じままです。他の何かが私が理解できなかったボトルネックであるかもしれません。

環境:

Number of Request Estimated per minute: 100
Database: MySQl / Cassandra
Hardware: EC2 Small
Server Used: Apache HTTP

現在の観察:

Cassandra Query Response Time: .03 Secs 
Time between request made and response received: 4 Secs

必須:

Time between request made and response received: 1 Secs

ボトムライン:この特定のケースでかかる完全な時間をどのように短縮できますか?

必要に応じて、詳細をお気軽にお問い合わせください。ありがとう

4

2 に答える 2

2

チャットからの要約:

  • 環境:
    • 小さなAmazonEC2インスタンス(1つの仮想CPU、1.7GBのRAM)で実行
    • WebサーバーはApacheです
    • 100個のワーカースレッド
    • PythonはPylonsを使用しています(これはWSGIを意味します)
    • EC2でクライアントをテストする
  • テスト:
    • 1.8kリクエスト、シングルスレッド
      • 不明なCPUコスト
      • カサンドラリクエスト時間:0.079秒(スプレッド0.048-> 0.759)
      • MySQLリクエスト時間:0.169秒(スプレッド0.047-> 1.52)
    • 10kリクエスト、複数のスレッド
      • CPUは90%で動作します
      • カサンドラリクエスト時間:2.285秒(スプレッド0.102-> 6.321)
      • MySQLリクエスト時間:7.879秒(スプレッド0.831-> 14.065)

観察:小さなEC2インスタンスでは、100スレッドは多分多すぎます。各スレッドは、何もしていない場合でも、メモリとリソースを占有するPythonプロセスを生成することに注意してください。スレッドを減らすと、次のことが減ります。

  • メモリの競合(およびメモリのページングによってパフォーマンスが低下する)
  • CPUバッファミス
  • CPUの競合
  • DB競合

推奨事項:CPUを最大限に活用するために必要な数のスレッドのみを実行することを目標にする必要があります(ただし、メモリーまたはその他のリソースを最大限に活用する場合は、スレッドの数を減らしてください)。より多くのスレッドを実行すると、オーバーヘッドが増加し、スループットが低下します。

観察:シングルスレッドモードでの最高のパフォーマンス時間は、リクエストごとに0.05CPU秒の推定ベストケースコストを提供します。ある程度のレイテンシー(IOを待機)を想定すると、CPUコストはかなり低くなる可能性があります)。CPUがアーキテクチャのボトルネックであると仮定すると、スレッドを調整するだけで、EC2サーバーで1秒間に20〜40のトランザクションを実行できる可能性があります。

推奨事項:標準のPythonプロファイラーを使用して、システムのプロファイリングを行います(最適な数のスレッドで実行している場合)。プロファイラーは、CPUが最も時間を費やしている場所を示します。待機(つまり、DBが戻るのを待つ、ディスクがデータを読み書きするのを待つ)とコードの固有のCPUコストを区別します。

  • 固有のCPUコストが高い場合:コストを削減できますか?これがコードに含まれていない場合、別のことを行うことでそのコードパスを回避できますか?キャッシング?別のライブラリを使用していますか?
  • レイテンシーがある場合:シングルスレッドの結果を考えると、CPUが別のリクエストを処理できると仮定すると、レイテンシーは必ずしも悪いわけではありません。実際、必要なスレッドの数については、次のように計算することで大まかなアイデアを得ることができます:(合計時間/(合計時間-待機時間))ただし、Pythonが待機している間、DB(たとえば)がそうではないことを確認してください。結果を返すために一生懸命働いています。

その他の考え:テストハーネスがHTTPリクエストを配信する方法を検討してください-可能な限り高速に配信しますか(たとえば、10k TCPソケットを同時に開こうとしますか?)そうであれば、結果が歪む可能性があります。別のロードパターンとツールを使用する方がよい場合があります。

于 2012-07-24T08:38:07.177 に答える
0

Cassandraは、高負荷でより高速に動作し、世界の異なる側にある2つのシステムで3〜4秒の平均時間で問題ありません。

于 2012-07-24T06:23:57.317 に答える