1

クライアントシステムからファイルをバックアップするためにC++を使用しています。毎秒、ファイルがクライアントのマシンから溢れ出ており、サーバーに書き込むすべてのファイルのファイル記述子を取得する必要があります。1分以内に10Kのファイルを取得することもありますが、実際にファイル記述子を使用して複数のファイルを効率的に書き込むにはどうすればよいですか。

私はC++ソケットリスナーを持っています。各クライアントマシンはサーバーに接続し、ファイルのアップロードを開始します。限られたファイル記述子で複数のファイルを書き込むことは可能ですか?すべてのファイルを1つの大きなファイルに書き込もうとしましたが、ファイルに書き込むすべてのファイルについて、大きなファイルのファイルの終了バイトと開始バイトを追跡しています。 。

高性能でファイルを書き、ディスクを安全に保ちたい。共有するアイデア..?

4

1 に答える 1

1

おそらくリクエストをキューに入れる必要があるようです。

そうすれば、限られた数のワーカー (システムのハードウェアに応じて 16 など) を実際にファイルを転送し、残りを待機させることができます。

これにより、スループットとパフォーマンスが向上する可能性があります。

  • スレッドスケジューリングのオーバーヘッドを取り除きます
  • リソースのボトルネックを取り除きます (fd + バッファ割り当て)
  • ディスクを同時にヒットすることはありません (旧式のハードウェア (つまり、最も頻繁にディスクを回転させる) では、ディスク シークを繰り返すと、パフォーマンスが大幅に低下する可能性があります。

    • 免責事項:ファイルシステム/OSが連携して、ディスク書き込みのスケジュールを変更することにより、この影響を制限/軽減する場合があります(エレベーター/完全な公平なキューイングおよびその他のアルゴリズム)。
    • いずれにせよ、シーケンシャル アップロードを共有ボリュームに書き込む場合、通常、帯域幅の使用は次の場合に最適になります。

      sum(upload rates) ~= effective disk write bandwitdh
      

キューイングについて:

于 2012-10-16T13:54:33.020 に答える