内存映射文件访问非常慢

时间:2018-08-11 02:34:58

标签: c++ linux memory boost-interprocess

我正在使用976 GB内存的Linux机器上写入930GB文件(预分配)。

该应用程序是用C ++编写的,我正在使用Boost Interprocess对文件进行内存映射。在开始代码之前,我先设置堆栈大小:

  

ulimit -s无限

一周前写作非常快,但是今天运行缓慢。我不认为代码已更改,但是我可能不小心更改了环境中的某些内容(它是一个AWS实例)。

应用程序(“ write_data”)似乎并未使用所有可用内存。 “顶部”显示:

julia> using Pkg

我认为驻留大小(RES)应该包括内存映射数据,所以它不应该> 930 GB(文件大小)吗?

有人可以建议诊断问题的方法吗?

1 个答案:

答案 0 :(得分:2)

通常不急于填充内存映射。如果其他程序将文件强行放入页面缓存,则从一开始就可以看到良好的性能,否则,在页面被分页时,您将看到较差的性能。

鉴于您有足够的RAM将整个文件保存在内存中,您可能希望向OS提示它应预取文件,从而减少由页面错误触发的小批量读取的数量,代替大批量读取。通过将POSIX_MADV_WILLNEED作为advice传递,The posix_madvise API可用于提供此提示,指示它应预取整个文件。