问题标签 [huge-pages]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - 如何使用 Linux hugetlbfs 进行文件的共享内存映射?
我有一个程序,它使用mmap()
共享内存来有效地访问大型数据库文件。我想尝试使用大页面,看看它是否可以加快速度。
我认为一种快速简便的方法是将数据库文件复制到 Linux 的hugetlbfs目录中,并在旧位置创建一个符号链接。
但是,这不起作用,因为该cp
命令无法写入文件。我怀疑文件只能通过调用ftrunc()
和mmap()
系统调用来写入文件来创建。我可能会尝试编写一个复制工具来执行此操作,除非我得到描述现有工具的答案。
我正在寻找在 Linux 中使用大页面进行共享内存映射的任何其他好方法。
php - 如何编写巨大的PDF文件
我正在使用 FPDF。
我需要每 10 页左右写入磁盘,否则内存会耗尽。
我该怎么做?
我尝试调用输出方法('filename.pdf','F');在一个循环中,这不起作用。
知道它应该是什么样子吗?
jvm - 无法创建启用了 -XX:+UseLargePages 的 JVM
我有一个当前使用 14GB 堆运行的 Java 服务。我很想试试-XX:+UseLargePages选项,看看这会如何影响系统的性能。我已经按照Oracle的描述使用适当的共享内存和页面值配置了操作系统(这些也可以使用在线工具计算)。
配置操作系统后,我可以看到它将预期的内存量分配为大页面。但是,使用选项集启动 VM-XX:+UseLargePages
始终会导致以下错误之一:
当-Xms
/-Xmx
几乎等于巨页分配时:
当-Xms
/-Xmx
小于大页分配时:
我确实尝试过引入一些余地——所以在一个 32GB 的系统上,我分配了 24GB 的共享内存和大页面来与配置有 20GB 堆的 JVM 一起使用,其中当前只有 14GB 被使用。我还验证了执行 JVM 的用户确实具有与/proc/sys/vm/hugetlb_shm_group
.
谁能给我一些关于我可能会出错的地方以及接下来我可以尝试什么的指示?
分配/使用:
-Xms
/-Xmx
- 20GB- 已用堆 - 14GB
/proc/sys/kernel/shmmax
- 25769803776 (24GB)/proc/sys/vm/nr_hugepages
- 12288
环境:
- 系统内存 - 32GB
- 系统页面大小 - 2048KB
- Debian 2.6.26-2-amd64
- Sun JVM 1.6.0_20-b02
解决方案
感谢@jfgagne提供了导致解决方案的答案。除了 /proc/sys/kernel/shmall
设置(指定为 4KB 页面)之外,我还必须按照Thomas 的博客/etc/security/limits.conf
中的描述添加条目。但是,当我的应用程序开始使用时,我还必须复制 root 用户的设置(请注意,限制以 KB 为单位指定):jsvc
还值得一提的是,可以通过使用-version
参数启动 JVM 来快速测试设置:
c - 使用多个进程将 malloc() 转换为 SYS V 共享内存
我正在改进一个程序以在 Linux 中使用静态分配的大页面,而不是标准的 4Kb 页面。我已经建立了一个支持静态大页面的系统,并在大页面池(/prov/sys/vm/nr_hugepages)中分配了大量的大页面。我现在希望通过程序找到大型 malloc() 发生的位置,以便我可以删除 malloc() 并将其替换为设置了 SHM_HUGETLB 标志的 shmget/shmat。
请记住,这是高度并发的程序。
我使用共享内存的目标不是以共享方式实际使用内存。我想保留 malloc() 例程的所有功能,同时只使用静态分配的大页面支持。
下面是我要完成的示例代码段。在程序达到这一点之前,它已经分叉了许多进程。每个进程将同时执行这段代码。最初,该段仅包含以下代码:
哪个工作正常。
现在我已将其修改为:
注意!!:我使用随机数作为密钥,因此每个进程都有一个随机密钥来标识它的独立内存分配。
每当我尝试从 PANEL->WORK 读取时,使用这个新实现时,我都会遇到分段错误。在我真正开始深入研究为什么这是段错误之前,我不禁想知道我是否正确地处理了这个问题。这是解决这个问题的最佳方法吗?有人认为这种方法有错误吗?
linux - 大页面的性能下降
我使用 Java 基准测试 (SPECJbb),但观察到启用大页面(每页 2M)时性能会有所下降。我们的服务器是NUMA
基于架构的,有 80 个内核(启用 HT 时为 160 个逻辑 CPU)和260G
内存。
基准测试消耗大约200G
内存,所以我在内核大页面池中分配了 200G 大。但性能6%~8%
下降。我想我应该有一些性能提升,因为这个基准测试使用了 200G 内存。
我的问题是,在什么情况下,使用大页面会降低性能?我们的操作系统是RHEL6.3
,我尝试了 HotSpot JDK 1.6.38
和1.6.37
,这两个版本我都发现了这种退化。谢谢。
windows - 如何在代码中使用 windows 大页面?
如果我们启用大页面,操作系统会为我利用它,还是我必须更改我们的代码?例如,我可以期望 HeapAlloc 在后台使用大页面吗?
我应该补充一点,我们使用的是 64 位 Windows Server 2008。
windows - 如何向 CreateFileMapping / OpenFileMapping 提供地址
有没有可以用来提供映射地址的函数?
我试图找出一种方法来利用大页面,即使我必须映射小文件。我知道我会浪费内存。或者,我可以使用 VirtualAlloc 来分配一个页面大小的块,然后我可以切块并将多个文件映射到其中。我假设,由于内存映射由虚拟内存子系统支持,因此这是不可能的 - 单个内存页面可能必须由单个文件支持。
我想在我做任何事情之前我会问。
windows - windows下,有没有办法强制堆栈使用大页面?
有没有办法编译一个 Windows 程序,以便它使用 SEC_LARGE_PAGES 或等效方法分配堆栈?
ubuntu - 如何在 Ubuntu 上默认启用透明大页面?
如何在 Ubuntu 上默认启用透明大页面?
java - 在 Linux 上的 java 热点 jvm 中使用大页面和 DirectByteBuffer
我想做什么
我需要使用直接内存来避免 GC 移动东西。我想为那些启用大页面。
至今
标志 -XX:+UseLargePages 在使用堆缓冲区(非直接 ByteBuffers)时工作正常,但在使用 DirectByteBuffers 时不再工作。我也尝试过使用 MappedByteBuffers 和一个hugetlbfs 文件系统。这可行,但会引发许多问题,因此我正在寻找不同的解决方案。
配置 CentOS release 6.3、hotspot、jdk1.7
[编辑]
查看热点源代码,他们使用 malloc 来分配具有 Unsafe 的内存,是否需要 shmat/shmget 或 mmap 才能使用大页面。
[编辑] 为什么非堆内存
我们在一个 NUMA 上下文中,对于一个内存数据库,有很多长寿命的对象。当 UseNUMA 标志打开时,JVM 不会对旧代进行分区。使用直接内存允许我们让内存靠近需要它的线程。
在决定使用 DirectByteBuffers 的过程中,基准测试显然发挥了重要作用。我不是在问我是否应该使用 DirectByteBuffer,而是在寻找我的问题的答案。