2

私が対処しようとしている問題は、ネットワーク経由で送信される多数 (数百万) の小さなファイル (最大 50 KB) を保存することです。保存は順次行われます。サーバーはファイルまたはディレクトリを (ネットワーク経由で) 受け取り、それをディスクに保存します。次のものが到着し、保存されます。明らかに、複数のサーバープロセスが共存する場合(ネットワークからすべてを読み取り、同時に書き込む5つのプロセスがあるとしましょう)、パフォーマンスは許容できません。 I/O 書き込みを効率的にマージすることができます。

推奨される解決策は、ある種のバッファリングを実装することです。各サーバー プロセスには 50MB のキャッシュが必要であり、現在のファイルを書き込み、chdir などを実行する必要があります。バッファーがいっぱいになると、ディスクに同期する必要があるため、I/O バーストが発生します。

あなたへの私の質問: 1) バッファメカニズム (ディスクバッファ) が既に存在することは知っています。上記のシナリオで何らかの改善が加えられると思いますか? (設計ははるかに複雑で、単純なテスト ケースを実装するのは容易ではありません)

2)これを実装する場合、どこを見ればいいですか?

どうもありがとう。

4

3 に答える 3

1

あなたはより良いことをする必要があるでしょう

「明らかにパフォーマンスは受け入れられません」。

具体的には

  • どのように測定していますか?正確で再現可能な数値を持っていますか
  • あなたのターゲットは何ですか?

最適化を行うには、それを測定する方法 (メトリクス) とターゲット (つまり、いつ停止するか、または特定の手法がどれほど有用か役に立たないかがわかります) の 2 つが必要です。

どちらかがなければ、あなたは沈んでしまうと思います。

于 2011-05-31T19:24:53.050 に答える
0

それらの書き込みはどれほど重要ですか?3 つの提案 (組み合わせ可能) がありますが、そのうちの 1 つは多くの作業が必要であり、そのうちの 1 つは安全性が低くなります...

ジャーナリング

最近のほとんどの Linux ファイルシステムに共通するジャーナリングが原因の 1 つとして、パフォーマンスが低下していると思います。ジャーナリングにより、ファイル メタデータが書き込まれるときにバリアが IO キューに挿入されます。オプションとを使用して、安全性を下げて (場合によっては速度を上げることも)試すことができます。mount(8)barrier=0data=writeback

ただし、クラッシュが発生した場合、ジャーナルは長いfsck(8). またfsck(8)、問題を修正する際にデータを破棄してしまう可能性もあります。一方で、それは軽々しく取るステップではありません。他方では、昔は、ext2ファイルシステムをasync雪の中で両方の方法でジャーナルなしでモードで実行し、それが好きでした。

IO スケジューラ エレベータ

もう 1 つの可能性は、IO エレベータを交換することです。Documentation/block/switching-sched.txtLinux カーネル ソース ツリーを参照してください。短いバージョンは、、、、およびdeadline利用可能です。はカーネルのデフォルトであり、おそらくシステムが使用しているものです。確認してもいい:noopascfqcfq

$ cat /sys/block/sda/queue/scheduler
noop deadline [cfq] 

ファイルの最も重要な部分:

As of the Linux 2.6.10 kernel, it is now possible to change the
IO scheduler for a given block device on the fly (thus making it possible,
for instance, to set the CFQ scheduler for the system default, but
set a specific device to use the deadline or noop schedulers - which
can improve that device's throughput).

To set a specific scheduler, simply do this:

echo SCHEDNAME > /sys/block/DEV/queue/scheduler

where SCHEDNAME is the name of a defined IO scheduler, and DEV is the
device name (hda, hdb, sga, or whatever you happen to have).

The list of defined schedulers can be found by simply doing
a "cat /sys/block/DEV/queue/scheduler" - the list of valid names
will be displayed, with the currently selected scheduler in brackets:

# cat /sys/block/hda/queue/scheduler
noop deadline [cfq]
# echo deadline > /sys/block/hda/queue/scheduler
# cat /sys/block/hda/queue/scheduler
noop [deadline] cfq

スケジューラーを変更する価値はありますが、ジャーナリング要件によってキューに挿入されたバリアによっては、並べ替えがあまりできない場合があります。それでも、データが失われる可能性は低いため、最初のステップになる可能性があります。

アプリケーションの変更

もう 1 つの可能性は、ファイル自体をバンドルするようにアプリケーションを大幅に変更し、より少ない、より大きなファイルをディスクに書き込むことです。奇妙に聞こえるかもしれませんが、(a) iD 開発チームはマップ、テクスチャ、オブジェクトなどを巨大なパッケージにまとめました。zip数百または数千の小さなファイルを読み取るよりもパフォーマンスがはるかに優れているため、いくつかのシステムコールでプログラムに読み取り、展開して実行します。レベル間のロード時間が大幅に短縮されました。(b) Gnome デスクトップ チームと KDE デスクトップ チームは、アイコンとリソース ファイルの読み込みに異なるアプローチを取りました。KDE チームは多数の小さなファイルを何らかの大きなパッケージにパッケージ化しましたが、Gnome チームはそうしませんでした。Gnome チームは起動の遅延が長かったため、カーネルが起動時間を改善するために何らかの努力をしてくれることを望んでいました。カーネル チームは、より少ない、より大きなファイルのアプローチを提案し続けました。

于 2011-05-31T09:53:51.207 に答える
0

ファイルの作成/名前変更、同期、ディレクトリ内の多数のファイルの保持、および多数のファイル (末尾の無駄を含む) は、シナリオでの低速な操作の一部です。ただし、それらを回避するには、より少ないファイルを書き込むだけです(たとえば、アーカイブ、連結ファイル、または類似のファイルを書き出すなど)。私は実際に(限定された)並列非同期または同期アプローチを試します。通常、IO スケジューラとキャッシュは非常に優れています。

于 2014-12-04T02:38:34.123 に答える