- 上一篇 Linux系统缓存知识整理 中提到几个测试用例,这里补充一下详细的测试数据和结论。
LRU缓存回收策略的验证
环境信息:
[root~]# uname -r
2.6.32-431.el6.x86_64
[root~]# cat /etc/redhat-release
CentOS release 6.5 (Final)
[root~]# free -g
total used free shared buffers cached
Mem: 62 10 52 0 0 2
-/+ buffers/cache: 7 55
Swap: 31 0 31
准备工作:
- 构造两个32GB大小的文本文件(即:让文件大小超过缓存最大大小的一半)
- 这个用例主要是验证网上讲到的一个问题: 使用大数据时,别忘了关注Linux内存管理器
[root]# ls -lhtr
total 64G
-rw-r--r-- 1 root root 32G May 3 14:36 file1.csv
-rw-r--r-- 1 root root 32G May 3 14:45 file2.csv
操作步骤:
第一组测试
- 先多次执行time wc -l file1.csv,观察每次执行所用时间
- 在不清理缓存情况下,多次执行time wc -l file2.csv,观察每次执行所用时间。
- 同时使用linux-fincore工具查看file1和file2这两个文件的cache情况(关于这个工具也请参考上一篇博文的介绍)
测试数据:
- 先多次(大约六七次) wc -l file1.csv, 可以看到file1.csv被完全cache住:
# 第一次执行耗时5分钟多
[root]# time wc -l file1.csv
107746446 file1.csv
real 5m8.501s
user 0m5.280s
sys 0m16.962s
# 第二次执行只用了22秒
[root]# time wc -l file1.csv
107746446 file1.csv
real 0m22.138s
user 0m2.133s
sys 0m8.252s
# 第三次执行只用了9秒,且之后都是9秒左右。
[root@192-168-19-124 cache_test]# time wc -l file1.csv
107746446 file1.csv
real 0m9.550s
user 0m2.168s
sys 0m6.785s
# 第三次执行之后,查看file1的缓存情况:
[root]# ./linux-fincore --pages=false --summarize --only-cached /home/cache_test/*
filename size total_pages min_cached page cached_pages cached_size cached_perc
-------- ---- ----------- --------------- ------------ ----------- -----------
/home/cache_test/file1.csv 33,792,286,436 8,250,070 0 8,250,070 33,792,286,720 100.00
---
total cached size: 33,792,286,720
- 不清理缓存,直接执行
wc -l file2.csv
。同样耗时5分多。但通过fincore查看,直到命令被执行完、且通过free看到系统内存几乎耗尽,file2被cache的大小也只占到 33.8%,而file1.csv仍然被cache 98.7%
[root]# time wc -l file2.csv
102468691 file2.csv
real 5m23.170s
user 0m4.718s
sys 0m20.965s
[root]# free -g Fri May 4 15:11:54 2018
total used free shared buffers cached
Mem: 62 60 2 0 0 45
-/+ buffers/cache: 15 47
Swap: 31 0 31
[root]# ./linux-fincore --pages=false --summarize --only-cached /home/cache_test/*
filename size total_pages min_cached page cached_pages cached_size cached_perc
-------- ---- ----------- ----------