我目前正在开发一个Apache模块,该模块使用大型mmap文件在进程之间共享数据。这是在启动时创建的,并在服务器关闭时删除(可以选择将其保留在稍后阶段)。我使用Apache APR库实现了这一点,它运行良好,至少对于较小的文件。
当内存映射文件的大小增加时(在服务器运行时仍然有足够的RAM来缓存它)系统有时几乎停止运行,因为操作系统(在我的情况下是Linux)似乎消耗了很多资源将文件与磁盘同步。有没有办法控制/减少这种同步?
由于我现在不需要同步到磁盘的内容,我应该使用共享内存段,而是尝试使用它。然而,我仍然对控制内存映射文件同步的方法感兴趣。
答案 0 :(得分:2)
写入映射文件正在创建脏页 - 在某些时候需要写入其后备存储(在本例中为磁盘文件)的内存页。 / p>
脏页的写出可以通过/proc/sys/vm/
中的一些旋钮进行调整。特别是,如果映射文件中的脏数据量通常比整个系统内存大,那么您可能希望显着增加dirty_ratio
(例如,增加到60),dirty_background_ratio
增加一点(说,到30)。
您可能还想增加dirty_expire_centisecs
,但默认值已经很长(5分钟)(这是脏数据在有资格进行注销之前必须达到的年龄)。
值得指出的是,切换到共享内存只需在/dev/shm/
中创建映射文件,假设您的发行版在那里安装了tmpfs
。
答案 1 :(得分:0)
内存映射文件与msync()
显式同步,但操作系统可以在发生页面错误时刷新内存的内容。所以要寻找几件事:
msync()
?您可以尝试对代码进行分析,以查看是否存在导致意外数量的页面错误的低效率。