背景:
我有一个Java应用程序在相当大的内存映射文件(> 500 MB)上执行密集IO。 程序读取数据,写入数据,有时也是这样。
所有读/写function具有相似的计算复杂度。
我对程序的IO层进行了基准testing,发现了内存映射文件的奇怪性能特征:
用内存映射文件实现虚拟内存
为什么这个循环会毁掉我的记忆?
跨进程内存障碍
msync()写入文件只改变了页面或整个caching的缓冲区?
它每秒执行90k次读取(每次读取1KB随机位置)
它每秒执行38k次写入(按顺序每次迭代写入1KB)
它每秒执行43k次写入(每次迭代在随机位置写入4个字节)
它每秒只执行9k次读/写组合操作(读取12个字节,然后每次迭代写1KB,随机位置)
在64位JDK 1.7,Linux 3.4上的程序。
该机器是一个普通的Intel PC,具有8个线程的cpu和4GB的物理内存。 进行基准testing时,只有1 GB分配给JVM堆。
如果需要更多的细节,这里是基准代码: https : //github.com/HouzuoGuo/Aurinko2/blob/master/src/test/scala/storage/Benchmark.scala
这里是执行上面的读,写,读/写function: https : //github.com/HouzuoGuo/Aurinko2/blob/master/src/main/scala/aurinko2/storage/Collection.scala
所以我的问题是:
鉴于固定的文件大小和内存大小,影响内存映射文件随机读取性能的因素是什么?
鉴于固定的文件大小和内存大小,影响内存映射文件随机写入性能的因素有哪些?
我如何解释读/写联合操作的基准结果? (我期待它每秒执行超过20K的迭代)。
谢谢。
使用mmap进行Emacs缓冲区分配
在64位(或32位)Windows上以32位进程访问> 2,3,4GB文件
什么是内存映射文件和实际的内存使用情况?
如何找出一个(Windows)的内存映射文件已经存在,使用Python
内存映射文件的性能取决于磁盘性能,文件系统类型,可用于文件系统缓存的空闲内存和读/写块大小。 Linux上的页面大小是4K。 所以你应该期待4k读/写的最高性能。 随机位置的访问会导致页面错误,如果页面没有被映射,并将拉一个新的页面读取。 通常,如果要将文件视为一个内存数组(或Java中的ByteBuffer),则需要内存映射文件。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。