9

Solaris で Java と C++ を組み合わせたアプリケーションを使用しています。コードの Java の側面は、Web UI を実行し、通信しているデバイスの状態を確立します。C++ コードは、デバイスから返されるデータをリアルタイムで処理します。共有メモリは、デバイスの状態とコンテキスト情報を Java コードから C++ コードに渡すために使用されます。Java コードは、PostgreSQL データベースを使用してその状態を保持します。

かなり深刻なパフォーマンスのボトルネックに直面しており、現時点でスケーリングできる唯一の方法は、メモリと CPU の数を増やすことです。共有メモリの設計により、1 つの物理ボックスにこだわっています。


ここで本当に大きな打撃を受けたのは、C++ コードです。Web インターフェイスは、デバイスの設定にほとんど使用されていません。私たちが本当に苦労しているのは、一度構成されたデバイスが配信するデータ ボリュームを処理することです。

デバイスから返されるすべてのデータには、デバイス コンテキストを指す識別子が含まれているため、それを調べる必要があります。現在、Java/UI コードによって維持され、C++ コードによって参照される一連の共有メモリ オブジェクトがあり、それがボトルネックになっています。そのアーキテクチャのため、C++ データ処理を別のマシンに移すことはできません。デバイスのさまざまなサブセットをさまざまなマシンで処理できるようにスケールアウトできるようにする必要がありますが、その場合、そのコンテキスト ルックアップを実行する機能が失われます。これが私が解決しようとしている問題です。デバイスコンテキストを参照しながら、他のボックスへの時間データ処理。

デバイス自体が使用するプロトコルを制御することはできず、状況が変わる可能性はありません。


クラスターにマシンを追加してスケールアウトできるようにするには、これを回避する必要があることを認識しており、私はこれをどのように行うかを正確に検討している初期段階にあります。

現在、Java コードをスケールアウトする方法として Terracotta を検討していますが、それに合わせて C++ をスケールアウトする方法についてはまだ考えていません。

パフォーマンスのスケーリングだけでなく、高可用性も考慮する必要があります。アプリケーションはほぼ常に利用可能である必要があります。絶対に 100% ではなく、費用対効果が高くありませんが、マシンの停止を乗り切るための合理的な仕事を行う必要があります。

私に与えられた仕事を引き受けなければならないとしたら、あなたは何をしますか?

編集: @john channing から提供されたデータに基づいて、GigaSpaces と Gemstone の両方を調べています。Oracle Coherence と IBM ObjectGrid は Java のみのようです。

4

3 に答える 3

5

最初に行うことは、システムのモデルを構築してデータ フローをマッピングし、ボトルネックがどこにあるのかを正確に理解することです。システムをパイプラインとしてモデル化できる場合は、制約の理論 (ほとんどの文献はビジネス プロセスの最適化に関するものですが、ソフトウェアにも同様に適用されます) を使用して、パフォーマンスを継続的に改善し、ボトルネックを解消できるはずです。

次に、システムのパフォーマンスを正確に特徴付けるいくつかの厳密な経験的データを収集します。測定できないものは管理できないというのは決まり文句のようなものですが、多くの人が直感に基づいてソフトウェア システムを最適化しようとして失敗するのを見てきました。

次に、パレートの法則 (80/20 ルール)を使用して、最大の利益を生み出す少数のものを選択し、それらにのみ焦点を当てます。

Java アプリケーションを水平方向にスケーリングするために、私はOracle Coherenceを広範囲に使用しました。非常に高価な分散ハッシュテーブルとして却下する人もいますが、機能はそれよりもはるかに豊富で、たとえばC++ コードからキャッシュ内のデータに直接アクセスできます。

Java コードを水平方向にスケーリングするための他の代替手段は、Giga SpacesIBM Object Grid、またはGemstone Gemfireです。

C++ コードがステートレスであり、純粋に数値演算に使用されている場合は、使用しているすべての言語のバインディングを持つICE Gridを使用してプロセスを分散することを検討できます。

于 2008-09-09T09:00:54.337 に答える
1

横に拡大する必要があります。おそらく、メッセージ キューのようなものが、フロントエンドとクランチの間のバックエンドになる可能性があります。

于 2008-09-09T06:05:04.523 に答える
1

アンドリュー、(パイプラインなどとしてモデリングすることに加えて)、物事を測定することは重要です。コードに対してプロファイラーを実行し、ほとんどの時間が費やされている場所のメトリックを取得しましたか?

データベース コードについては、どのくらいの頻度で変更されますか? 現在、キャッシングを検討していますか?Dbを高速化するために、データのインデックスなどを見たと思いますか?

フロントエンドのトラフィックのレベルは? Web ページをキャッシュしていますか? (JMS タイプの API を使用してコンポーネント間の通信を行うと言うのはそれほど難しいことではありません。その後、Web ページ コンポーネントを 1 台 (または複数台) のマシンに配置し、統合コード (c++) を別のマシンに配置し、多くの JMS に適用できます。製品には通常、ネイティブ C++ api があります。つまり、ActiveMQ が思い浮かびますが、Web (JSP ?)、C++、データベース操作にどれくらいの時間が費やされているかを知ることは本当に役立ちます。

データベースはビジネス データを格納していますか、それとも Java と C++ の間でデータを渡すためにも使用されていますか? JNI ではなく共有メモリを使用していると思いますか? APP には現在どのレベルのマルチスレッドが存在しますか? コードは本質的に同期的か非同期的か?

Solaris コードと維持する必要のあるデバイスとの間に物理的な関係はありますか (つまり、すべてのデバイスが C++ コードに登録されているか、または指定できるか)。すなわち。フロントエンドに Web ロード バランサーを配置し、今日 2 台のマシンを配置する場合、事前に初期化されたボックスによってどのデバイスが管理されるかという関係はありますか?

HA の要件は何ですか? すなわち。情報を記載するだけですか?セッション データをクラスタリングすることにより、Web 層だけで HA を実行できますか?

DB は別のマシンで実行されていますか?

DBの大きさは?クエリを最適化しましたか。明示的な内部/外部結合を使用してみましたが、ネストされたサブクエリ (sometmes) に対して役立つ場合があります。(もう一度SQL統計を見てください)。

于 2008-09-09T12:29:07.923 に答える