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