9 java linux memory-mapped-files
背景:
我有一个Java应用程序,它在相当大的内存映射文件(> 500 MB)上执行密集IO.程序读取数据,写入数据,有时同时执行两者.
所有读/写功能都具有类似的计算复杂性.
我对程序的IO层进行了基准测试,并注意到内存映射文件的奇怪性能特征:
- 它每秒执行90k次读取(每次迭代在随机位置读取1KB)
- 它每秒执行38k次写入(每次迭代写入1KB)
- 它每秒执行43k次写入(每次迭代在随机位置写入4个字节)
- 它每秒仅执行9k读/写组合操作(读取12个字节,然后每次迭代写入1KB,随机位置)
64位JDK 1.7,Linux 3.4上的程序.
该机器是普通的英特尔PC,具有8个线程CPU和4GB物理内存.在执行基准测试时,仅为JVM堆分配了1 GB.
如果需要更多细节,请参考以下基准代码:https://github.com/HouzuoGuo/Aurinko2/blob/master/src/test/scala/storage/Benchmark.scala
以下是上述读,写,读/写函数的实现:https://github.com/HouzuoGuo/Aurinko2/blob/master/src/main/scala/aurinko2/storage/Collection.scala
所以我的问题是:
谢谢.
内存映射文件性能取决于磁盘性能、文件系统类型、可用于文件系统缓存的可用内存以及读/写块大小。Linux上的页面大小是4K。因此,您应该期望 4k 读/写能获得最佳性能。如果页面未映射,则随机位置的访问会导致页面错误,并且会拉取新页面读取。通常,如果您希望将文件视为一个内存数组(或 Java 中的 ByteBuffer),则需要内存映射文件。
归档时间: |
|
查看次数: |
1321 次 |
最近记录: |