1

我目前正在研究一个使用大型 mmap 文件在进程之间共享数据的 Apache 模块。这是在启动时创建并在服务器关闭时删除(可以选择在稍后阶段保留它)。我已经使用 Apache APR 库实现了这一点,它运行良好,至少对于较小的文件。

然而,当内存映射文件的大小增加时(当服务器运行时仍有足够的 RAM 来缓存它),系统有时实际上会停止运行,因为看起来操作系统(在我的例子中是 Linux)消耗了很多将文件与磁盘同步的资源。有没有办法控制/减少这种同步?

由于我目前不需要将内容同步到磁盘,因此我可能应该使用共享内存段,并且会尝试使用它。然而,我仍然对控制内存映射文件同步的方法感兴趣。

4

2 回答 2

2

写入映射文件会创建脏页——内存页在某些时候需要写出到它们的后备存储(在这种情况下,是您的磁盘文件)。

脏页的写出可以通过/proc/sys/vm/. 特别是,如果映射文件中的脏数据量通常比系统总内存大,那么您可能希望dirty_ratio显着增加(例如,增加到 60)和dirty_background_ratio一点点(例如,增加到 30)。

您可能还想增加dirty_expire_centisecs,但默认值已经很长(5 分钟)(这是脏数据必须达到的时间,才能有资格写出)。

值得指出的是,切换到共享内存只是在 中创建映射文件的问题/dev/shm/,假设您的发行版安装在tmpfs那里。

于 2010-12-09T02:50:57.997 回答
0

内存映射文件与 显式同步msync(),尽管操作系统可以在页面错误的情况下刷新内存的内容。所以有几件事要寻找:

  1. Apache APR 库的源代码是否有很多msync()'?
  2. 您的应用程序是否在内存中跳跃?即,您是否正在访问非连续内存?这通常发生在不正确的数据结构或嵌套循环索引与多维数组索引不匹配时。

您可以尝试分析您的代码以查看是否存在会导致意外数量的页面错误的低效率。

于 2010-12-08T15:21:17.353 回答