問題タブ [latency]
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.
linux - Linux ネットワーク アプリの待ち時間が長い
私はLinuxネットワークプログラミングで遊んでいて、クライアントとサーバープロセスの間で小さなメッセージをバウンスし、往復時間を測定する小さなクライアントサーバーアプリを書きました。一貫して、ローカルホストのラウンドトリップに約 80 ミリ秒かかります (これは接続セットアップ後です)。これは異常に高いようです。同じコードを実行している同じマシンのクロックは、Vista では 1 ミリ秒を大幅に下回ります。
この違いがどこから来るのかについてのアイデアはありますか? コードは非常に単純で、一方の端で受け入れ、もう一方の端で接続し、ピア ソケットを介して送受信するだけです。
Linux を始めたばかりです。ばかげた質問でしたら申し訳ありません。
audio - ソフトウェアシンセサイザーによるリアルタイムオーディオアプリケーションの作成
キーボードをピアノのように機能させるソフトウェアを作成することを検討しています (たとえば、ユーザーが「W」キーを押すと、スピーカーが D ノートを再生します)。おそらくOpenALを使用するでしょう。デジタル オーディオの基本は理解していますが、キーを押したときにリアルタイム オーディオを再生すると、解決できない問題がいくつか発生します。
ここに問題があります。たとえば、10 個のオーディオ バッファーがあり、各バッファーに 1 秒間のオーディオ データが保持されているとします。スピーカーで再生する前にバッファーをいっぱいにする必要がある場合は、再生の 1 秒か 2 秒前にバッファーをいっぱいにすることになります。つまり、ユーザーがノートを再生しようとすると、キーを押してからノートが再生されるまでに 1 ~ 2 秒の遅延が発生します。
この問題をどのように回避しますか? バッファをできるだけ小さくし、できるだけ遅く埋めますか? 私が見逃しているトリックはありますか?
.net - 低レイテンシーのための WCF サーバーの設計
パブリッシュ/サブスクライブ シナリオで WCF サーバーの低レイテンシを実現するにはどうすればよいですか? 具体的には、クライアントはデータをサブスクライブして更新を受信します。問題のレイテンシは、データの変更とクライアントが変更を受信する間の遅延ですか? CPU、メモリ、帯域幅の要件は重要ではなく、高くなる可能性があります。
基本は明白です: バイナリのシリアル化、名前付きパイプなど。または、更新のバッチを単一のメッセージとして送信して、RPC/ヘッダーのオーバーヘッドを減らすには?
例として使用できるコードまたはインターフェイスを備えたプロジェクトがいくつかあるのでしょうか?
synchronization - 優れたマルチプレイヤー/mmo クライアント <> サーバー ゲームは、移動計算でレイテンシーを使用しますか?
ここでいくつか質問があります。
次のメッセージをサーバーに送信するクライアント A がいるとします。「START MOVEMENT FORWARD」。
待ち時間による遅延があるため、サーバーはこのメッセージをすぐには受信しません。
質問 1: ping (またはより良い:往復時間) は、クライアントがサーバーにメッセージを送信して応答を受信するまでにかかる時間です。サーバーがメッセージを受信したことに気づき、応答の送信を開始するまでの時間を無視できる場合 (これは非常に短いはずです)、これは次のことを意味しますか?
- クライアントが何かをサーバーに送信するのにかかる時間 = 往復時間 / 2
- サーバーがクライアントに何かを送信するのにかかる時間 = 往復時間 / 2
したがって、クライアント A がそのメッセージを送信すると、サーバーは、クライアントがメッセージを送信してから round-trip-time / 2 ミリ秒後にそのメッセージを受信すると想定されます。これは次の質問につながります。
質問 2: クライアントは最初にパッケージを送信し、そのコマンドをクライアント側で実際に実行する前にラウンドトリップ時間 / 2 ミリ秒待機する必要があります (この場合は前進します)。
ここで、サーバーは次のメッセージを近くのすべてのプレイヤーに送信します:「クライアント A は現在進行中です」。これらのクライアントは、クライアント a のキャラクターが動き始めることを確認します。これは、次の質問につながります。
質問 3: 他のクライアントが移動したというメッセージを受信するクライアントは、このメッセージがサーバーによって送信されたことを考慮に入れる必要があります round-trip-time / 2 ミリ秒前? 移動計算のタイムスタンプに使用される現在の時間を round-trip-time / 2 だけ減らす必要がありますか?
私の考えでは、これらの方法はすべて、遅延が考慮されるため、クライアント間の同期が改善されることを確認します。これは物事を行う正しい方法ですか?他の優れたマルチプレイヤー ゲームのほとんどはこれを行っていますか? コメント、提案、代替案、またはランダムだが関連する叫びはありますか? 前もって感謝します。
performance - pingを使用せずに最適なサーバーを選択しますか?
「最適な」ネットワークサーバーを選択するための最良のアプローチを探しています。ユースケース:自宅のユーザーは、地理的に分散したサーバーのいずれかを介してネットワークにアクセスする必要があり、デスクトップアプリが1秒以内に1つを自動的に選択するようにします。サーバーはICMPパケットをブロックするため、pingは機能しません。HTTPS HEADリクエストを各サーバーに送信し、応答時間を測定することを考えています。地理的な近接性を排除する必要がありました。
助言がありますか?
database - DB 設計/レイテンシー/並行性、ひどい頭痛の種
いくつかのテーブルからすべてのデータを取得し、何かを再計算して保存するクライアント/サーバー アプリケーションがあります。
例:
各アイテムには「部品表」があります。これは、それを構成する他のアイテムのリストと数量です。したがって、アイテムのコストは、BOM 内のアイテムのコスト * 数量の合計です。最終的に、一部の「ベース」アイテムには BOM がなく、コストが個別に設定されているだけです。(すなわち: 原材料)
例: A の BOM には、2xB と 3xC で構成されていると記載されています。
私が今していることは、なぜこのようにするのか覚えていませんが、DB からすべてのアイテムとすべての BOM を取得し、一度に各アイテムのコストを再帰的に計算することです。1 つのアイテムを計算したら、フラグを立てて、コストを再度やり直さないようにします。(無限再帰も防ぎます)
問題は、これはちょっとばかげているということです。まず、その速度は遅く、変更されていないものを再計算します。さらに悪いことに、十分な大きさの DB を与えると、メモリが不足します。
代わりに、必要に応じてアイテムを再計算できます。アイテムの BOM が変更された場合、その BOM を再計算し、この更新されたアイテムを含むすべての BOM を選択し、それらも再計算します。変更されたアイテムに依存する DB 内の BOM がない最上部に到達するまで、すすぎ、再帰的に繰り返します。
これが実際に意味すること: 一部のアイテムは原材料であり、そのコストは頻繁に更新される可能性があり、一部のアイテムは BOM がほとんど変更されない「エンドユーザー」のものであるとします。ユーザーがこれらの材料の 1 つのコストを変更すると、何千ものアイテムを調べて再計算することになる場合があります。1 つのアイテム/BOM の SELECT に 15 ミリ秒かかるとします (私は Postgresql を使用しています)。1000 のアイテム/BOM を選択するだけで 15 秒かかるため、再計算されたコストを DB のアイテムに更新する必要があります...ああ親愛なる、遅延は数分に変わる可能性があります。
私が働いている会社が使用しているERPソフトウェアは、最初のアプローチを採用しています。つまり、DB全体を一度にバッチ再計算します。これには文字通り何時間もかかり、10年以上の使用でこのアプローチでは問題が蓄積されているようです. バッチ再計算は毎週行われます。
実際に「これを大声で書いた」ので、数分かかることはあまり問題ではないと思います。問題は、私がデータベースをよく理解していないことと、同時実行性について心配していることです。アイテム A の更新には時間がかかるため、アイテム A が更新されている間に誰かが 2 番目のアイテム B を更新する可能性があります。更新しました。
アイテム D は上記の A と B から作られているとします。ユーザー 1 が A を更新すると、サーバー ソフトウェアは DB で数分間マスターベーションを開始し、最終的に D を更新します。しかし、その間にユーザー 2 が B を更新するため、サーバーは最終的に D を再度更新します。
Postgresql のトランザクションを使用すると問題は解決しますか? トランザクションはその時点での DB の状態で開始されるため、トランザクション 1 は D が A1 と B1 から作成され、A1 から A2 に更新されていることを確認しますが、トランザクションが終了してコミットする前に、トランザクション 2 が開始され、A1 も確認されます。そしてB1。T1 は、D = A2 + B1 を再計算してコミットします。しかし、T2 はすでに始まっており、新しい A、A2 は表示されません。そのため、最終的に D = A1 + B2 という DB にコミットしますが、これは正しくありません。D = A2 + B2 である必要があります。
また、一部の処理が重複し、サーバー時間が無駄になります。
T1 と T2 を並列ではなく順番に実行すると、答えは正しいのですが、ユーザー 2 はさらに長く待たなければなりません。また、トランザクションのグループが互いに関係がない場合 (完全に独立した... 依存関係ツリー。つまり、A=X+Y および B=N+M)、並列計算により正しい答えが得られ、さらに高速になります。ユーザー。
重要な注意: 順番に処理する場合でもトランザクションを使用するので、コストを再計算する関数を除いて、ソフトウェアの残りの部分はそのデータを並行して処理できます。
さて、この「プロセス・イン・シーケンス」全体は、もし....DBレイテンシがそれほど「ひどい」ものではないなら、それほど悪くはありません。たとえば、データ全体が RAM に保持される場合、1000 個のオブジェクトを通過するのは簡単です。ああ、でも、データのチャンクをディスク/RAM との間ですばやく移動し、キャッシング (DB を置き換える) を行うシステムを構築したとしても、それはうまくいきません。並行して作業できます。(上記の「重要な注意」)したがって、別のDBを構築することになります。少し速いかもしれませんが、それはばかげている/時間の無駄です。
各アイテムのコストを「キャッシュ」する理由は、それを使用するたびに再計算しないようにするためです。これは、限られたリソースを浪費するだけでなく、DB レイテンシが大きすぎ、同時実行の問題がさらに悪化するためです。
なぜ「彼ら」が大量にそれを行ったのか不思議ではありません...これは私の頭を悩ませています.
Q1: 「最適な」方法でこれをどのように解決しますか?
私の現在の理解から (つまり、以前は黙って無視していた同時実行性の問題に直面した後)、その関数にトランザクションを順番に使用させ、アプリの残りの部分はデータを並行して使用できると考えています。ユーザーに最適です。それが目標です。ユーザーにとっては最善ですが、システムの正確性は保証されています。
後でハードウェアを投入して、ソフトウェアのブラック マジックを使ってレイテンシを短縮できるかもしれませんが、今は自分に嘘をつき始めています。
また、過去 2 か月間、私はいくつかの明らかなこと (プログラミングに関係のないものもありました) に完全に目をつぶっていました。 | |
iphone - 初めてアドホックアプリをiPhoneにロード
ねえ、私はクライアントの電話に入れようとしているアプリのアドホックディストリビューションを持っています。iTunesを使用してテスト用電話に同期した後の初期ロードでは、アプリがメイン画面を表示するまで30秒のロード時間が表示されます。ただし、その後のすべての負荷は非常に高速です。
アドホックディストリビューションからの最初のロードでレイテンシーが増えるのか、それとも何か間違ったことをしているだけなのか、疑問に思っていました。
c++ - 接続とそこからのデータを複数のプロセスと共有する最速の方法は?
それぞれがサーバーに接続し、サーバーからデータを受信する複数のアプリプロセスがあります。多くの場合、接続されているサーバーと取得されているデータはプロセス間で重複しています。そのため、ネットワーク全体でデータが不必要に重複し、必要以上の接続が発生し(サーバーに負担がかかります)、データがアプリのメモリに冗長的に保存されることになります。
1つの解決策は、複数のアプリプロセスを1つのプロセスに結合することですが、ほとんどの場合、それらは実際には論理的に異なり、何年もの作業になる可能性があります。
残念ながら、レイテンシーは非常に重要であり、データの量は膨大です(1つのデータはそれほど大きくない場合がありますが、クライアントがリクエストを行うと、サーバーはデータの変更に応じて更新の高速ストリームを送信します。 20MB /秒。これらはすべて、可能な限り最短の遅延で要求元のアプリに提供する必要があります)。
頭に浮かぶ解決策は、アプリプロセスがデータを要求するローカルデーモンプロセスをコーディングすることです。デーモンは、適切なサーバーへの接続がすでに存在するかどうかを確認し、存在しない場合は接続を確立します。次に、データを取得し、共有メモリを使用して(遅延の懸念があるため、それ以外の場合はソケットを使用します)、要求元のアプリにデータを渡します。
冗長な接続のみを解決する短期的な簡単なアイデアは、unixドメインソケット(これはunix OSで実行されますが、可能な場合はクロスプラットフォームライブラリに固執することを好みます)を使用して、すべてのプロセスなので、単一の接続を共有します。これに関する問題はバッファを消費することです-私はすべてのプロセスがソケットを介して来るすべてを見るようにしたいです、そして私がこのアプローチで正しく理解するならば、ソケットで1つのプロセスを読み込むと他のプロセスが彼らの同じデータを見るのを防ぎます次の読み取り(共有記述子内のオフセットがバンプされます)。
architecture - アプリのアーキテクチャに関する考慮事項の桁違いのレイテンシ
ネットワーク (udp と tcp/ip)、ディスク、メモリ (シーケンシャル/ランダム アクセス)、インプロセスとインタープロセスなどを介して情報を転送するのにかかる時間 (相対的または絶対的な用語) をリストしたリファレンスはありますか? .?
最終的にはこれらを測定する必要がありますが、球場の数字へのポインタに感謝します.
メモリ対ディスクを見つけるのは難しくありませんが、残りの数字については自分の方向性を知りたいです。
performance - オンライン アプリの起動: CDN、Amazon サービス、または専用サーバーのどれを使用しますか?
私の Web アプリケーションでは、遅延をできるだけ少なくする必要があります。専用サーバーでホストしようとしましたが、世界の反対側のユーザーは遅延の問題について不満を持っています.
それで、CDNまたはAmazonサービスの使用を検討しています....どちらがこれを解決するのに役立ちますか?
アプリケーションは多くの AJAX を使用するため、遅延が問題になる可能性があります。