$ time wc -l clickstream.csv.1 336006288 clickstream.csv.1 real 10m4.575s ... $ time wc -l clickstream.csv.1 336006288 clickstream.csv.1 real 0m18.858s
现在我们切换到第二天的点击流文件。我们再多次运行 wc 命令来把文件装进内存。使用一个类LRU的策略会将第一天的数据淘汰,并将第二天的数据装进内存。不幸的是,在这种情况下,不管你运行多少次,Linux 内存管理器都不会把第二天的数据装进内存。
$ time wc -l clickstream.csv.2 336027448 clickstream.csv.2 real 9m50.542s $ time wc -l clickstream.csv.2 336027448 clickstream.csv.2 real 9m52.265s
事实上,如果你遇到这种情况,唯一能把第二天的数据装进内存的办法就是手动清除掉页缓存,很明显,这个做法会比问题带来的危害更大,但单就我们的这个小测试而言,确实凑效了。
$ echo 1 | sudo tee /proc/sys/vm/drop_caches 1 $ time wc -l clickstream.csv.2 336027448 clickstream.csv.2 real 9m51.906s $ time wc -l clickstream.csv.2 336027448 clickstream.csv.2 real 0m17.874s
回到上一步,这儿的问题在于Linux如何管理自己的页缓存。Linux内存管理器会将文件系统的页面放到两种类型的队列里面。一个队列(临近访问内存队列,下面简称:临近队列)放了最近访问到的页面。另一个队列(频率访问内存队列,下面简称:频率队列)保留了那些被多次访问到的页面。