gpt4 book ai didi

linux - 如何最大化 mmap 性能?

转载 作者:行者123 更新时间:2023-12-05 03:54:11 25 4
gpt4 key购买 nike

我正在使用 mmap 来读取/写入我正在以类似数据库的方式使用的文件。该文件比可用 RAM 大得多。我的用例是单进程、多线程的。如何最大限度地提高访问 mmap 内存的性能?

我假设我应该使用 MAP_PRIVATE 而不是 MAP_SHARED 来利用写时复制。

使用 MAP_POPULATE 和/或 MAP_NONBLOCK 是否有任何性能优势?

在使用 mmap 时,我还应该考虑其他任何与性能相关的事情吗?

最佳答案

mmap操纵进程的虚拟地址空间和 PTEs在 CPU 和 RAM 中,这不是一个便宜的操作。

Linus Torvalds 多次回复了 mmap 的缺点:

最小化 mmap 的一种方法成本是将文件(或其中的一部分)映射到相同的虚拟地址空间范围内,因此不需要 PTE 操作。

mmap没有MAP_POPULATE在进程中保留虚拟地址空间,但不支持硬件内存页,以便线程在第一次访问该页时引发页错误硬件中断,内核通过映射实际硬件来处理该中断内存页。 MAP_POPULATE允许您避免这些页面错误,但可能需要更长的时间才能从 mmap 返回.

MAP_LOCKED确保页面不会被换出。

您可能还想尝试使用 MAP_HUGETLBMAP_HUGE_2MB, MAP_HUGE_1GB 之一旗帜。如果适合您的应用程序,大页面会尽量减少 TLB 的数量错过。

尝试使用 numactl 将线程绑定(bind)到同一个 NUMA 节点确保线程只访问本地 NUMA 内存。例如。 numactl --membind=0 --cpunodebind=0 <app> .

MAP_PRIVATE对比MAP_SHARED仅当您想修改映射页面时才重要。 MAP_PRIVATE不会将您的修改传播到文件或该文件的其他进程映射。

关于linux - 如何最大化 mmap 性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61164121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com