我正在使用976 GB内存的Linux机器上写入930GB文件(预分配)。
该应用程序是用C ++编写的,我正在使用Boost Interprocess对文件进行内存映射。在开始代码之前,我先设置堆栈大小:
ulimit -s无限
一周前写作非常快,但是今天运行缓慢。我不认为代码已更改,但是我可能不小心更改了环境中的某些内容(它是一个AWS实例)。
应用程序(“ write_data”)似乎并未使用所有可用内存。 “顶部”显示:
julia> using Pkg
我认为驻留大小(RES)应该包括内存映射数据,所以它不应该> 930 GB(文件大小)吗?
有人可以建议诊断问题的方法吗?
答案 0 :(得分:2)
通常不急于填充内存映射。如果其他程序将文件强行放入页面缓存,则从一开始就可以看到良好的性能,否则,在页面被分页时,您将看到较差的性能。
鉴于您有足够的RAM将整个文件保存在内存中,您可能希望向OS提示它应预取文件,从而减少由页面错误触发的小批量读取的数量,代替大批量读取。通过将POSIX_MADV_WILLNEED
作为advice
传递,The posix_madvise
API可用于提供此提示,指示它应预取整个文件。