問題タブ [throughput]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
optimization - Boost ASIOリアクターがシングルコアに制約されるのを回避するにはどうすればよいですか?
TL; DR:リアクターのスループットが制限されている可能性はありますか?どうすればわかりますか?io_serviceの実装は(スレッド全体で)どれほど高価でスケーラブルですか?
大量のRAMと高速SSDRAIDを備えたハイパースレッドデュアルクアッドコアXeonマシンで実行されている、超並列アプリケーションがあります。これは、boost::asioを使用して開発されています。
このアプリケーションは、約1,000台の他のマシンからの接続を受け入れ、データを読み取り、単純なプロトコルをデコードし、mmap()を使用してマップされたファイルにデータをシャッフルします。また、アプリケーションはmadvise(WILLNEED)を使用して「将来の」mmapページをプリフェッチするため、ページフォールトでブロックされる可能性は低いですが、念のため、最大300スレッドを生成しようとしました。
これは、Linuxカーネル2.6.32-27-generic(Ubuntu Server x64 LTS 10.04)で実行されています。Gccバージョンは4.4.3で、boost :: asioバージョンは1.40です(どちらもストックUbuntu LTSです)。
vmstat、iostat、topを実行すると、ディスクスループット(TPSとデータボリュームの両方)が1桁の%であることがわかります。同様に、ディスクキューの長さは常にスレッドの数よりもはるかに短いため、I/Oバウンドではないと思います。また、RSSは上昇しますが、数ギグで安定し(予想どおり)、vmstatはページングを表示しないため、メモリに縛られていないと思います。CPUは、ユーザーが0〜1%、システムが6〜7%で一定で、残りはアイドル状態です。ヒント!1つの完全な「コア」(ハイパースレッディングを思い出してください)は、CPUの6.25%です。
64kBを超える未処理の場合、クライアントマシンはTCP送信をブロックし、その事実を報告するため、システムが遅れていることはわかっています。それらはすべてこの事実を報告し続けており、システムへのスループットは、望ましい、意図された、理論的に可能なものよりはるかに少ないです。
私の推測では、私はある種の錠前で争っています。アプリケーションレベルのロックを使用して、変更される可能性のあるルックアップテーブルを保護しているため、これを256のトップレベルのロック/テーブルに分割して、その依存関係を解消しました。しかし、それはまったく役に立たなかったようです。
すべてのスレッドは、1つのグローバルio_serviceインスタンスを通過します。アプリケーションでstraceを実行すると、ほとんどの時間がfutex呼び出しの処理に費やされていることがわかります。これは、イベントベースのio_serviceリアクターの実装に関係していると思います。
リアクターのスループットが制限されている可能性はありますか?どうすればわかりますか?io_serviceの実装は(スレッド全体で)どれほど高価でスケーラブルですか?
編集:私は最初にこの他のスレッドを見つけませんでした。それは私のものと重ならないタグのセットを使用していたからです:-/私の問題はboost::asioreactorの実装で使用される過度のロックである可能性があります。C ++ソケットサーバー-CPUを飽和させることができないを参照してください 。ただし、疑問は残ります。これをどのように証明できますか?そして、どうすればそれを修正できますか?
java - ねじれたスループット制限の減少
単一のマシンでネットワークのシミュレーションを可能にするプログラムを開発しています。このために、非同期 I/O に Twisted を使用しています。「接続」ごとにスレッドを使用するのは少し面倒かもしれません。(NIO を使用して Java で同様のプログラムを実装したこともあります)。ただし、エミュレートされたネットワークのサイズを拡大すると、Twisted のスループットが低下します。これを Java の実装と比較すると、ネットワーク サイズが同じ場合、Java のスループットは増加し続けています。(成長率は鈍化しますが、それでも増加しています)。例 (Python 100 ノード = 58MB 合計スループット、300 ノード = 45MB、Java 100 ノード = 24 MB、300 ノード = 56MB)。
なぜこれが起こっているのかについて何か提案があるかどうか疑問に思っていますか?
私が考えることができる唯一の理由は、Java の場合、それぞれの「ピア」が独自のスレッド (ピア接続を監視する独自のセレクターを含む) で実行されていることです。Python バージョンでは、すべてがリアクター (およびその後の 1 つのセレクター) に登録されます。Python がスケールアップすると、1 つのセレクターはそれほど速く応答できなくなります。ただし、これは単なる推測に過ぎません。具体的な情報があれば、それは評価されるでしょう。
編集: Jean-Paul Calderone の提案に従っていくつかのテストを実行しました。結果はimgurに投稿されています。次の平均スループットがテストで報告されたことに疑問を持っているかもしれません。(プロファイリングは cProfile で行われ、テストは 60 秒間実行されました)
Epoll Reactor: 100 ピア: 20.34 MB、200 ピア: 18.84 MB、300 ピア: 17.4 MB
リアクターの選択: 100 ピア: 18.86 MB、200 ピア: 19.08 MB、300 ピア: 16.732 MB
報告されたスループットで上下するように見えたいくつかのことは、main.py:48(send) への呼び出しでしたが、データが送信されている場所であるため、この相関はそれほど驚くべきことではありません。
どちらのリアクターでも、スループットが低下するとソケットの送信関数に費やされる時間が増加し、スループットが低下すると送信関数の呼び出し回数が減少しました。(つまり、ソケットでの送信により多くの時間が費やされ、ソケットで送信するための呼び出しが少なくなりました。)たとえば、413600 呼び出しの 100 ピアでの epoll {'_socket.socket' オブジェクトのメソッド 'send'} で 2.5 秒、5.5 秒354300 コールの 300 ピアでの epoll の場合は 1 秒。
元の質問に答えようとすると、このデータはセレクターが制限要因であることを示しているように見えますか? セレクターで費やされる時間は、ピアの数が増えるにつれて減少するようです (セレクターがすべてを遅くしている場合、内部で費やされる時間が増えるとは思わないでしょうか?) 送信されるデータの量を遅くしている可能性のあるものは他にありますか? ? (データの送信は、reactor.calllater に何度も登録されているピアごとに 1 つの関数にすぎません。それが main.py:49 (送信) です)
android - androidbluetoothのスループット動作
スループットを確認するために、Bluetoothチャットの例を変更しました。
UIに送信ボタンを用意しました。これは事前定義された番号を送信します。サーバーソケットへのバイト数と確認応答を待機します
ServerSocketは文字列を待機し、データを取得すると、確認応答を送信して応答します。
ここで、この接続のスループットは次のように計算しました。
データ送信の開始時刻を記録します。
確認応答を受信すると、終了時刻を記録します。
したがって、スループットは(データ送信サイズ+ ack受信サイズ)/所要時間になります。
結果は次のとおりです。
dataSent(KB)-------------------スループット(キロビット/秒)
アプリケーションから取得したデータの一部によると、1KBや5KBのような低データの場合、スループットは低くなります。40KB程度まで増加しますが、50KB程度になると減少し始めます。受信側でガベージコレクションが発生していることがわかります。これにより、遅延が増加します。
これが正しい振る舞いであるかどうか知りたいです。1KBや5KBのスループットのようにデータが少ないと、スループットが向上するのはなぜですか。遅延を増やす可能性があると私が考えることができる事実は何ですか。これで、送信者が受信者から確認応答を受信したときにスループットが計算されます(完全なラウンドトリップ計算)。データを送信し、すべてを受信した後、受信機でスループットを計算するように、1回のトリップにすることはできますか?私はこれを試しましたが、2つの電話にミリ秒の違いがあり、間違った結果が出ることがありました。正しい振る舞いを理解するのを手伝ってください。
java - 実行時にネットワークスループットを測定する方法
実行時にネットワークスループットを最適に測定する方法を考えています。私はクライアント/サーバーアプリケーションを書いています(両方ともJavaで)。サーバーは、(圧縮されたメディアデータの)メッセージをソケットを介してクライアントに定期的に送信します。サーバーが使用する圧縮レベルをネットワーク品質に合わせて調整したいと思います。
そこで、大量のデータ(たとえば、500kb)がクライアントに完全に到達するまでにかかる時間を測定したいと思います。これには、その間のすべての遅延も含まれます。Iperfのようなツールは、独自のトラフィックを作成して測定を行うため、オプションではないようです。
私が思いついた最善のアイデアは、クライアントとサーバーのクロックの違いを何らかの方法で判断し、サーバーが各メッセージにタイムスタンプを送信するようにしてから、このタイムスタンプとクライアントが受信した時間の違いをサーバーに報告することです。メッセージ。サーバーは、メッセージがクライアントに到達するまでにかかった時間を判別できます。
これを行う簡単な方法はありますか?このためのライブラリはありますか?
sip - 時間単位あたりの通話を測定するSIPの方法
テストのために、サーバーに多数のSIPリクエストを送信する必要があります。私が見つけた解決策の1つはSIPpです。ここで、クライアントが単位時間あたりに送信できるSIP要求の数を測定したいと思います。SIPpはコールレートを設定する可能性を提供しますが、物理的な制限(クライアントCPU、ネットワークカードなど)もあることを私は知っています。それが私が最初にテストしたいものです。この質問は、1つのクライアントから単位時間あたりに送信されるパケット数を測定する方法に拡張できると思います。1秒間に送信されたSIPINVITEパケットの数を(時間列を使用して)カウントすることでWiresharkを使用することを考えましたが、この方法の精度がわかりません。
soap - SOAPデザインパターンについて
クライアントにSOAPインターフェースを提供します。SOAP のスループットは 1 秒あたり約 1000 リクエストであり、1 つまたは 2 つのクライアントしかありません。ここで、2 つのオプションがあります。
クライアントは同時に多くのリクエストを送信する可能性があるため、これらの同時リクエストを処理するために多くのスレッドを提供する必要があります。
これらの接続は長い接続でなければならないため、クライアントに少数の接続を維持するように要求できますか?
オプション 1 を選択した場合、接続が短いためにパフォーマンスが低下するため、より多くのスレッドを提供する必要があります。また、これらの同時スレッド (JDBC 接続など) にはより多くのリソースが必要です。それは悪いと思います。
ですから、選択肢 2 を選びたいと思います。しかし、私の選択がクライアントに簡単に受け入れられるかどうかはわかりません。それはデザインパターンですか?
performance - ejabberd-2.1.10 のメッセージ スループットの改善
自分のマシン (Win7 32bit 2.93GHz Core2Duo 3GB RAM) にバイナリインストーラーから ejbberd-2.1.10 をインストールしました。私たちのセットアップには非常に高いメッセージ スループットが必要なので、 パフォーマンス チューニングリファレンスを調べて、ejabberd.cfg ファイルと ejabberdctl.cfg ファイルを次のように変更しました。
{shaper, normal, {maxrate, 10000000}}
ERL_MAX_PORTS=65536
ERL_PROCESSES=250000
ERL_MAX_ETS_TABLES=20000
ここで、clientA が clientB にメッセージを送信すると、それぞれ 1500 バイトの 10 個のメッセージが送信されます。
所要時間は次のとおり
です1)デフォルト値の場合-14.3秒
2)上記の上書きされた値の場合-1.70283秒
これはまだパフォーマンス要件を満たしていません。この制限をさらに押し上げる方法について誰か助けてくれませんか??? 何か不足しているか、間違った値を設定していますか? これに関するヘルプは本当に素晴らしいでしょう。
ありがとう
java - JavaNettyの負荷テストの問題
私は、テキストプロトコルを使用して接続を受け入れ、メッセージ(〜100バイト)を攻撃するサーバーを作成しました。私の実装では、サードパーティクライアントとのループバック400K/秒メッセージを送信できます。このタスクにはNetty、SUSE 11 RealTime、JRockitRTSを選びました。しかし、Nettyに基づいて独自のクライアントを開発し始めたとき、スループットが大幅に低下しました(400Kから1.3K msg /秒に減少)。クライアントのコードは非常に単純です。より効果的なクライアントを作成する方法について、アドバイスや例を示していただけませんか。実際、私はレイテンシーにもっと関心がありますが、スループットテストから始めており、ループバックで1.5Kmsg/秒になるのは正常ではないと思います。PSクライアントの目的は、サーバーからメッセージを受信することだけであり、ハートビットを送信することはめったにありません。
アップデート。サーバー側には、受け入れられたクライアントチャネルに書き込む定期的なスレッドがあります。そして、チャンネルはすぐに書き込み不能になります。N2を更新します。パイプラインにOrderedMemoryAwareExecutorを追加しましたが、スループットは非常に低くなっています(約4k msg / sec)
修理済み。パイプラインスタック全体の前にエグゼキュータを配置しましたが、うまくいきました。
java - LMAX を実際の金融アプリケーションに統合する方法
また、ディスラプター パターンをアプリケーションに統合することも考えています。ディスラプターを使い始める前に、いくつかのことについて少し確信が持てません
- 私は 3 つのプロデューサーを持っています。主に、リクエストを逆シリアル化する FIX スレッドです。市場の動きに合わせて注文価格を継続的に変更する別のスレッド。また、GUI アプリケーションから送信されたリクエストをデシリアライズするスレッドがもう 1 つあります。現在、3 つのスレッドすべてがブロッキング キューに書き込みを行っています (したがって、キューで多くの競合が発生しています)。
- ディスラプターはシングル ライターの原則について語っています。上記の 3 つのスレッドをシングル ライターの原則に従わせることができる方法はありますか?
- また、典型的なリクエスト/レスポンス アプリケーションでは、特に私たちのケースでは、リクエストが同じ順序で発生している間に、レスポンスでキャッシュを更新するときにキャッシュをロックする必要があるため、メモリ内キャッシュで競合が発生します。ディスラプターを介してこれをどのように処理するか、つまり、特定のリクエストへの応答をどのように結び付けるか? はいの場合、キャッシュのロックを解除できますか?
任意の提案/指針をいただければ幸いです。現在Java 1.6を使用しています
apache - Apache ログ ファイルからの 1 秒あたりのリクエスト数は?
Apache ログ ファイルから 1 秒あたりのリクエスト数のメトリックを特定することはできますか? もしそうなら、これについてどうやって行くのですか?
乾杯、カタール。