背景:
我有一个 Java 应用程序,它在相当大的内存映射文件(> 500 MB)上执行密集的 IO。程序读取数据、写入数据,有时两者兼而有之。
所有读/写函数都具有相似的计算复杂度。
我对程序的 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 次迭代)。
谢谢你。