2015-04-28 36 views
0

我們有兩個過程:會在Linux內核中添加尾部文件嗎?

  1. 追加到日誌文件
  2. 尾日誌文件並將其發送到集中監控

我擔心的是,如果在過程2中會阻止過程1閱讀文件?內核/磁盤驅動程序中是否存在鎖定爭用?

回答

1

這兩個請求需要在文件系統級別(在內核中)同步。作者通過鎖定與文件相對應的inode來阻塞讀者一段時間。實際的性能損失取決於您正在使用的文件系統以及您所追加的數據量。

這是一個小實驗來驗證這一點。我們首先創建一個程序,它打開一個文件,反覆尋找文件的末尾,並嘗試讀取它找到的任何內容。與此同時,我們有一個不同的過程,連續追加一個零字節到文件。

1 #include <stdio.h> 
    2 
    3 int main() { 
    4   int i; 
    5   char buf[8192]; 
    6   int fd = open("test", 'r'); 
    7   while (i<100000000) { 
    8     lseek(fd, 0, SEEK_END); 
    9     read(fd, buf, sizeof(buf)); 
10     i++; 
11   } 
12 return 0; 
13 } 

現在我們創建一個EXT4文件系統 「測試」 文件,並開始追加:

dd if=/dev/zero of=test bs=1M count=1 
while true ; do dd if=/dev/zero of=test bs=1 oflag=append; done 

運行程序時附加:

time ./readfile  
real 1m24.393s 
user 0m4.173s 
sys  1m15.518s 

雖然沒有附加運行:

time ./readfile 
real 0m30.480s 
user 0m3.130s 
sys  0m27.349s 

正如你所看到的,當文件被修改時,讀取速度要慢得多,主要區別在系統時間。這與由於併發問題在系統調用期間讀者被阻止一致。

+0

非常感謝!我主要關心的是讀者是否會封鎖appender。 – bydsky

+0

是的,讀者也可以阻止作者。在文件系統中固有地需要一些同步以避免訪問不一致的元數據或數據。我使用運行相同的實驗這段時間: 時間DD如果= /開發/測試= BS = 1數=千萬oflag中的零=追加 我得到的基準性能的DD: 真正0m24.808s 用戶0m0。 865S SYS 0m23.842s 而當ReadFile的運行: 真正0m33.996s 用戶0m1.116s SYS 0m31.751s PS:有在代碼中的錯誤(我需要初始化) – Radu

+0

謝謝很多。我很震驚「我需要初始化」大聲笑 – bydsky