Недавно я проводил бенчмаркинг производительности записи продукта моей компании, и я обнаружил, что просто переход на 64-битную JVM дает постоянное увеличение производительности на 20-30%.
Мне не разрешено подробно рассказывать о нашем продукте, но в основном это колонка-ориентированная БД, оптимизированная для хранения журналов. Этот тест включает в себя загрузку нескольких гигабайт необработанных журналов и время, необходимое для их анализа и хранения в виде структурированных данных в БД. Обработка очень тяжелая как на 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-битный процессор)
- Максимальный размер кучи фиксирован на 512 МБ (поэтому увеличение скорости происходит не из-за 64-битной JVM с использованием большей кучи)
Для простоты я отключил все варианты многопоточности в нашем продукте, так что практически вся обработка происходит однопоточно. (Когда я включил многопоточность, конечно, система стала быстрее, но соотношение между 32-битной и 64-битной характеристиками оставалось примерно одинаковым.)
Итак, мой вопрос... Почему я должен видеть улучшение скорости на 20-30% при использовании 64-битной JVM? Кто-нибудь видел подобные результаты раньше?
Моя интуиция до сих пор была следующей:
-
64-битные указатели больше, поэтому L1 и L2 кэшируют более легко, поэтому производительность на 64-битной JVM хуже.
-
JVM использует некоторые причудливые трюки для сжатия указателей, чтобы как можно больше облегчить указанную проблему. Подробности на сайте Sun здесь.
-
JVM разрешено использовать больше регистров при работе в режиме 64 бит, что немного ускоряет работу.
Учитывая вышеуказанные три точки, я ожидал бы, что 64-битная производительность будет немного медленнее или примерно равна 32-битной JVM.
Любые идеи? Спасибо заранее.
Изменить: Разъяснены некоторые моменты в тестовой среде.