Read
read() 隨機打開一個帶有 O_DIRECT 標誌的文件,對 32 MB 文件大小造成嚴重的性能影響?
我正在執行繞過頁面記憶體的 HDD 讀取基準測試。我設置了 O_DIRECT 標誌並整理了我的記憶。此函式嘗試在文件中進行隨機讀取(使用 lseek64())。直到某一點(32 MB),我得到的數據看起來都很好。請看下面的數據(平均值): 特別想知道為什麼我在 32 MB 之後會有如此大的跳躍?我使用 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; }
讀取扇區的時間取決於嘗試讀取時驅動器的旋轉角度,並且您的樣本量太小,無法避免此隨機過程造成的統計波動。您平均只閱讀每個扇區一次。當
bytes
大並且您正在採集大量樣本時這很好,但在bytes
小時則不是很好。為了獲得更多有趣的數據,您應該始終讀取固定的大量扇區,而與bytes
.在某些時候,當超過柱面大小時,可以預期訪問時間會發生跳躍
bytes
,並且磁頭必須從一個磁軌移動到另一個磁軌,而不是僅僅等待正確的扇區飛過(這也需要時間,但時間更少)。但是當讀取分區原始而不是通過文件系統(它可以自由地將文件扇區非線性映射到設備扇區)時,可以更好地看到這種效果。現代磁碟的柱面大小當然是可變的,因為與靠近主軸的較短內磁軌相比,更長的外部磁軌上可以容納更多的扇區。
由於磁碟本身可能有一個很小的記憶體記憶體,而僅通過使用
O_DIRECT
.