【问题标题】:32-bit FreeBSD 7.2 and 1GB mmaps32 位 FreeBSD 7.2 和 1GB mmap
【发布时间】: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),特别是memorylockedvmemoryuse
  • @Nikolai:没有设置这些限制。问题不是限制。我知道,因为 mmap 总是在程序启动时工作。
  • @Nikolai: 7.2 我还编辑了标题以指定。
  • 7.0 及更高版本使用jemalloc (canonware.com/jemalloc)。我在这里唯一可以建议的是使用/etc/malloc.conf 中的选项。尝试D 强制使用sbrk(2) 而不是默认的M

标签: posix freebsd mmap aslr


【解决方案1】:

问题可能是由于没有足够大的连续地址空间块引起的。很可能在具有 1Gb mmap 的 32 位系统上。

考虑仅使用 64 位系统(现在大多数公司都为生产服务器使用),或者使用 mmap() 代替几个较小的区域。

你不会解决这个问题的。

【讨论】:

    猜你喜欢
    • 2019-07-29
    • 1970-01-01
    • 2016-05-30
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    • 2013-03-19
    • 2012-03-27
    • 2012-05-03
    相关资源
    最近更新 更多