Библиотека сайта rus-linux.net
Infinispan
Оригинал: InfinispanАвтор: Manik Surtani
Перевод: А.Панин
Наиболее подозрительные подсистемы
В рамках Infinispan существует несколько подсистем, которые вызывают наибольшие подозрения в плане снижения производительности системы и, таким образом, являются главными кандидатами для выполнения тщательного исследования и возможных оптимизаций. Давайте рассмотрим каждую из них по очереди.
Сеть
Сетевое взаимодействие является наиболее ресурсоемкой операцией в рамках Infinispan, вне зависимости от того, осуществляется ли взаимодействие между узлами, либо между клиентами и самой грид-платформой.
Децентрализованная сеть
Infinispan использует библиотеку с открытым исходным кодом для децентрализованного группового сетевого взаимодействия JGroups [http://www.jgroups.org] с реализации механизмов взаимодействия узлов. JGroups может использовать как сетевой протокол TCP, так и UDP, включая многоадресную передачу данных по протоколу UDP и предоставляет такие высокоуровневые возможности, как гарантии доставки сообщений, повторная отправка и упорядочивание сообщений даже в случае использования таких ненадежных протоколов, как UDP.
В таких условиях корректная оптимизация процесса функционирования уровня библиотеки JGroups становится чрезвычайно важной в первую очередь для соответствия таким характеристикам вашей сети и приложения, как время жизни пакетов, размеры буферов и размеры пулов потоков. Также важно принимать к рассмотрению метод компоновки сообщений библиотекой JGroups, заключающийся в объединении небольших сообщений в рамках единого сетевого пакета и метод фрагментации сообщений, заключающийся в разделении сообщений больших размеров для помещения их частей в множество меньших по размеру сетевых пакетов.
Сетевой стек вашей операционной системы и ваше сетевое оборудование (свитчи и маршрутизаторы) также должны быть настроены в соответствии с данной конфигурацией. Буферы приема и отправки данных протокола TCP операционной системы, размеры фреймов, jumbo-фреймы, и другие параметры также важны для оптимальной работы наиболее ресурсоемкого компонента вашей грид-платформы для хранения данных.
Такие инструменты, как netstat
и wireshark
могут помочь вам при анализе пакетов, а Radar Gun может помочь в создании нагрузки на грид-платформу. Radar Gun также может использоваться для профилирования уровня библиотеки JGroups в рамках Infinispan и поиска причин снижения производительности на нем.
Сокеты сервера
Infinispan использует популярный фреймворк Netty [http://www.netty.io] для создания и управления сокетами сервера. Netty является оберткой над фреймворком для асинхронного взаимодействия NIO для Java, который в свою очередь, использует возможности асинхронного ввода/вывода операционной системы. Это обстоятельство позволяет эффективно использовать ресурсы системы ценой некоторого количества переключений контекста. В общем, данная конструкция ведет себя достаточно хорошо при наличии нагрузки.
Netty предоставляет несколько уровней настроек для достижения оптимальной производительности. Эти настройки включают размеры буферов, пулов потоков и подобных структур и также должны устанавливаться в соответствии с размерами буферов отправки и приема данных протокола TCP операционной системы.
Сериализация данных
Перед передачей данных по сети, объекты приложения должны подвергаться сериализации и превращаться в последовательность байт для передачи посредством сетевого соединения грид-платформе и последующей повторной передачи между узлами. После этого байтовый поток должен подвергаться десериализации и преобразовываться в объекты приложения в процессе чтения его приложением. В большинстве стандартных конфигураций около 20% времени обработки запроса тратится именно на сериализацию и десериализацию.
Стандартный механизм серализации (и десериализации) языка программирования Java известен низкой эффективностью, как в плане циклов центрального процессора, так и в плане генерируемых данных - всегда генерируется чрезмерно большой объем данных, что приводит к дополнительной загрузке сети.
Infinispan использует собственную схему сериализации, в которой объявления классов не сохраняются в выходной последовательности данных в полном объеме. Вместо этого для известных типов используются специальные значения, причем каждый из известных типов представляется единственным байтом. Эта оптимизация в значительной степени повышает не только скорость процессов сериализации и десериализации, но и позволяет генерировать более компактные байтовые последовательности для передачи по сети. Для каждого известного типа данных на основе его специального значения регистрируется функция внешнего преобразования. Эта функция внешнего преобразования реализует логику для преобразования объекта в байтовое представление и обратно.
Данная техника замечательно работает с такими известными типами данных, как внутренние объекты Infinispan, которыми обмениваются узлы. Такие внутренние объекты, как команды, пакеты данных и другие имеют соответствующие функции внешнего преобразования и уникальные специальные значения. А как насчет объектов приложений? По умолчанию в том случае, если Infinispan встречает неизвестный объект, для его обработки используется стандартный механизм сериализации языка программирования Java. Данный подход позволяет Infinispan начинать работу без дополнительных настроек, хотя и работать менее эффективно в случаях использования неизвестных типов объектов приложения.
Для обхода описанного ограничения Infinispan позволяет разработчикам приложений также регистрировать функции внешнего преобразования и для типов данных приложений. Эта возможность позволяет выполнять мощную, быструю и эффективную сериализацию также и для объектов приложения, причем разработчик приложения может разрабатывать и регистрировать реализации функций внешнего преобразования для каждого типа объекта приложения.
Код для поддержки функций внешнего преобразования был выпущен в форме отдельной повторно используемой библиотеки под названием JBoss Marshalling [http://www.jboss.org/jbossmarshalling]. Он упаковывается вместе с Infinispan и в включается в комплекты поставки Infinispan, но при этом также используется в различных сторонних проектах с открытым исходным кодом с целью повышения производительности операций сериализации.
Продолжение статьи: Запись данных на диск.