O_DIRECTフラグを使用してランダムにファイルを開くread()は、32MBのファイルサイズのパフォーマンスに深刻な影響を与えますか?

O_DIRECTフラグを使用してランダムにファイルを開くread()は、32MBのファイルサイズのパフォーマンスに深刻な影響を与えますか?

ページキャッシュをバイパスするHDD読み取りベンチマークを実行しています。 O_DIRECTフラグを設定し、メモリを修正しました。この関数はファイルからランダムに読み取りを試みます(lseek64()を使用)。私が得たデータは、特定のポイント(32MB)までは大丈夫です。以下のデータ(平均)を見てください。特に32MB以降にこんなに大きな幅のジャンプをした理由が何なのか気になります。 Ubuntu 16.04ファイルシステムext4を使用しています。

これについて助けてくれてありがとう。ありがとうございます。

KB      TIME
32      11.2452
64      22.3882
128     45.3915
256     89.6025
512     12.655
1024    402.332
2048    759.456
4096    1512.83
8192    2999.54
16384   5988.16
32768   **85358.8**





double readFileRan(std::string name, unsigned long bytes) {
   Time t;

   int ID = open(name.c_str(), O_RDONLY | O_DIRECT);

   sync();

   if ( ID == -1) {
       std::cout << "can't open input file!" << std::endl;
       return 0;
   }

   unsigned long reads = bytes / 512;
   std::vector<unsigned long> offsets;
   for(unsigned long i = 0; i < reads; i++) {
      offsets.push_back((rand() % reads) * 512);
   }

   int BLKSIZE = 512;
   char* sector = (char*)memalign(BLKSIZE, BLKSIZE); //size of physical   sector
   unsigned long numRead = 0;
   unsigned long i = 0;
   off64_t result = 10;

   unsigned long long start = t.start();
   while(i <= reads)  {
      result = lseek64(ID, offsets[i] ,SEEK_SET);
      numRead = read(ID, sector, 512);
      i = i + 1;
   }
   unsigned long long end = t.end();
   close(ID);

   unsigned long long total = end - start;
   double mili = t.convertCyclesToSec(total);

   std::cout << mili << std::endl;
   return mili;
}

ベストアンサー1

セクタを読み取るのにかかる時間は、読み込みを試みるとドライブの回転角度に依存し、これらのランダムなプロセスによる統計的変動を回避するにはサンプルサイズが小さすぎます。各セクタは平均して一度だけ読み取られる。bytes規模が大きく、サンプルをたくさん採取するのは良いですが、bytes小さいときはあまり良くありません。より興味深いデータを得るには、サイズに関係なく常に固定数のセクタを読み取る必要がありますbytes

ある時点でシリンダサイズを超えるとアクセス時間がジャンプすると予想され、bytesヘッドは正しいセクタが通過するのを待つのではなくトラックからトラックに移動する必要があります(これも時間がかかりますが、時間は短いです)。ただし、この効果は、ファイルシステム(ファイルセクタをデバイスセクタに非線形的にマッピングする自由がある)を通るよりも、rawパーティションから読み取るとよりよく見ることができます。

もちろん、最新ディスクのシリンダサイズは可変です。これは、長い外部トラックがスピンドルに近い短い内部トラックよりも多くのセクタを収容できるためです。

ディスク自体に小さなメモリ内キャッシュがあり、それ自体が利用できないため、これらすべてを測定することはより複雑になりますO_DIRECT

おすすめ記事