我目前正在开发一个 Apache 模块,该模块使用大型 mmap 文件在进程之间共享数据。这是在启动时创建的,并在服务器关闭时删除(可以选择在稍后阶段保留它)。我已经使用 Apache APR 库实现了它,它运行良好,至少对于较小的文件而言。
然而,当内存映射文件的大小增加时(服务器运行时仍然有足够的 RAM 来缓存它),系统有时几乎会停止运行,因为操作系统(在我的例子中是 Linux)似乎在消耗大量资源将文件与磁盘同步。有什么办法可以控制/减少这种同步吗?
因为我目前不需要将内容同步到磁盘,所以我可能应该使用共享内存段来代替,并将尝试这样做。然而,我仍然对控制内存映射文件同步的方法感兴趣。
最佳答案
写入您的映射文件会创建脏页 - 需要在某个时间点将其写出到其后备存储(在本例中为您的磁盘文件)的内存页。
脏页的写出可以通过 /proc/sys/vm/
中的一些旋钮进行调整。特别是,如果映射文件中的脏数据量与系统内存总量相比通常很大,您可能需要显着增加 dirty_ratio
(例如,增加到 60)和 dirty_background_ratio
一点点(比如,30)。
您可能还想增加 dirty_expire_centisecs
,但默认值已经很长(5 分钟)(这是脏数据在有资格被写出之前必须达到的年龄)。
值得指出的是,切换到共享内存只是在 /dev/shm/
中创建映射文件的简单问题,假设您的发行版在那里安装了一个 tmpfs
.
关于linux - Apache 模块中内存映射文件的过度同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4388964/