Linux页面缓存替换

时间:2012-11-20 09:00:01

标签: postgresql memory-management amazon-ec2 linux-kernel page-caching

我有两个名为data-1和data-2的PostgreSQL数据库位于同一台机器上。两个数据库都保留40 GB的数据,机器上可用的总内存为68 GB。

我启动了data-1和data-2,并运行了几个查询来遍历所有数据。然后,我关闭data-1并继续发出针对data-2的查询。出于某种原因,操作系统仍然在其页面缓存中保留大部分数据1的页面,并为数据2的文件保留大约35 GB的RAM。结果,我对data-2的查询不断发出磁盘。

我正在使用fincore检查页面缓存使用情况。当我对数据2运行表扫描查询时,我看到数据2的页面被逐出并以循环方式放回缓存中。 data-1的页面没有任何变化,尽管它们已经好几天都没有被触及过。

有人知道为什么数据1的页面不会从页面缓存中逐出?我对你认为可能与问题有关的各种建议持开放态度。

这是亚马逊上的EC2 m2.4xlarge实例,内存为68 GB,没有交换空间。内核版本是:

$ uname -r
3.2.28-45.62.amzn1.x86_64

编辑-1:

似乎没有NUMA配置:

$ dmesg | grep -i numa
[    0.000000] No NUMA configuration found

编辑-2:

我在Linux内核源代码树中使用了page-types工具来监控页面缓存状态。从结果我得出结论:

data-1 pages are in state : referenced,uptodate,lru,active,private
data-2 pages are in state : referenced,uptodate,lru,mappedtodisk

1 个答案:

答案 0 :(得分:1)

查看您在/dev/cpusets中配置的cpusets。如果你在这里有多个目录,那么你有多个cpusets,并且可能有多个内存节点。

这里详细记录了cpusets机制:http://www.kernel.org/doc/man-pages/online/pages/man7/cpuset.7.html