内存映射文件的性能特征

时间:2013-02-09 11:33:40

标签: java linux memory-mapped-files

背景:

  

我有一个Java应用程序,可以在相当大的情况下执行密集的IO   内存映射文件(> 500 MB)。程序读取数据,写入数据,   有时两者兼而有之。

     

所有读/写函数都具有类似的计算复杂度。

     

我对程序的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

所以我的问题是:

  • 给定固定文件大小和内存大小,哪些因素会影响内存映射文件的随机读取性能?
  • 给定固定文件大小和内存大小,哪些因素会影响内存映射文件的随机写入性能?
  • 如何解释读/写组合操作的基准测试结果? (我希望它每秒执行超过20K的迭代次数。)

谢谢。

1 个答案:

答案 0 :(得分:0)

内存映射文件性能取决于磁盘性能,文件系统类型,可用于文件系统缓存的可用内存以及读/写块大小。 linux上的页面大小为4K。所以你应该期望4k读/写的大多数性能。如果未映射页面,则随机位置的访问会导致页面错误,并将读取新页面。通常,如果要将文件视为一个内存数组(或Java中的ByteBuffer),则需要内存映射文件。