Библиотека сайта rus-linux.net
Infinispan
Оригинал: InfinispanАвтор: Manik Surtani
Перевод: А.Панин
Запись данных на диск
В дополнение к созданию структуры данных в памяти, Infinispan может также дополнительно сохранять данные для долговременного хранения на диске.
Сохранение данных на диск может осуществляться как для их безопасности - для того, чтобы данные уцелели после перезапусков платформы или выхода из строя узлов, так и при соответствующей настройке для сохранения избыточных данных, не умещающихся в доступную Infinispan оперативную память, причем в этом случае данный механизм будет функционировать аналогично механизму операционной системы, предназначенному для записи данных страниц памяти на диск. В последнем случае данные записываются на диск только тогда, когда появляется необходимость их перемещения из оперативной памяти для освобождения места.
При сохранении данных для их безопасности запись может осуществляться как в реальном времени, причем в этом случае поток приложения блокируется до того момента, когда будет гарантированно закончена запись данных на диск, так и в отложенном режиме, когда данные записываются на диск периодически и в асинхронном режиме. В последнем случае поток приложения не блокируется в процессе записи данных, но при этом отсутствуют гарантии успешного сохранения данных на диске.
Infinispan поддерживает несколько подключаемых хранилищ данных кэша - адаптеров, которые могут использоваться для долговременного хранения данных на диске или в любой другой форме вспомогательного хранилища. Текущая стандартная реализация является упрощенной реализацией, использующей хэш-корзины и связанные списки, в рамках которой каждая хэш-корзина представлена файлом в файловой системе. Хотя эту реализацию и достаточно просто эксплуатировать и настраивать, она не демонстрирует лучшую производительность.
Создание двух высокопроизводительных реализаций хранилищ данных кэша в файловой системе с использованием компилируемого языка программирования находится в списке текущих задач проекта. Обе реализации будут разрабатываться с использованием языка программирования C и будут иметь возможность осуществления системных вызовов и использования функций непосредственного ввода/вывода там, где это возможно (например, в системах Unix) с целью обхода буферов и кэшей ядра.
Одна из реализаций будет оптимизирована для использования в качестве страничной системы и, следовательно, должна будет иметь возможность осуществления произвольного доступа к данным, возможно, храня их в форме бинарного дерева.
Другая будет оптимизирована для работы в режиме долговременного хранилища данных и предназначается для зеркалирования данных из оперативной памяти. Исходя из этого, она будет создавать структуру данных, предназначенную исключительно для дополнения, а при проектировании основным критерием будет достижение максимальной скорости записи, а не максимальной скорости чтения и сдвига указателя данных.
Синхронизация, блокировки и согласование
Как и все связующее программное обеспечение промышленного уровня, платформа Infinispan хорошо оптимизирована для работы в современных многопроцессорных системах. Для выполнения операций в параллельном режиме у нас в распоряжении имеется большое количество аппаратных потоков на многоядерных и SMP-системах, а также неблокирующиеся асинхронные функции ввода-вывода для обмена данными с сетью и диском, при этом основные структуры данных Infinispan используют техники программного транзакционного доступа к памяти для согласованного доступа к разделяемым данным. Это обстоятельство минимизирует необходимость в явных блокировках, взаимных исключениях и других примитивах синхронизации и позволяет отдавать приоритет таким техникам, как операции сравнения и присваивания значения в рамках цикла для корректной модификации структур разделяемых данных. Описанные техники зарекомендовали себя с лучшей стороны в плане оптимизации использования ресурсов центрального процессора на многоядерных и SMP-системах и, несмотря на усложнение кода при их использовании, позволяют увеличить производительность платформы под нагрузкой.
В дополнение к преимуществам использования техники программного транзакционного доступа к памяти, в будущем Infinispan сможет использовать всю мощь инструкций синхронизации центральных процессоров - по сути, технику аппаратного транзакционного доступа к оперативной памяти, но это произойдет тогда, когда центральные процессоры с поддержкой таких инструкций получат широкое распространение, причем в этом случае вмешательство в архитектуру платформы Infinispan будет минимальным.
Некоторые используемые в Infinispan структуры данных заимствованы непосредственно из отчетов о результатах академических исследований. Фактически, реализация алгоритма модификации элементов очереди без блокировок [http://www.md.chalmers.se/~tsigas/papers/Lock-Free-Deques-Doubly-Lists-JPDC.pdf], используемая в Infinispan, была первой подобной реализацией на языке программирования Java. Другими примерами являются инновационные методы амортизации блокировок [http://dl.acm.org/citation.cfm?id=1546683.1547428] и адаптивные политики извлечения данных [http://dl.acm.org/citation.cfm?id=511334.511340].
Продолжение статьи: Потоки и переключение контекста.