2015-01-21 33 views
1

我有多個線程,每個線程接受請求,執行一些處理,將結果存儲在提交日誌中,並返回結果。爲了保證最多x秒的數據丟失,這個提交日誌需要每隔x秒fsync'd。在多個文件和一個文件上調用fsync時的性能

我想避免線程之間的同步,這意味着它們每個都需要有自己的提交日誌而不是共享日誌 - 是否有可能以性能方式定期同步所有這些不同的提交日誌?

這是在Linux上,EXT4(或ext3)

(注意:由於代碼的性質,即使是在正常處理線程需要從提交日誌重新讀取自己的一些近期數據(但從來沒有其他線程提交日誌數據),所以我認爲使用共享日誌將是不切實際的,因爲許多線程需要讀/寫它)

回答

0

如果你只需要每隔幾秒沖洗一次,你會需要fsync()呢?即操作系統應該定期爲你做(除非系統負載很重,磁盤I/O供應不足)。

,否則有你的線程做這樣的事情:

if (high_resolution_time() % n == 0) { 
    fsync(); 
} 

其中n是將例如值3如果返回的high_resolution_time()返回了Unix EPOCH時間(以秒錶示)。會使線程每3秒刷新一次文件。

這個問題當然是因爲你需要更高的時鐘分辨率來避免讓一個線程每秒多次通過這個代碼段多次不連續多次刷新它的文件。我不知道你使用什麼編程語言,但在Linux上的C上,你可以使用 gettimeofday:

struct timeval tv; 
gettimeofday(&tv, null); 
double x = (double)tv.tv_sec * (double)1000000 + (double)tv.tv_usec; 
if (x % 3000000 == 0) { // fsync every 3 seconds 
    fsync(); 
} 
相關問題