Подтвердить что ты не робот

Преимущества/недостатки работы 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 бита одновременно? Должны ли мы ожидать проблем с производительностью, лучше или хуже? Есть ли какие-то конкретные области, на которых мы должны сосредоточиться на нашем регрессионном тестировании?

Спасибо за любые советы!

4b9b3361

Ответ 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 все равно.