问题标签 [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.
cpu - TLB中可以存储的hugepage条目的数量是否有限制
我正在尝试分析虚拟机在使用大页面时获得的网络性能提升。为此,我通过更改 grub 命令行并重新启动将虚拟机管理程序配置为具有多个 1G 大页面(36),并且在启动 VM 时,我确保将大页面传递给 VM。在启动 8 个虚拟机(每个都有 2 个 1G 的大页面)并在它们之间运行网络吞吐量测试时,发现吞吐量比没有大页面时的运行速度要低得多。这让我想知道,这是否与我使用的大页面数量有关。可以使用 TLB 引用的 1G 大页面的数量是否有限制,如果有,是否低于常规大小页面的限制?我怎么知道这些信息。在这种情况下,我使用的是 Ivy Bridge 系统,并使用 cpuid 命令,我看到了类似
这是否意味着我在 TLB 中任何时候都只能有 4 个 1G 的大页面映射?
dpdk - DPDK application cannot work for no free hugepage
I am building the Helloworld
application in DPDK. I get an error that says No free hugepages reported in hugepages-1048567
.
(1) I build the DPDK-18.11 using RTE_TARGET=x86_64-linuxapp-native-gcc
.
(2) I run usertools/dpdk-setup.sh
, run [15]
(build DPDK).
(3) run [22]
, allocate hugepages. I set 1024 hugepages.
(4) run [18]
, insert igb_uio
module.
(5) run [24]
, bind my NIC (e1000e
) to igb_uio
module.
Then, I go to examples/helloworld/
, run make
to build the app. When I run
./build/app/helloworld -l 0-1 -n 4
, I get the following nofication (No free hugepage):
I have already allocated hugepages
in the setup script, and get the following output:
Furthermore, I find e1000e
cannot bind to VFIO
, so I only use igb_uio
driver.
My host profile is : CPU:
Memory:
The things go worse when I run pktgen-3.6.0
. I get the following error:
Could you share me some idea? Thank you for your time.
linux-kernel - 在内核模块中分配大页面
我正在寻找一种在内核模块中分配大页面(2M 或 1G)的方法(我使用的是内核版本 4.15.0)。
在用户空间中,我可以挂载hugetlbfs
文件系统,然后使用mmap
(参见,例如,https ://blog.kevinhu.me/2018/07/01/01-Linux-Hugepages/ )分配大页面。在内核空间中是否有类似的方法可以做到这一点?
我知道我可以先在用户空间中分配它们,然后使用 将它们传递给内核get_user_pages
,如Sequential access to hugepages in kernel driver 中所述。但是,我正在寻找一种更直接的方式来分配它们,因为我只需要在内核空间中使用它们。
memory - 内存分配太慢
我在 AWS(m4.15xlarge
和m5.12xlarge
实例)上运行一些内存密集型服务,并注意到在某些条件下(通常在某个内存限制之后)分配额外内存所需的时间显着增加(高达 50 倍)。
当它发生时,htop
在内核模式下显示 100%(红色),perf top
看起来像这样:
在正常操作期间,它看起来像这样:
我不完全明白是什么触发了这种行为。有时它很难重现,但有时它一直在发生。
我有一个假设,这与 AWS 虚拟化有关(因此问题是间歇性的,我将其归因于“邻居”上发生的事情)(请参阅下面的更新)。我也无法在m5.metal
机器上重现该问题。
我能够使用一个简单的 C 程序来重现该问题,该程序在循环中分配和初始化内存:
这次我只能在接近内存限制的情况下解决问题,但即使在 20Gb(可用 186Gb 中)也能解决问题。
如果有人可以对正在发生的事情以及如何摆脱这种影响进行遮掩,我将不胜感激。
更新:
我已经更多地解决了这个问题,目前指责透明大页面支持 (THP) 恰好被启用 ( always
) onm5.12xlarge
和禁用 ( madvise
) on m5.metal
。在切换机器上的设置后,我能够解决问题m5.metal
并且问题消失了m5.12xlarge
。
c - 使物理地址区域中的虚拟地址连续如何提高性能?
最近我在 dpdk(dpdk.org) 中阅读有关大页面的代码。我看到代码故意使虚拟地址在物理地址区域中连续。具体来说,它首先检查hugepages中是否存在物理上连续的区域,并将物理上的连续区域映射到连续的虚拟地址中。这如何提高性能?
源代码说:
为了保留大量连续的内存,我们使用了 linux 的 hugepage 特性。为此,我们需要安装 hugetlbfs。此代码将在此目录中创建许多文件(每页一个)并将它们映射到虚拟内存中。对于每个页面,我们将检索其物理地址并重新映射它,以便拥有一个虚拟连续区域和一个物理连续区域。
为什么需要重新映射?
huge-pages - mmap 分配的大页面比 posix_memalign 慢
我使用正常malloc
的 andposix_memalign
来mmap
测试性能。我的测试结果是:
malloc
耗时约29.7s,posix_memalign
耗时约23.5s,mmap
与malloc
. 两者都posix_memalign
使用mmap
大页面。为什么一个有明显改善,另一个没有?我是否mmap
以错误的方式使用?我不为 mmap 做 bzero 因为手册页说“它的内容被初始化为零”。
cassandra - Cassandra 大页面清单
在阅读了它之后,我决定尝试为 cassandra 启用大页面。然而,在设置了一些东西之后,cassandra 根本没有启动。我怀疑我错过了一些实际允许 cassandra 使用大页面所必需的重要设置,但我不确定是什么。
具体来说,我做了:
112 是 cassandra 组 ID,并在 cassandra-env.sh 中添加了以下内容:
我在 debian 拉伸上使用 cassandra 3.11.3。
我正在阅读以下文档:
- https://tobert.github.io/tldr/cassandra-java-huge-pages.html
- https://docs.openstack.org/nova/rocky/admin/huge-pages.html
- https://blog.pythian.com/performance-tuning-hugepages-in-linux/
- https://gist.github.com/tobert/c13803b905069b82e1fd
注意:虽然 /var/log/cassandra 中没有任何内容,但我在 /var/lib/cassandra/hs_err_1557985546.log 中发现了以下内容:
因此,问题似乎在于它没有使用 HugePages 并且没有足够的非巨大内存。但为什么?
linux - 如何将 HugePages 与 pmem 分配一起使用?
在我的 Ubuntu 18.04 Intel 系统中,有 356gb 的 DDR。在这个内存中,300gb 是使用 pmem 机制预先分配的(因为我们有一个外部硬件向我们发送 10gb 的连续数据块)。我们以完全随机的方式访问此内存。
我们在访问此内存时目睹了内存 tpt 下降,并且我们了解到对 TLB 的许多访问/更新导致性能下降。
出于这个原因,我们试图用大页面来映射我们的 pmem,但目前没有成功。
有没有人有使用 pmem 处理大页面的经验?也许我们的场景有其他解决方案?
c - TLB、CPUID 和大页面?
如果我将 64MB 的 2MB 大页面挂载到 /mnt/huge2mb,这些页面使用哪些 TLB 条目?我mmap()
在我的 C 程序中编辑了它们。
cpuid
的输出:
我相信那些挂载的 2MB 大页面属于数据,因此它们使用数据 TLB 条目。
但是,数据 TLB 条目用于 1G 和 4K 页面。
那么,那些 2MB 的大页面使用了哪些 TLB 条目?L2 TLB 条目?如果是,什么是 L2 TLB?数据和指令都适用吗?如果是,那么 4K 页面的数据存在重叠——数据 TLB 和 L2 TLB。那么 4K 页面的额外 64 个条目的目的是什么?
谢谢!
kubernetes - mlock k8s pod 中的一个大页面返回 ENOMEM
我在具有 SYS_ADMIN 功能的 k8s pod 容器中运行一个程序。该程序分配了 2 MB 的大页面,它成功了。然后在该内存上调用 mlock() ,但失败了。
我查看了 ENOMEM 的手册页,没有一个原因可以解释这个问题。
我尝试在主机上运行程序,工作正常。
我尝试使用具有相同图像的 SYS_ADMIN 在 docker 容器上运行该程序。
我检查了 OCI config.json 文件中直接 docker 案例与下面显示的 k8s 案例之间的区别,我没有看到任何有趣的东西..
版本
以下 yaml 文件在 /tmp/test 中使用了测试程序
重现步骤:
测试程序