【问题标题】:Performance characteristics of memory mapped file内存映射文件的性能特点
【发布时间】:2013-02-09 11:33:40
【问题描述】:

背景:

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

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

我对程序的 IO 层进行了基准测试,发现奇怪 内存映射文件的性能特点:

  • 每秒执行 90k 次读取(在随机位置每次迭代读取 1KB)
  • 每秒执行 38k 次写入(每次迭代顺序写入 1KB)
  • 每秒执行 43k 次写入(在随机位置每次迭代写入 4 个字节)
  • 每秒仅执行 9k 读/写组合操作(每次迭代读取 12 个字节,然后在随机位置写入 1KB)

64 位 JDK 1.7、Linux 3.4 上的程序。

本机是一台普通的 Intel 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.显示如何映射文件的代码。 2.你检查系统负载,iostat,一切正常吗?
  • 感谢 bmargulies。查看最新的编辑。

标签: java linux memory-mapped-files


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-01-20
    • 2011-04-28
    • 2023-03-25
    • 2012-01-21
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 2010-11-01
    相关资源
    最近更新 更多