Преимущества/недостатки работы 64-разрядной JVM на 64-битном сервере Linux?
Мы запускаем 32-битную Sun Java 5 JVM на 64-разрядных серверах Linux 2.6, но, судя по всему, это ограничивает максимальную память для каждого процесса до 2 ГБ. Поэтому было предложено перейти на 64-разрядную JVM, чтобы удалить ограничение. В настоящее время мы запускаем несколько JVM (экземпляров Tomcat) на сервере, чтобы оставаться под лимитом 2 ГБ, но мы хотели бы их консолидировать в интересах упрощения развертывания.
Если вы это сделали, можете ли вы поделиться своим опытом, пожалуйста? Вы используете 64-битную JVM в производстве? Вы порекомендовали бы остаться на Java 5, или было бы нормально переходить на оба Java 6 и 64 бита одновременно? Должны ли мы ожидать проблем с производительностью, лучше или хуже? Есть ли какие-то конкретные области, на которых мы должны сосредоточиться на нашем регрессионном тестировании?
Спасибо за любые советы!
Ответы
Ответ 1
В Kepler Центр научных операций имеет около 50 машин по 32-64G каждый. Кучи JVMs обычно равны 7-20G. Мы используем Java 6. ОС имеет ядро Linux 2.6.
Когда мы перешли на 64-битный, я ожидал, что возникнут некоторые проблемы с запуском 64-битной JVM. Но на самом деле их не было. Из-за нехватки памяти сложнее отлаживать, так как кучи свалок намного больше. Java Wrapper нуждался в некоторых модификациях для поддержки больших размеров кучи.
Есть некоторые сайты в Интернете, утверждающие, что GC не масштабируется хорошо за 2G, но я не видел никаких проблем. Наконец, мы делаем интенсивную интенсивную интенсивную вычислительную обработку. Я никогда не смотрел на латентные различия; моя гипотеза - худший случай, когда латентность GC будет длиннее с большими размерами кучи.
Ответ 2
Мы используем 64-битную JVM с кучами около 40 Гб. В нашем приложении много данных кэшируется, что приводит к большому "старому" поколению. Установки сбора мусора по умолчанию не работали хорошо и нуждались в некоторой болезненной настройке в производстве. Урок: убедитесь, что у вас есть адекватная инфраструктура тестирования нагрузки, прежде чем масштабироваться. Тем не менее, после того, как мы разработали перегибы, производительность GC была отличной.
Ответ 3
Я могу подтвердить опыт Шона. Мы используем чистые Java-приложения, интенсивно использующие вычислительные ресурсы (встроенная в Jetty интеграция, в настоящее время более 1 тыс. Потоков сервлетов, и > 6 ГБ загруженных данных в памяти), и все наши приложения очень хорошо масштабируются для 64-разрядной JVM, когда мы мигрировал 2 года назад. Я бы посоветовал использовать новейшую Sun JVM, поскольку существенное улучшение накладных расходов GC было сделано в последних нескольких выпусках. У меня не было никаких проблем с Tanukisoftware Wrapper.
Ответ 4
Любой написанный вами код JNI, предполагающий, что он работает в 32 битах, нуждается в повторном тестировании. Для проблем, которые вы можете запустить в портирование кода c от 32 до 64 бит, см. Эту ссылку. Это не JNI, но все же применяется. http://www.ibm.com/developerworks/library/l-port64.html
Ответ 5
После перехода на JDK6 64 бит из JDK5 32bits (сервер Windows), мы получили утечку в блоке памяти "perm gen space". После игры с параметрами JDK это было разрешено. Надеюсь, вам повезет больше, чем мы.
Ответ 6
Если вы используете numactl -show, вы можете увидеть размер банков памяти на вашем сервере.
Я обнаружил, что GC не очень хорошо масштабируется, когда он использует более одного банка памяти. Это скорее аппаратное обеспечение, чем проблема с программным обеспечением IMHO, но это может повлиять на время GC все равно.