【发布时间】:2010-07-15 20:57:16
【问题描述】:
我在使用 FreeBSD 和大型 mmap 时遇到了一些麻烦。 Linux 不会出现同样的问题。
在程序启动时,它总是可以获得 1 GB 的映射。但是,有一个重新加载操作,文件被替换和重新映射。新地图通常每次都会稍微大一点,因此它不能很好地融入旧的 mmap 位置。这种重映射在 FreeBSD 上经常失败,但在 Linux 上几乎没有。 (在使用 ASLR 的 Linux 上,它经常失败。FreeBSD 使用 ASLR 吗?)
我认为这是因为库加载了其他库以及在程序运行期间完成的内存分配导致虚拟内存空间碎片化。可能是 FreeBSD 的 malloc 实现或库加载的一些特殊性导致了这种情况。
我正在寻找一些我可以做的事情,以使其更有可能发挥作用。
我正在考虑的一件事是总是映射一个完整的 1 GB 空间,即使文件大小实际上可能是 890 MB。如果我能做到这一点,那么我将始终有一个 1 GB 的插槽来重新映射新的 895 MB 文件。
【问题讨论】:
-
您是否查看过
login.conf(5),特别是memorylocked和vmemoryuse? -
@Nikolai:没有设置这些限制。问题不是限制。我知道,因为 mmap 总是在程序启动时工作。
-
@Nikolai: 7.2 我还编辑了标题以指定。
-
7.0 及更高版本使用
jemalloc(canonware.com/jemalloc)。我在这里唯一可以建议的是使用/etc/malloc.conf中的选项。尝试D强制使用sbrk(2)而不是默认的M。