Apache模块中内存映射文件的过度同步

时间:2010-12-08 15:06:40

标签: linux apache2 mmap apr

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

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

由于我现在不需要同步到磁盘的内容,我应该使用共享内存段,而是尝试使用它。然而,我仍然对控制内存映射文件同步的方法感兴趣。

2 个答案:

答案 0 :(得分:2)

写入映射文件正在创建脏页 - 在某些时候需要写入其后备存储(在本例中为磁盘文件)的内存页。 / p>

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

您可能还想增加dirty_expire_centisecs,但默认值已经很长(5分钟)(这是脏数据在有资格进行注销之前必须达到的年龄)。

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

答案 1 :(得分:0)

内存映射文件与msync()显式同步,但操作系统可以在发生页面错误时刷新内存的内容。所以要寻找几件事:

  1. Apache APR库的源代码是否有很多msync()
  2. 您的应用程序是否在内存中跳跃?即,你是否访问非亮片记忆?这通常发生在不正确的数据结构或嵌套循环索引与多维数组索引不匹配时。
  3. 您可以尝试对代码进行分析,以查看是否存在导致意外数量的页面错误的低效率。