Библиотека сайта rus-linux.net
Infinispan
Оригинал: InfinispanАвтор: Manik Surtani
Перевод: А.Панин
Потоки и переключение контекста
Различные подсистемы Infinispan используют асинхронные операции, которые выполняются в отдельных потоках. Например, библиотека JGroups резервирует потоки для мониторинга состояния сетевого сокета, с помощью которых впоследствии может осуществляться декодирование сообщений и отправка их в поток доставки сообщений. Этот поток может, в свою очередь, сохранить данные в хранилище данных кэша на диске - эта операция точно также может выполняться асинхронно в отдельном потоке. Связанные узлы также могут уведомляться об изменениях, причем может быть осуществлена настройка для выполнения и этой операции в асинхронном режиме.
При работе с пулами потоков в процессе выполнения таких асинхронных задач всегда присутствуют дополнительные потери ресурсов из-за переключений контекста. Также следует отметить тот факт, что создание описанных потоков является ресурсоемкой операцией. Резервирование пулов потоков нужных размеров с соответствующей конфигурацией также важно для каждой установки Infinispan, использующей любые из асинхронных операций.
Специфической заслуживающей внимания подсистемой является асинхронный пул транспортных потоков (в случае использования модели асинхронного взаимодействия), причем важно гарантировать то, что этот пул потоков содержит по крайней мере столько потоков, сколько одновременных обновлений состояния каждого узла нужно выполнять. Аналогично, при настройке библиотеки JGroups пул OOB [http://www.jgroups.org/manual/html/user-advanced.html#d0e3284] и пул потоков обработки входящих соединений должны содержать столько потоков, сколько одновременных обновлений состояния узла нужно выполнить.
Рисунок 7.4 - Потоки в Infinispan
Сборка мусора
Обобщенные практики продуктивной работы со сборщиками мусора при эксплуатации виртуальной машины Java являются важным аспектом функционирования любого разработанного с использованием языка программирования Java приложения и Infinispan не является исключением. Во всяком случае, они приобретают особую важность при работе с грид-системами для хранения данных, так как помимо контейнеров данных, которые могут находиться в памяти в течение длительных периодов времени, также создается множество временных объектов, относящихся к отдельной операции или транзакции. Более того, паузы при сборке мусора могут оказывать воздействие на распределенную структуру данных, так как они могут препятствовать отправке ответа узлом, что приведет к маркировке узла как неработоспособного.
Эти обстоятельства были приняты к рассмотрению при проектировании и реализации Infinispan, но в то же время существует много обстоятельств, которые должны быть приняты к рассмотрению при настройке виртуальной машины Java для запуска Infinispan. Каждая виртуальная машина Java имеет отличия от других. Однако, был проведен специальный анализ [http://howtojboss.com/2013/01/08/data-grid-performance-tuning/] для выявления оптимальных настроек определенных виртуальных машин Java при работе с Infinispan. Например, в случае использования виртуальной машины OpenJDK [http://openjdk.java.net/] или Oracle HotSpot JVM [http://www.oracle.com/technetwork/java/javase/downloads/index.html] применение Concurrent Mark и Sweep collector [http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html#cms] при работе со страницами большого размера [http://www.oracle.com/technetwork/java/javase/tech/largememory-jsp-137182.html] с условием выделения каждой виртуальной машине Java около 12 ГБ памяти является оптимальным решением.
Более того, использование таких сборщиков мусора без пауз, как C4 [http://www.azulsystems.com/technology/c4-garbage-collector] из комплекта поставки виртуальной машине Java Zing от Azul [http://www.azulsystems.com/products/zing/virtual-machine], целесообразно рассматривать в тех случаях, когда паузы при сборке мусора приводят к заметным последствиям.
Заключение
Такое высокопроизводительное связующее программное обеспечение, как Infinispan, должно проектироваться, совершенствоваться и разрабатываться с мыслями о производительности на каждом из этапов. От использования алгоритмов без блокировок до понимания характеристик генерируемых и более не нужных структур, создания механизмов снижения затрат ресурсов на переключение контекста при работе виртуальной машины Java и рассмотрения возможности выхода за пределы виртуальной машины при необходимости (примером может служить разработка компонентов для долговременного хранения данных на диске с использованием компилируемого языка программирования) - все это важные аспекты мыслительной деятельности, необходимые при работе над Infinispan. Более того, подходящие инструменты для тестирования производительности и профилирования, а также запуск тестов в стиле систем непрерывной интеграции позволяют быть уверенным в том, что производительность никогда не пострадает по мере добавления новых возможностей.
Вернуться к началу статьи.