ファイルシステムのブロックサイズのためにプロービング

StackOverflow https://stackoverflow.com/questions/1493908

  •  18-09-2019
  •  | 
  •  

質問

私が最初にそれはかなり明白になりますので、これは、クラスのプロジェクトのためのものであることを認めるつもりです。私たちは、ファイルシステムのブロックサイズのために調べるために読み行うことになっています。私の問題は、これを行うために要する時間は、直線的に私が期待するような段差なしで、増加しているように見えるということです。

私はこのような読み取りタイミングいます:

double startTime = getticks();
read = fread(x, 1, toRead, fp);
double endTime = getticks();

getticksは、RDTSC命令を使用する場所。私は、関数freadの間に時間がかかるしないように読み込むの原因となっているキャッシュ/プリフェッチがあるかと思います。私は、各実行私のプログラムの間でランダムなファイルを作成しようとしたが、それは私の問題を軽減されていません。

正確にディスクからの読み込みにかかる時間を計測するための最良の方法は何ですか?私は私のブロックサイズは4096であるかなり確信しているが、私は、データを取得することができますどのようにそれをサポートするために?

役に立ちましたか?

解決

あなたは、システムコールを使用することもできます(open()read()write()、...) 直接FILE*スタッフによって行わバッファリングの影響を低減します。 また、あなたは何とか同期I / Oを使用することもできます。 一つの方法はO_SYNCフラグを設定してファイルを開いています (またはO_DIRECT ephemientの回答によります)。 Linux openを引用(2)マニュアルページ:

   O_SYNC The file is opened for synchronous I/O.  Any  write(2)s  on  the
          resulting  file  descriptor will block the calling process until
          the data has been physically written to the underlying hardware.
          But see NOTES below.

もう一つのオプションは-o syncでファイルシステムをマウントする((8)mountを参照)またはS(1)コマンドを使用してファイルにchattr属性を設定することでしょう。

他のヒント

ファイルシステムのブロックサイズを決定する通常の方法は、そのブロックサイズが何であるか、ファイルシステムを依頼することです。

#include <sys/statvfs.h>
#include <stdio.h>
int main() {
    struct statvfs fs_stat;
    statvfs(".", &fs_stat);
    printf("%lu\n", fs_stat.f_bsize);
}

しかし、あなたが本当にしたい場合は、 open(…,…|O_DIRECT) のか、 posix_fadvise(…,…,…,POSIX_FADV_DONTNEED)するあなたは、カーネルのバッファキャッシュ(保証されません)をバイパスできるようにしようとします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top