6

データベースサーバーのPIDであるproc/<pid>/ioSQLクエリのIOアクティビティを測定するために読みました。<pid>各クエリの前後の値を読み取って差を計算し、リクエストによって読み取りおよび/または書き込みが発生したバイト数を取得します。

私が知る限り、フィールドREAD_BYTESは実際のディスク IO をカウントしRCHARますが、Linux ページ キャッシュによって満たされる可能性のある読み取りなど、さらに多くのものが含まれます (明確にするために、/proc/[pid]/io のカウンターの理解を参照してください )。RCHARこれは、以上の値になるはずの仮定につながりますREAD_BYTESが、私の結果はこの仮定と矛盾しています。

Infobright ICE で取得した結果のマイナー ブロックまたはページ オーバーヘッドを想像できます (値は MB です)。

        Query        RCHAR   READ_BYTES
tpch_q01.sql|    34.44180|    34.89453|
tpch_q02.sql|     2.89191|     3.64453|
tpch_q03.sql|    32.58994|    33.19531|
tpch_q04.sql|    17.78325|    18.27344|

しかし、MonetDB の IO カウンターを完全に理解できません (値は MB です)。

        Query        RCHAR   READ_BYTES
tpch_q01.sql|     0.07501|   220.58203|
tpch_q02.sql|     1.37840|    18.16016|
tpch_q03.sql|     0.08272|   162.38281|
tpch_q04.sql|     0.06604|    83.25391|

RCHARを含むという仮定は間違っていますREAD_BYTESか? MonetDB が使用できるカーネル カウンターをだます方法はありますか? ここで何が起こっているのですか?

各クエリの前に、ページ キャッシュをクリアし、データベース サーバーを再起動することを追加する場合があります。私は Ubuntu 11.10 を使用しており、カーネル 3.0.0-15-generic を実行しています。

4

2 に答える 2

4

考えられるのは、次の 2 つだけです。

http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=Documentation/filesystems/proc.txt;hb=HEAD#l1305

1:

1446 read_bytes
1447 ----------
1448
1449 I/O counter: bytes read
1450 Attempt to count the number of bytes which this process really did cause to
1451 be fetched from the storage layer.

「ストレージレイヤーからフェッチされる原因」を読んで、先読みを含めました。

2:

1411 rchar
1412 -----
1413
1414 I/O counter: chars read
1415 The number of bytes which this task has caused to be read from storage. This
1416 is simply the sum of bytes which this process passed to read() and pread().
1417 It includes things like tty IO and it is unaffected by whether or not actual
1418 physical disk IO was required (the read might have been satisfied from
1419 pagecache)

これは、「メモリマップファイルを介したディスクアクセス」については何も言っていないことに注意してください。これが最も可能性の高い理由だと思います.MonetDBはおそらくデータベースファイルをmmapしてから、それらに対してすべてを実行します.

その性質上、mmap で使用帯域幅を確認する方法がよくわかりません。

于 2012-05-20T20:47:06.727 に答える