Недавно я провел некоторые тесты производительности записи в базе данных моей компании, и обнаружил, что простое переключение на 64-битную JVM дает стабильное увеличение производительности на 20-30%.
Мне не разрешено вдаваться в подробности о нашем продукте, но в основном это БД, ориентированная на столбцы, оптимизированная для хранения журналов. Тестирование включает подачу нескольких гигабайт необработанных журналов и определение времени, необходимого для их анализа и хранения в виде структурированных данных в БД. Обработка очень тяжелая как для процессора, так и для ввода-вывода, хотя трудно сказать, в каком соотношении.
Несколько замечаний по настройке:
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.
Есть идеи? Заранее спасибо.
Редактировать: Разъяснил некоторые моменты о тестовой среде.