我目前正在开发一个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/