ページキャッシュをバイパスする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
。