内存映射文件的性能特征

10

背景:

我有一个Java应用程序,在大型内存映射文件(>500MB)上进行密集的IO操作。该程序读取数据,写入数据,有时同时进行读写操作。

所有读/写功能具有类似的计算复杂度。

我对程序的IO层进行了基准测试,并注意到了内存映射文件的奇怪性能特征:

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

使用64位JDK 1.7,Linux 3.4。

计算机是一台普通的Intel PC,具有8个线程的CPU和4GB物理内存。进行基准测试时,只分配了1 GB的JVM堆。

如果需要更多细节,请查看基准测试代码: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
    感谢bmargulies。请查看最新编辑。 - user972946
    1个回答

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

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接