Статьи

Крупнозернистый бенчмаркинг

При разработке нашего программного обеспечения мы все ориентируемся на метрики — даже до того факта, что я уверен, что по крайней мере 10% наших постов содержат фразу «мера не угадать». Одной из тех метрик, за которыми мы внимательно следим, является производительность. Или, если быть более точным, количество дополнительных циклов ЦП, которые мы сжигаем, или дополнительное количество кучи, используемой при запуске приложения с подключенным Plumbr .

Набор тестов, используемых для измерения накладных расходов, несколько сложен и содержит как меньшие синтетические тесты, так и реальные приложения. Первое было относительно легко, например, тесты SPECjvm дали нам хорошую основу для построения нашего решения. В сочетании с нашими собственными контрольными тестами мы были уверены, что на микроуровне наш набор тестов был достаточно тщательным, чтобы доверять результатам.

Создание репрезентативного набора тестов для реальных приложений оказалось более сложной задачей. Даже при том, что многие приложения были бы доступны для такого использования, огромная сложность при настройке приложений на многоплатформенной тестовой матрице была для нас задачей слишком пугающей. Просто попытайтесь представить зависимости и сложные инструкции по настройке, и вы можете начать понимать боль.

Так что мы застряли, пока год назад мы не нашли своего спасителя. На этот раз спаситель принял форму предварительно упакованной библиотеки тестирования под названием « DaCapo Benchmark Suite ». Этот набор тестов состоит из набора приложений с открытым исходным кодом, реальных приложений и библиотек. Авторы настроили библиотеки для запуска нетривиальных тестовых случаев, таких как следующие примеры:

  • батик — создает множество изображений Scalable Vector Graphics (SVG) на основе модульных тестов в Apache Batik
  • eclipse — выполняет некоторые (не графические) тесты производительности jdt для Eclipse IDE
  • lusearch — использует lucene для текстового поиска по ключевым словам в совокупности данных, включающих произведения Шекспира и Библию короля Джеймса
  • tomcat — запускает набор запросов к серверу Tomcat, получая и проверяя получающиеся веб-страницы — tradebeans запускает бенчмарк daytrader через Jave Beans к бэкэнду GERONIMO с базой данных h2 в качестве базовой базы данных

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

Эталон бесплатно скачать и использовать. Настроить его так же просто, как скачать dacapo-9.12.jar и выполнить определенный тест, как:

1
java -jar dacapo-9.12-bach.jar tomcat

или, в нашем случае, где мы хотим увидеть накладные расходы нашего -javaagent:

1
java -javaagent:$path_to/plumbr.jar -jar dacapo-9.12-bach.jar tomcat

Теперь, сравнивая результаты двух тестов, первый из которых был «голым», а второй с нашим агентом обнаружения утечек памяти, мы видим, что тесту потребовалось 281 мс или на 10% больше времени для запуска с подключенным Plumbr :

1
2
3
4
5
6
7
8
java -jar dacapo-9.12-bach.jar tomcat
===== DaCapo 9.12 tomcat starting =====
Loading web application
Creating client threads
Waiting for clients to complete
Client threads complete ... unloading web application
===== DaCapo 9.12 tomcat PASSED in 2699 msec =====
Server stopped ... iteration complete
1
2
3
4
5
6
7
8
java -javaagent:$path_to/plumbr.jar -jar dacapo-9.12-bach.jar tomcat
===== DaCapo 9.12 tomcat starting =====
Loading web application
Creating client threads
Waiting for clients to complete
Client threads complete ... unloading web application
===== DaCapo 9.12 tomcat PASSED in 2980 msec =====
Server stopped ... iteration complete

Обладая этими знаниями, теперь нам легко сначала решать самые большие проблемы — например, при первых запусках мы накладывали более 100% накладных расходов на некоторые тесты. Теперь мы можем с уверенностью сказать, что во всех случаях мы вписываемся в 5-20% и продолжаем улучшаться.

При выполнении тестов имейте в виду, что, как всегда, вы никогда не должны принимать решения на основе одного прогона, поскольку все тесты имеют обязательный период прогрева, чтобы получить значимые результаты. В DaCapo вы можете либо доверить самой библиотеке запуск тестов, пока результаты не сойдутся, указав параметр запуска -C, либо указать количество прогонов самостоятельно, добавив параметр -n в сценарий запуска.

Хотя есть некоторые опасения — поскольку тест не обновлялся с 2009 года, некоторые тесты устарели. Либо потому, что сами технологии устарели (например, SVG), либо из-за того, что тестируемые версии приложений больше не используются на рабочих сайтах (например, ранняя сборка Tomcat 6.0).

Ссылка: Грубый сравнительный анализ от нашего партнера JCG Владимира Сора в блоге Plumbr Blog .