首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何最大限度地提高mmap性能?

如何最大限度地提高mmap性能?
EN

Stack Overflow用户
提问于 2020-04-12 05:47:41
回答 1查看 556关注 0票数 0

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

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

使用MAP_POPULATE和/或MAP_NONBLOCK是否具有性能优势

在使用mmap时,是否还有其他与性能相关的事项需要考虑?

EN

回答 1

Stack Overflow用户

发布于 2020-04-12 07:15:19

mmap操纵进程的虚拟地址空间,以及中央处理器和内存中的PTEs,这并不是一个廉价的操作。

Linus Torvalds多次回答了mmap的缺点

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

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

MAP_LOCKED确保页面不会被换出。

您可能还想尝试使用MAP_HUGETLB和一个MAP_HUGE_2MB, MAP_HUGE_1GB标志。如果适合您的应用程序,大页面可以最大限度地减少TLB未命中的数量。

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

只有当您想要修改映射页面时,MAP_PRIVATEMAP_SHARED才有关系。MAP_PRIVATE不会将您的修改传播到该文件或该文件的其他进程映射中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61164121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档