我有一個用戶級別的程序,它使用標誌O_WRONLY|O_SYNC
打開一個文件。該程序創建256個線程,每個線程嘗試將256個或更多字節的數據寫入文件。我希望總共有1280000個請求,使其總共大約300MB的數據。一旦1280000個請求完成,程序結束。使用多線程併發寫入文件
我使用pthread_spin_trylock()
來增加一個跟蹤已完成請求數量的變量。爲了確保每個線程都寫入唯一的偏移量,我使用pwrite()
並根據已經寫入的請求數計算偏移量。因此,在實際寫入文件時,我不使用任何互斥鎖(此方法確保數據完整性嗎?)
當我查看pwrite()
呼叫被阻止的平均時間以及相應的數字(即平均值Q2C時間 - 這是衡量BIOs整個生命週期的時間),使用blktrace
發現,我發現存在顯着差異。實際上,給定BIO的平均完成時間遠遠大於pwrite()
呼叫的平均等待時間。這種差異背後的原因是什麼?這些數字不應該相似,因爲O_SYNC
可確保數據在返回之前實際寫入物理介質?
我重複了ext2文件系統的相同實驗,與ext3文件系統不同,它不是日誌文件系統。平均Q2C延遲結果爲8.5毫秒。在用戶級程序中,'pwrite()'調用被阻塞的平均時間爲1.5毫秒。與我之前的實驗相比,這些數字相對更接近;然而,這不是我想要的。我怎樣才能調用'pwrite()'_completely_ synchronous,即只有在整個數據緩衝區寫入磁盤之後調用纔會返回?磁盤基準測試工具必須有解決方法? – user745878
您可能將不得不使用較低的內核級寫入原語......在Linux實現中,「pwrite()」並不完全同步。 – Jason