Java 内存映射文件的性能特征

Java 内存映射文件的性能特征,java,linux,memory-mapped-files,Java,Linux,Memory Mapped Files,背景: 我有一个Java应用程序,它在相当大的计算机上执行密集的IO 内存映射文件(>500 MB)。程序读取数据,写入数据, 有时两者兼而有之 所有读/写函数的计算复杂度相似 我对程序的IO层进行了基准测试,发现了一些奇怪的问题 内存映射文件的性能特征: 它每秒执行90k次读取(在随机位置每次迭代读取1KB) 它每秒执行38k次写入(按顺序每次迭代写入1KB) 它每秒执行43k次写入(在随机位置每次迭代写入4个字节) 它每秒仅执行9k读/写组合操作(在随机位置,每次迭代读取12字节,然后写入

背景:

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

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

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

  • 它每秒执行90k次读取(在随机位置每次迭代读取1KB)
  • 它每秒执行38k次写入(按顺序每次迭代写入1KB)
  • 它每秒执行43k次写入(在随机位置每次迭代写入4个字节)
  • 它每秒仅执行9k读/写组合操作(在随机位置,每次迭代读取12字节,然后写入1KB)
64位JDK1.7、Linux 3.4上的程序

这台机器是一台普通的Intel PC,具有8个线程的CPU和4GB物理内存。在执行基准测试时,只有1GB被分配给JVM堆

如果需要更多详细信息,以下是基准代码:

下面是上述读、写、读/写功能的实现:

因此,我的问题是:

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

谢谢。

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

1。显示如何映射文件的代码。2.你检查过系统负载了吗,iostat,一切正常吗?谢谢。查看最新编辑。