【问题标题】:memory mapped file access is very slow内存映射文件访问非常慢
【发布时间】:2019-01-18 15:05:26
【问题描述】:

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

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

ulimit -s 无限制

一周前写得很快,但今天写得很慢。我认为代码没有更改,但我可能不小心更改了环境中的某些内容(它是一个 AWS 实例)。

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

Tasks: 559 total,   1 running, 558 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni, 98.5%id,  1.5%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  1007321952k total, 149232000k used, 858089952k free,   286496k buffers
Swap:        0k total,        0k used,        0k free, 142275392k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                  
  4904 root      20   0 2708m  37m  27m S  1.0  0.0   1:47.00 dockerd                                                                  
 56931 my_user   20   0  930g  29g  29g D  1.0  3.1  12:38.95 write_data                                                          
 57179 root      20   0     0    0    0 D  1.0  0.0   0:25.55 kworker/u257:1                                                           
 57512 my_user   20   0 15752 2664 1944 R  1.0  0.0   0:00.06 top

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

有人可以提出诊断问题的方法吗?

【问题讨论】:

  • 我们带着 32k 去月球......

标签: c++ linux memory boost-interprocess


【解决方案1】:

内存映射通常不会急切地填充。如果某些其他程序将文件强制放入页面缓存,您会从一开始就看到良好的性能,否则您会看到文件被分页时性能不佳。

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

【讨论】:

    猜你喜欢
    • 2016-02-23
    • 2020-11-09
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    相关资源
    最近更新 更多