我有一个服务器,我运行工作进程,mmap serveral相当大的只读“字典”文件(共约8GB)。 testing表明,他们只能在这些文件中只有大约1GB左右的页面。 在同一台服务器上,我运行另一个顺序读取大文件的进程,合并一些更新,并将结果写入这个巨大文件的新版本。 除了这个“合并”过程和“工作者”过程之外,服务器上没有其他的主要活动。 所以通常情况下,工人应该受到CPU限制,合并应该是磁盘的。 但我所看到的是,工人们经常扼杀主要的页面错误。 合并使用大约20GB的RSS和机器有48GB。 有4名工人。 他们有2GB的RSS每个,只有600MB的共享(而不是预期的1GB的热页)。 不知何故,内存的其余部分主要由fscaching使用。 有没有办法“优先”我mmaped文件的热页面内存? 我试图madvise(MADV_WILLNEED),但似乎没有帮助。 也许有一个与cgroups或sysctls解决scheme?
$免费
caching总共使用的空闲共享缓冲区
Mem:49324064 48863392 460672 0 22520 25409896
- / + buffers / cache:23430976 25893088
交换:0 0 0
$ uname -a
Linux dev-kiwi02 3.2.0-25-server#40-Ubuntu SMP Fri May 25 13:12:35 UTC 2012 x86_64 GNU / Linux
PS在StackOverflow上已经问过这个问题,但看起来像ServerFault更合适。
你可能需要的是mlock(),而不是madvise()。 马德维斯太弱, mlocklocking内核中的内存。 假设你有足够的内存,只locking“热”页面(不是整个8GB),这不应该是你的设置问题。
另一个可能看起来不符合直觉的解决scheme是:禁用交换。 你的机器有48GB; 减去4名工作人员,共享数据和你的操作系统,你还剩> 35 GB。 你写你的合并文件顺序读取一个文件,并插入一些条目; 因此我假设你不需要将大文件保留在内存中,但可以依次写出来; 你只需要加载内存中的所有更新,这应该不成问题。