Санкт-Петербургская группа тестирования JVM


« java.lang.reflect.Pr... | Main | Взаимодействие VM с... »
20070416 понедельник Апрель 16, 2007

Производительность JVM 6.0

Вашему вниманию предлагается перевод поста Дэйва Дагастина, одного из разработчиков JVM о производительности JVM 6.0.

Вышла Java 6, по нашему мнению, самая быстрая и самая надежная версия. Нашей целью было достичь высокой производительности автоматически ("out-of-box"), без специальных настроек.

Что это значит? Для приемлемого быстродействия вам не потребуется настраивать JVM. Вам не потребуется проводить часы, комбинируя загадочные опции, оптимизируя JVM под ваше приложение. Не придется выяснять, требуется ли приложению повторная настройка опций JVM.

В JDK 6 ("двигателем" которого является открытый продукт HotSpot JVM), удалось добиться следующих показателей:

Добиться подобных показателей для Java без настроек было трудной, но интересной задачей. Как известно, задачи клиентских и серверных приложений сильно отличаются друг от друга: клиенту нужен быстрый запуск приложения и скромные требования к памяти, а серверу необходим сильно оптимизированный код, высокая пропускная способность (throughput) приложения и максимально короткие паузы GC.

Настройка хитроумных параметров JVM под конкретный тест, конечно же, увлекательна и результативна. Но до тех пор, пока JVM не будет автоматически включать подобные настройки по ходу выполнения, для конечного пользователя подобный "тюнинг" будет бесполезен. Это является правильной, по нашему мнению, постановкой задачи, и тесты производительности должны ей соответствовать.

Еще раз отмечу, что приведенные ниже результаты тестов демонстрируют JVM в базовом режиме, такой, как она предстанет перед пользователем после инсталляции. Не ставилось цели добиться высоких результатов с помощью ручных настроек.

Ниже приводится сравнение производительности на машинах Dell 2950 и Sun Fire X4200. Компьютер Dell имел пару двухядерных процессоров Intel 5160 (2 ЦП, 4 ядра на 3.0 ГГц) и 16 Гб памяти. В Sun Fire имел два Opteron 280 (2 ЦП, 4 ядра на 2.4 ГГц) и 8 Гб памяти. На обоих компьютерах был установлен RedHat Enterprise Linux 4.0 AS Update 4. Ядро Linux не обновлялось после инсталляции. Версия была 2.6.9-42.ELsmp. Единственной переменной в этом исследовании была сама JVM.

Для сравнения были взяты самые свежие дистрибутивы JVM на момент написания статьи (19 декабря 2006 г.): BEA JRockit был скачан с основного сайта компании, а 64-битная версия—с сайта обновлений. IBM JVM была взята с сайта IBM для разработчиков.

Как было сказано выше, специальной настройки JVM не производилось. Результаты были усреднены: было сделано не менее 10 запусков каждого теста и была выполнена проверка по критерию Стьюдента для обеспечения достоверности результата. Данные были нормированы по результатам 32-битной IBM JDK 5 SR3.

Первый ряд графиков демонстрирует производительность Java на микроархитектуре Intel Core 2. Результаты, приведенные ниже (особенно SPECjbb2005) однозначно демонстрируют коренное различие в философии Sun HotSpot и его конкурентов. Если вы посмотрите на результаты тестирования виртуальной машины, специально настроенной под Core 2, опубликованные конкурентами (например, BEA), то результаты эти будут многообещающими. Однако, эти люди пошли путем настройки конкретных тестов под конкретную платформу, что способно лишь сбить с толку обычного пользователя. Может ли пользователь непосредственно воспользоваться такими же настройками для себя? Если эти настройки так хороши, почему производитель не включил их по умолчанию? Мы выбрали для HotSpot другой путь.

Первый график демонстрирует результаты SPECjbb2005, теста от SPEC, оценивающего производительность серверной Java. Этот тест имитирует трехуровневую клиент-серверную систему с упором на средний уровень. Он стресс-тестирует коллекции Java, операции над BigDecimal и обработку XML. Что особенно приятно, оптимизации, выполненные для SPECjbb2005 немедленно дают знать о себе в других тестах, причем в хорошем смысле. Например, в SPECjappserver2004 и в большом количестве "боевых" примеров рабочей нагрузки сервера наших заказчиков. Результаты были получены в режиме одиночной JVM.

SciMark 2.0—это тест на Java, моделирующий различные вычисления в научных целях. Это еще и тест, где Sun продолжает демонстрировать превосходство в производительности. Он достаточно хорошо проверяет генерацию кода, особенно в небольших вычислительных циклах. Однако, результаты могут сильно зависеть от выравнивания данных и иметь расхождения после различных запусков. Эти расхождения обычно носят бимодальный характер. Тест имеет три режима работы: малый, большой и стандартный, в зависимости от объема данных для обработки. Если после этих слов вечер перестает быть скучным, загляните на сайт SciMark 2.0. В целом, это неплохой набор микротестов (microbenchmarks).

