【发布时间】:2011-02-08 09:19:22
【问题描述】:
最近我一直在对我公司的数据库产品的写入性能进行一些基准测试,我发现简单地切换到 64 位 JVM 可以持续提高 20-30% 的性能。
我不能详细介绍我们的产品,但基本上它是一个面向列的数据库,针对存储日志进行了优化。基准测试包括为其提供几 GB 的原始日志,并计时分析它们并将它们作为结构化数据存储在数据库中所需的时间。 CPU 和 I/O 的处理都非常繁重,虽然很难说比例是多少。
关于设置的几点说明:
Processor: Xeon E5640 2.66GHz (4 core) x 2
RAM: 24GB
Disk: 7200rpm, no RAID
OS: RHEL 6 64bit
Filesystem: Ext4
JVMs: 1.6.0_21 (32bit), 1.6.0_23 (64bit)
Max heap size (-Xmx): 512 MB (for both 32bit and 64bit JVMs)
两个 JVM 的常量:
- 相同的操作系统(64 位 RHEL)
- 相同的硬件(64 位 CPU)
- 最大堆大小固定为 512 MB(因此速度提升不是由于 64 位 JVM 使用更大的堆)
为简单起见,我已关闭产品中的所有多线程选项,因此几乎所有处理都以单线程方式进行。 (当我开启多线程时,系统当然更快了,但 32 位和 64 位的性能比保持不变。)
所以,我的问题是……为什么在使用 64 位 JVM 时我会看到 20-30% 的速度提升?以前有人见过类似的结果吗?
到目前为止,我的直觉如下:
64bit 指针更大,L1 和 L2 缓存更容易溢出,因此在 64bit JVM 上性能更差。
JVM 使用了一些花哨的指针压缩技巧来尽可能地缓解上述问题。 Sun 网站here 上的详细信息。
在 64 位模式下运行时,允许 JVM 使用更多寄存器,这会稍微加快速度。
鉴于以上三点,我预计 64 位的性能会稍慢,或大约等于 32 位的 JVM。
有什么想法吗?提前致谢。
编辑:阐明了有关基准环境的一些要点。
【问题讨论】:
-
您是否在 64 位操作系统上运行您的 32 位 JVM?如果是,那么您必须记住,64 位操作系统上的 32 位应用程序将被“模拟”,因此它会失去一些性能。检查 32 位操作系统 -> 32 位 JVM 和 64 位操作系统 -> 64 位 JVM 的性能
-
另外,这可能与内存有关吗?也就是说,在您能够访问更多内存的 64 位版本上,是不是因为资源没有那么紧张,所以 GC 不需要运行那么多或那么激进?
-
是的,请确保使用相同的内存设置运行基准测试。
-
对不起,我应该提到两个 JVM 都运行在相同的 64 位操作系统和 CPU 上,具有相同的堆大小。我已经编辑了问题以澄清这些观点。
-
如果你使用 -XX:+UseCompressedOops 运行会怎样
标签: java 64-bit jvm performance