问题标签 [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.
c - 顺序访问内核驱动程序中的大页面
我正在使用由大页面支持的缓冲区的驱动程序,并且我发现大页面的顺序性存在一些问题。
mmap
在用户空间中,程序使用系统调用分配由大页面支持的大缓冲区。然后通过ioctl
调用将缓冲区传送给驱动程序。驱动程序使用该get_user_pages
函数来获取该缓冲区的内存地址。
这适用于 1 GB(1 个大页面)的缓冲区大小。get_user_pages
返回很多页面(HUGE_PAGE_SIZE / PAGE_SIZE
),但它们都是连续的,所以没有问题。我只是抓取第一页的地址page_address
并使用它。remap_pfn_range
当另一个程序mmap
在 char 设备上进行调用时,驱动程序还可以将该缓冲区映射回用户空间。
但是,当缓冲区由多个大页面支持时,事情会变得复杂。内核似乎可以返回一个由非顺序大页面支持的缓冲区。即,如果大页面池的布局是这样的
,可以通过保留 HP1 和 HP4 或 HP3 然后 HP2 来满足对大页面支持缓冲区的请求。这意味着当我get_user_pages
在最后一种情况下获得页面时,页面 0 的地址实际上是页面 262.144 (下一个大页面的头部)地址之后的 1 GB。
有什么方法可以按顺序访问这些页面?我尝试重新排序地址以找到较低的地址,以便我可以使用整个缓冲区(例如,如果内核给了我一个由 HP3 支持的缓冲区,HP2 我使用 HP2 的一个作为基地址),但似乎会打乱数据在用户空间中(该重新排序缓冲区中的偏移量 0 可能是用户空间缓冲区中的偏移量 1GB)。
TL;DR:给定 >1 个无序大页,有没有办法在 Linux 内核驱动程序中按顺序访问它们?
顺便说一句,我正在使用具有 3.8.0-29-generic 内核的 Linux 机器。
c++ - 确定通过 malloc() 进行的分配是否由大页面支持
我非常了解透明大页面的工作原理,并且任何分配,例如由大页面执行的分配,malloc
都可能被大页面满足。
我想知道的是,在分配后是否可以进行任何检查(可能是启发式的)以确定内存是否由大页面支持。
linux-kernel - 如何在内核和用户空间之间共享大页面
我知道如何在 linux 内核中获取普通页面并使用基于此代码的 mmap 与用户进程共享:http: //people.ee.ethz.ch/~arkeller/linux/multi/kernel_user_space_howto-8.html 现在我想要将其扩展为使用大页面(2M)。
将备份共享内存的文件放在hugetlbfs文件系统中就足够了吗?你也可以给我指一个关于使用大页面的教程吗?
到目前为止的进展: 我使用hugeadm启用了hugepages和透明hugepages,并添加了相应的grub配置。
stackoverflow 上的这篇文章说对 alloc_pages 使用以下参数
它不起作用,因为 /proc/meminfo 仍然说所有大页面都是免费的。
然后我变了
至
但发生了以下错误:
memory-management - 通过 SYSFS 设置 nr_hugepages 时出错
我有 8G 的物理内存,Fedora20,并配置了内核参数,通过将以下参数传递给内核,在启动时分配两个 1G 的巨页:
HugeTLBFS 是自动挂载的:
重新启动后,一切看起来都很好,我看到内核已经分配了所需的页面:
如您所见,可用内存量应该允许我增加大页面的数量,但是我没有这样做:
或者
也减少页数失败。我究竟做错了什么?
performance - 建议 Prolog 处理器使用大页面
是否有任何 Prolog 实现支持使用大页面(每个内存页面 2MB/4MB)而不是普通的 4Kb 内存页面。
理想情况下,我想向解释器/编译器/运行时声明,对于某些特定应用程序,可以将 X 大页面用于各种堆/堆栈/暂存器内存。
当然,并非所有应用程序都可以从中受益,但我相信会有很多应用程序可以从中受益。毕竟,兆字节是新的千字节:)
mysql - 大页面不适用于 mariadb
我们尝试为使用 galera 集群运行的 mariabdb 设置大页面。我们已经分配了足够高的大页面来容纳 innodb 缓冲区。
服务器配置文件
/etc/sysctl.conf
/etc/security/limits.conf
免费-m
mysqld.log 中的错误
cat /proc/meminfo |grep -i 巨大的
c - 使用 mmap 和 madvise 处理大页面
我想在 Linux 机器正在使用的大页面上分配内存。我看到有两种方法可以做到这一点,使用mmap
和madvise
。
也就是说,MAP_HUGETLB
在调用中使用标志mmap
-
还有那MADV_HUGEPAGE
面旗帜madvise
——
有人可以解释两者之间的区别吗?
c - 如何转储页表?
我是 linux、C 和堆栈溢出的新手。我试图查看所有正在运行的进程的页表。为此,我正在使用dump_pagetable.c。
我尝试通过正常编译先运行gcc dump_pagetables.c -o dump_pagetables.out
。但它给了我错误:
- 如何让这段代码运行?
- 如何修改
dump_pagetables.c
以便我也可以看到大页面。
python - 由 Python 多处理分叉的空 Python 进程的私有内存
我正在通过 Python 多处理创建几个子进程,但这些子进程即使是空进程也使用大量堆私有内存。在启用了 THP(透明大页面)的 RHEL 上运行时,这种情况会变得更糟。
- 空子进程的堆私有内存中有什么?
- 在linux COW(写时复制)下,子进程不应该共享所有内存,因为它不创建/修改任何内存页面?或者子进程正在尝试修改/写入内存页面,那么它正在尝试修改/写入什么样的数据?
- 还是因为喜欢python对象引用计数或其他原因?
这是一个简单的例子来演示这个:
输出:
子进程的 priv 内存(925696B,或堆中的 664KB)中有什么?
父进程堆内存:
006cc000-00be4000 rw-p 00000000 00:00 0 [堆]
大小:5216 KB
RSS:4120 KB
pss: 4120 KB
Shared_Dirty:0 kB
Private_Dirty:4120 kB
参考:4120 kB
匿名:4120 kB
AnonHugePages:0 kB
内核页面大小:4 kB
子进程堆内存:
006cc000-00be4000 rw-p 00000000 00:00 0 [堆]
大小:5216 KB
RSS:4396 KB
pss: 2530 KB
Shared_Dirty:3732 kB
Private_Dirty:664 kB
参考:676 kB
匿名:4396 kB
AnonHugePages:0 kB
内核页面大小:4 kB