test 1025 1084 1024
cp 3 36 18
...
#第二次拷貝test,我們可以看到 用戶要1025個頁面,預讀決定讀284,但是實際IO讀了0,很合理,因為所有的頁面在pagecache里面都已經存在
Tue May 31 05:50:46 2011, TOTAL: 1038, SKIP: 804, REQ: 1039, TO_RD: 328, NR_RD: 0
FILENAME REQ TO_RD NR_RD
test 1025 284 0
cp 3 4 0
...
Linux系統不僅為文件的讀取提供自動預讀,還提供了readahead這樣的系統調用和工具,幫助用戶主動預加載數據,我們演示下:
$ readahead junk
Preloaded 0 files (0 KB) in 5 ms
另外一個窗口說:
Tue May 31 05:57:45 2011, TOTAL: 1044, SKIP: 805, REQ: 1045, TO_RD: 348, NR_RD: 0
FILENAME REQ TO_RD NR_RD
junk 1026 284 0
readahead 3 4 0
Linux還支持對每個設備設定預讀的默認大小,不同的大小可以用來控制預讀的力度,用戶可以自行改變:
$ pwd
/sys/block/sda/queue
$ cat read_ahead_kb
128
$ echo 256 |sudo tee read_ahead_kb
256
后續我會用這個工具分析leveldb數據庫的行為,歡迎關注!
總結: 如果actual讀比用戶req的要多很多, 那么我們的很多預讀就浪費了,可以考慮減少預讀的大小。
原文轉自:http://blogread.cn/it/article/3670