我正在使用mmap读/写一个我正在以类似于数据库的方式使用的文件。该文件比可用RAM大得多。我的用例是单进程、多线程。如何最大限度地提高访问mmap内存的性能?
我假设我应该使用MAP_PRIVATE而不是MAP_SHARED来利用写时复制的优势。
使用MAP_POPULATE和/或MAP_NONBLOCK是否具有性能优势
在使用mmap时,是否还有其他与性能相关的事项需要考虑?
发布于 2020-04-12 07:15:19
mmap操纵进程的虚拟地址空间,以及中央处理器和内存中的PTEs,这并不是一个廉价的操作。
Linus Torvalds多次回答了mmap的缺点
最小化mmap成本的一种方法是将文件(或部分文件)映射到相同的虚拟地址空间范围,这样就不需要PTE操作。
不带MAP_POPULATE的mmap保留了进程中的虚拟地址空间,但不使用硬件内存页来支持它,因此线程在第一次访问该页时会引发页错误硬件中断,内核通过映射实际的硬件内存页来处理该中断。MAP_POPULATE允许您避免这些页面错误,但是从mmap返回可能需要更长的时间。
MAP_LOCKED确保页面不会被换出。
您可能还想尝试使用MAP_HUGETLB和一个MAP_HUGE_2MB, MAP_HUGE_1GB标志。如果适合您的应用程序,大页面可以最大限度地减少TLB未命中的数量。
尝试使用numactl将线程绑定到同一NUMA节点,以确保线程只访问本地NUMA内存。例如,numactl --membind=0 --cpunodebind=0 <app>。
只有当您想要修改映射页面时,MAP_PRIVATE与MAP_SHARED才有关系。MAP_PRIVATE不会将您的修改传播到该文件或该文件的其他进程映射中。
https://stackoverflow.com/questions/61164121
复制相似问题