ダウンロードが書き込み先のデバイスの書き込み速度よりも速い場合、問題が発生しますか?


5

インターネット接続のダウンロード速度よりも書き込み速度がかなり遅いデバイスにファイルを直接ダウンロードしていた場合はどうなりますか。

  • 書き込み保留データはバッファまたは一時ストレージに移動されていますか?

  • この動作は、OSやブラウザ、あるいは他の何かに依存していますか?

また、問題がある場合、それを防ぐためにできることはありますか?


これを編集して、投機性を少なくしました。質問は通常、あなたが直面する実際の問題に基づいている予想されます。しかし、これは今議論中です。メタ
12

「デバイスに直接」-そのようなことはありません。ユーザーとハードウェアの間には、常にアプリケーションレベルとシステムレベルのバッファがあります。
ジョナサンラインハルト

>質問は通常、直面している実際の問題に基づいていることが期待されます。 誰が言ったのですか?どうして? >しかし、これは現在メタ議論中です。 はい、たった4時間前に質問されましたが、あなたは、既存の問題だけが品質であるというあなたの意見を述べた人です。問題を抱えている人が、座って最終的に投稿されるのを待つのではなく、以前の理論的な質問に進む準備ができている答えを見ることで恩恵を受けるとは思わないのですか?
Synetech

@ルイス、私はこれを自分で疑問に思っています。以下の回答を見ると、明らかなケースに対処していないようです。高速接続から大きなストリーミングビデオを視聴し、(何らかの理由で)一時ディレクトリがフラッシュドライブ(またはフロッピーなど)にある場合、ビデオプレーヤーがデータをプルし続ける可能性がありますドライブが十分な速度でバッファに書き込むことができないことを認識せずにサーバーから。
Synetech

回答:


3

ある程度までは、OSとアプリケーションに依存します。ただし、次の予測シーケンスを作成できます。

  1. 最初に、スタック受信ウィンドウがいっぱいになり、ネットワークの完全なデータレートよりも少し低くなります。それはいっぱいに遅くによるネットワークのラインレートよりもTCPスロースタートアルゴリズムとTCP / IPスタックが振る舞う方法の他の効果。

    TCPボックスは、Linuxボックスでは最大128 KiB(1バイト未満)になります。(ボックスの値sysctl net.core.rmem_maxを取得するようにしてください。)ただし、通常はこの最大値よりも小さくなります。私のボックスでは、デフォルトは4 KiBです。(sysctl net.ipv4.tcp_rmemその値を取得すると言います。)

  2. アプリケーションには、独自のバッファリングがあります。最小1バイトですが、ゼロにすることはできません。Linuxではrecvfile()、アプリケーションのバッファリングの必要性を回避するために、ゼロコピーシステムコールが必要になりますが、それはありません。

    バッファサイズは、アプリケーションプログラマ次第です。私が書いたプログラムでは、アプリケーションのニーズに応じて、およそ12バイトから64 KiBまでの範囲で使用しました。他のアプリの動作を観察することで、他のアプリで非常に大きなバッファー(約1 MiB)の使用を推測しています。

  3. アプリケーションは、ほぼ確実に、Cstdioなど、何らかの種類のバッファーI / Oメカニズムを使用してファイルを書き込みます。通常、これは少なくとも1 KiBであり、数KiBになる場合があります。このボックスでは、デフォルトで8 KiBに設定されています。

    アプリケーションがバッファなしI / Oを使用しているか、I / Oバッファを常にディスクにフラッシュしている可能性がありますが、これはまれです。

  4. ストレージデバイスのデバイスドライバーには、バッファリングが含まれている場合があります。おそらくそれほど多くはありませんが、4 KiBの単一ページバッファーは不合理ではありません。

  5. ストレージデバイス自体には、ほぼ確実にキャッシュがあります。たとえば、最近のハードドライブには数十メガバイトのキャッシュがあります。RAIDデバイスに書き込む場合は、さらに大きなライトバックキャッシュも存在する可能性があります。

これらの5つのバッファはすべて、基礎となるストレージデバイスの生のI / Oパフォーマンスが影響を与える前にいっぱいになる必要があります。最大100 MiB以上を簡単に追加できるため、これらのバッファーの組み合わせ動作をテストするだけではないことを確認したい場合は、これよりも大きい転送サイズでテストする必要があります。

すべてのことをカバーした、私はあなたのトップレベルの質問にお答えします:限り、あなたはとネットワークプロトコルを使用しているとして、フロー制御メカニズム-例えばTCPを -あなたは断定シナリオから生じる問題はないはずです。ただし、UDPなどの信頼性の低いネットワークプロトコルを使用しており、その上に構築されたアプリケーションプロトコルが独自のフロー制御メカニズムを提供していない場合、アプリケーションはこの状況でパケットのドロップを強制される可能性があります。


4

私が起こることを期待するのは、1つから2つのことです。

  1. データを要求するプロセスは、メモリ内の「過剰」をバッファリングします。

    またはより可能性が高い:

  2. データを要求するプロセスは、データを処理できた場合にのみデータを要求するため、ダウンロードの速度はデバイスの書き込み速度まで効果的に低下します。

実際に何が起こるかは、ダウンロードおよび書き込み操作を行うアプリケーションに依存するため、特定のアプリケーションを念頭に置いていない限り、質問の2番目の部分は答えられません。


1
これをテストできますか?書き込み速度を一部のUSBストレージに制限し、ファイルをその方法で送信しながら、メモリの変更を監視します。ただし、LinuxまたはWindowsシステムでデバイスの書き込み速度を制限する方法がわかりません。
ルイスノートン

1

OS /アプリは単にダウンロード速度を調整します。1Gbit LANから古いUSB1ペンドライブにファイルをダウンロードして、自分で確認してください。


1

基礎となるプロトコルがTCP(HTTPなど)の場合、問題はありません。ダウンローダーには、ダウンロードされたデータを一時的に保存するバッファーがメモリにあります。このバッファからディスクにデータを継続的に書き込みます。ディスクが遅い場合、バッファーがいっぱいになり、ダウンローダーはオペレーティングシステムにリモートサーバーからのデータの受信を要求しません。つまり、Windows TCPドライバーの同様のバッファーがいっぱいになります。TCPプロトコルは、誰かのバッファーがいっぱいになっても問題がないことを保証します。

http://en.wikipedia.org/wiki/Transmission_Control_Protocol#Flow_control

TCPは、エンドツーエンドのフロー制御プロトコルを使用して、送信者がデータを高速に送信してTCP受信者がデータを確実に受信および処理できないようにします。さまざまなネットワーク速度のマシンが通信する環境では、フロー制御のメカニズムを持つことが不可欠です。たとえば、PCが受信したデータをゆっくり処理しているスマートフォンにデータを送信する場合、スマートフォンはデータフローが圧倒されないように調整する必要があります。

TCPは、スライディングウィンドウフロー制御プロトコルを使用します。各TCPセグメントで、受信側は、受信ウィンドウフィールドで、接続用にバッファリングする追加受信データの量(バイト単位)を指定します。送信ホストは、受信ホストからの確認応答とウィンドウの更新を待機する前に、そのデータ量までしか送信できません。

そのため、TCPドライバーのバッファーがいっぱいになると、他のコンピューターにデータを受信する準備ができたことを認識しません。

基礎となるプロトコルがより特別/独自のものである場合、すべての賭けはオフです-これはTCPの機能であるためです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.