0
A
回答
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
正如你所看到的,當文件被修改時,讀取速度要慢得多,主要區別在系統時間。這與由於併發問題在系統調用期間讀者被阻止一致。
相關問題
- 1. 將頭文件添加到Linux內核
- 2. 在Linux內核中爲頭文件添加路徑
- 3. C Makefile - 如何在構建時添加頭文件(linux內核)?
- 4. Linux內核頭文件
- 5. Linux內核文件重啓
- 6. linux內核頭文件
- 7. 將條目添加到Linux內核.config文件
- 8. 添加模塊C到linux內核
- 9. 在Linux內核中
- 10. 如何在Tiny Core Linux的擴展文件中添加新的內核模塊?
- 11. 在linux內核(內核空間)中檢索會話Id
- 12. Linux內核可以加載並運行另一個Linux內核嗎?
- 13. 如何添加OLSRD作爲Linux內核編譯的一部分
- 14. 使.o文件在Linux內核編譯
- 15. httpd RewriteRule不會添加尾部斜槓
- 16. 內核:如何爲內核構建添加新的源文件?
- 17. 如何在linux內核模塊中添加RTC定時器
- 18. 在Linux內核3.3中添加一個新的系統調用
- 19. 如何在Linux內核中添加規則Makefile
- 20. 如何在linux內核的struct page中添加新字段
- 21. 從內核空間在Linux中添加/刪除路由
- 22. 在linux內核中添加和編譯新代碼
- 23. Docker可以部署在Linux內核的2.6.x版本上嗎?
- 24. 在Groovy中尾部文件
- 25. 將數據追加到Linux內核中的文件
- 26. Linux內核加密指南
- 27. 在Linux內核中實現硬件時鐘信號內核
- 28. 在Linux內核中搶佔
- 29. 關於Linux內核內部問題
- 30. 如果添加尾部斜線,URL會在Rails 4中打破?
非常感謝!我主要關心的是讀者是否會封鎖appender。 – bydsky
是的,讀者也可以阻止作者。在文件系統中固有地需要一些同步以避免訪問不一致的元數據或數據。我使用運行相同的實驗這段時間: 時間DD如果= /開發/測試= BS = 1數=千萬oflag中的零=追加 我得到的基準性能的DD: 真正0m24.808s 用戶0m0。 865S SYS 0m23.842s 而當ReadFile的運行: 真正0m33.996s 用戶0m1.116s SYS 0m31.751s PS:有在代碼中的錯誤(我需要初始化) – Radu
謝謝很多。我很震驚「我需要初始化」大聲笑 – bydsky