Заметьте, что 32-битные JVM превосходят 64-битные на Intel Core во всех случаях, что отличает их от AMD Opteron (см. ниже), где производительность сильно выигрывает на 64 битах. SciMark 2.0 использует обширный набор данных, и вероятно, что операции с 64-битными указателями создают нагрузку, ограничивающую пропускную способность шины памяти настолько, что это сказывается на результатах. Однако, это всего лишь гипотеза.

Volano имитирует популярный Чат-сервер. Быстрый тест, требующий клиента и сервера. С точки зрения JVM, превалирующей нагрузкой является классический сокетный ввод-вывод Java, который порядком устарел, но борозды не портит. Было бы забавно сделать его в NIO. Часть наших клиентов считают этот тест довольно полезным и поэтому мы продолжаем использовать его. Кроме того, друзья из BEA подсказывают, что Volano—наш самый любимый тест. Спорить трудно. Различия JVM в этом тесте не очень велики, так как тест экологичный и мало мусорит: доля нагрузки здесь GC не велика. BEA JRockit демонстрирует хорошую производительность, на 19% больше базовой. Sun Java SE 6 финиширует первой с 22%.

Вторая серия графиков показывает результаты запусков на Sun Fire X4200 с AMD Opteron 280. Эта система идентична тем, что использовались в предыдущих моих (Дейва Дагастина) постах на тему производительности. Я уверен, что кто-нибудь поинтересуется, почему я не сравниваю Intel и AMD напрямую. Резон очень прост—я сравниваю производительность JVM, а не процессоров. Кроме того, у меня под рукой системы с последними процессорами AMD. Intel оказывается быстрее на одних тестах, а AMD—на других. Различия в подсистеме памяти между этими платформами достаточно сильно влияют на итоги тестирования. Sun Java 6 показывает впечатляющие результаты на SPECjbb2005, на 30% больше IBM SDK и на 15%—J2SE 5.0_10.

 

SciMark 2.0 также впечатляет на AMD Opteron. Нас интересует большой объем данных, т.к. он его воздействие на кэш может выявить ограничения подсистемы памяти. Если ваше приложение перемалывает огромные объемы данных, вам стоит взглянуть на результаты "большого" SciMark на различных JVM и архитектурах.

Последний, но не менее важный тест—Volano на AMD Opteron (нет, нет, это не наш любимый тест!). Java 6 демонстрирует улучшение показателей на 20% по сравнению с 5.0_10, уступая 64-битной BEA JRockit. Приятно.

Дэйв Дагастин
Перевел Кирилл Широков

опубликовал vmrobot ( апр 16 2007, 01:18:40 AM MSD ) Permalink Комментарии [6]

Trackback URL: http://blogs.sun.com/vmrobot/entry/%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C_jvm_6_0
Комментарии:

Кто-нибудь может пояснить чего 64-х битные версии уступают в производительности 32-х битным? На своей системе я еще вижу, что 64-х битная ест памяти в 2 - 2.5 раза больше 32-х битной.

опубликовал Евгений Май 19, 2007 at 03:08 AM MSD #

Основная причина в том, что указатели на 64-битной архитектуре, соответственно, не 32-х, а 64-битные. Так как операции с указателями в обычных приложениях доминируют (по сравнению, например, со математическими расчетами), нагрузка на систему памяти возрастает: каждый раз нужно читать двойную порцию информации.

опубликовал Kirill Shirokov Май 19, 2007 at 11:03 AM MSD #

А как быть с увеличенным числом регистров процессора в 64-битном режиме? Это должно же как-то компенсироваться? То есть, если нет необходимости в использовании огромного количества памяти, то лучше использовать 32-х битную JVM на 64-х битной системе...

опубликовал Евгений Май 19, 2007 at 02:59 PM MSD #

1. Есть еще и выравнивание структур в памяти. Кроме того, если программа, например, хранит в памяти массив целых в виде списка, то имеем 4 + 8 байт на элемент, что с выравниванием увеличивается до 16-ти. А в 32-битной машине это было бы 8 байт на элемент. Тут никакие регистры не помогут. 2. Да, верно.

опубликовал Кирилл Май 22, 2007 at 05:10 PM MSD #

Гонял 64-битную серверную Java на Dell PowerEdge 850 c Intel Dual Core на Ubuntu Server 7.04 x86-64 -- под нагрузкой жестко вылетает. И Tomcat и серверное приложение. В клиентском режиме все работает хорошо.

опубликовал null Август 08, 2007 at 03:44 PM MSD #

>Вышла Java 6, по нашему мнению, самая быстрая и
>самая надежная версия. Нашей целью было достичь
>высокой производительности автоматически
>("out-of-box"), без специальных настроек.

Конечно это достигается следующим образом:

1. Определить какие специальные настройки приводит к максиальной производительности на известных бенчмарках

2. Сделать эти специальные настройки дефолтными

Шучу :)

опубликовал Никита Декабрь 06, 2007 at 01:12 PM MSK #

Опубликовать комментарий:

Имя
E-Mail:
URL:

Ваш комментарий:

HTML Syntax: Отключен

Хиты страниц за сегодня: 116