2011-12-15 5 views
8

this tutorialによると、非同期ディスクファイルioは、少なくともプログラミング/ apiの観点から、LinuxのAIOを使って簡単に達成できます。しかし、このチュートリアルの前と後で、私はこれを行うことができない、またはパッチや他の多くの問題でlibeventを使うべきであるという多くの記事と記事を読んでいました。もう一つはループを待っていたはずですが、このチュートリアルに基づいてコールバック・メカニズムを使用することができます。これは明らかにAIOの使用をはるかに容易にします。LinuxディスクファイルAIO

私はLinuxのプログラマーではありませんが、Linuxで非同期ディスクファイルioをサポートするための簡単な方法を探していました。それを学び、それを非同期ディスクioライブラリに追加しました。個人的なプロジェクト。現在、Windows以外のプラットフォームでは、WindowsとI/Oワーカースレッドでオーバーラップしたioを使用しています。 mutithreadedソリューションは扱いにくいかもしれないので、私はLinux上でAIOに置き換えたいと思っていました。

だから、このチュートリアルで説明しているAIOの問題は何ですか?それはパフォーマンスですか? AIOを使用して実行できる操作に制限はありますか?

p.s.主要なLinuxディストリビューションで動作する限り、コードが他のPOSIX準拠のプラットフォームに移植できないかどうかは気にしません。私が気にするのは、通常のディスクファイルioです。

ありがとうございました。

+3

LinuxでのAIOサポートが不良です。現在、AIOはバッファ・キャッシュをバイパスし、ディスクIOを直接実行します。これはパフォーマンスをひどく損なう可能性があります。 – lvella

+0

ワーカースレッドソリューションより悪化する可能性がありますか? – p00ya00

+1

あなたの使用状況によって異なります。大きなファイルを順番に読み書きするだけなら、それはうまくいくでしょうが、小さなチャンクにランダムにアクセスすると、それは確かに悪くなります。ちなみに、このworker-threadソリューションは、POSIXインタフェース 'aio_read()'などを使用する場合に得られるものです。glibcによってユーザ空間上のスレッドをブロックすることで実装されています。 – lvella

答えて

11

このチュートリアルでは、非同期I/Oの概要を概説し、カーネルがそれをどのようにサポートしているかについて説明します。次にposix AIO(非同期I/Oにアクセスするための標準化されたAPI)について説明します。これはlinux上のposix AIO APIを使用することでAIOのカーネルサポートにアクセスできることを意味します。これはそうではありません。

は、Linux上で、実際には2つの別々のAIOの実装がある:io_submit()を使用し

  1. カーネルAIOら)のみカーネル2.6でサポートされている(又は、実際に2.5とバックポートがあってもよいしています。 2.4へのそれのバージョン。
  2. カーネルと本質的に無関係なglibcの機能であるPOSIXのAIO、。これは、ディスクI/Oの呼び出しをブロックすること、ユーザレベルスレッドの観点でのPOSIX APIを実装しています。

ので、一言で言えば、すでにディスクI/O用の複数のスレッドを使用している場合は、glibcの実装を使用するよりも、そのほうがはるかに優れている可能性があります。

関数のio_submit()ファミリを実際に使用することを約束している場合は、それらの関数の制限を回避するためにかなりの労力をかけなければならないことがあります。

カーネルAIO には、ファイルがO_DIRECTで開かれます。が必要です。これは、すべてのファイルオフセット、読み取りと書き込みのサイズをディスク上のブロックに合わせる必要があります。大容量のファイルを1つだけ使用していて、OSのページキャッシュと非常によく似たものにすることができれば、これは通常は問題ありません。任意のオフセットと長さで任意のファイルを読み書きするためには、乱雑になります。

カーネルAIOを撃ってしまったら、io_getevents()でブロックするのではなく、epoll/selectを使って補完を待つことができるように、1つ以上のeventfdsをiocbsに結びつけることを強くお勧めします。

2

LinuxのPOSIX AIO実装では、書き込みごとにスレッドが生成されます。これは通常良くありません。あなた自身のワーカースレッドを使って書き込みを行うほうが良いので、再生中のスレッドの数を制御できます。言い換えれば、あなたが持っているものに固執する、AIOはあなたに何かを買うつもりはない。

+0

カーネルAIOはこれをやっていませんが、バッファキャッシュなどをバイパスするのであまり役に立ちません(もちろんデータベースが必要です) – MarkR

関連する問題