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

标签 linux apache2 mmap apr

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

相关文章:

php - 安装 LAMP - PHP 无法连接 MySQL - 为什么?

c++ - mmap 内存区域的总线错误

c - 在代码中使用 turboboost 测量 CPU 频率

cors - 尽管响应也有 Vary : Origin,但带有 ETag header 的 Access-Control-Allow-Origin 响应似乎已被缓存

linux - 复用char * 指针需要free 和malloc 吗?

apache2 - 本地主机无法连接到所需的虚拟主机

c++ - 如何在 C++ 中使用 mmap 将整数数组正确写入文件

c - 在父进程和子进程之间共享用于 stdio 缓冲的缓冲区是否合法?

linux - vncviewer,virt-viewer 无法打开显示

c - 如何解决这个语义错误?