
Графические представления на диске и в памяти
При представлении графа в компьютере дизайн его представлений на диске и в памяти влияет на его производительность чтения / записи. Важно, чтобы проекты сочувствовали шаблонам использования графов в приложении (см. «Письмо о базах данных нативных графов» ). Например, когда на диске лучше, чтобы совместно полученные данные графа были совмещены, иначе потребуются дорогостоящие случайные поиски на диске. Titan использует представление списка смежности на диске, где вершина и ее инцидентные ребра совмещены. Titan также позволяет сортировать падающие ребра вершины в соответствии со специфичными для приложения компараторами ребер. Эти вершинно-ориентированные индексыподдерживать детальное извлечение падающих ребер вершины с диска и (надеюсь) с той же страницы диска (см . Решение проблемы с суперузлами ).

В итоге, обновления в Titan 0.4.1+ затрагивают несколько уровней иерархии памяти, в которых каждый диск, глобальный кэш и локальные транзакции имеют соответствующие структуры данных, соответствующие их конечной роли в обработке графа. Преимущества этих конструкций демонстрируются в следующих разделах.
Обходы Titan Graph на бутиковом графике


m2.xlarge( жесткий диск — жесткий диск ) и c3.xlarge( твердотельный диск — SSD ). Для того, чтобы продемонстрировать Titan 0.4.1 в относительные преимущества производительности, Titan 0.4.0 и популярный 3 — й база данные партии графа были испытаны также. Один и тот же код был запущен во всех системах с использованием API-интерфейса TinkerPop ‘s Blueprints . Были настроены параметры кучи JVM, -Xms3G -Xmx3Gи были использованы параметры по умолчанию для всех систем, за исключением теплого кэша, явно включенного для Titan 0.4.1:
cache.db-cache=true cache.db-cache-size=0.5 cache.db-cache-time=0
Тест был выполнен, как перечислено ниже. Обратите внимание, что для холодного времени кэширования было выполнено время выполнения первого запроса. Для теплого времени кэширования транзакция откатывается и запрос выполняется снова. Для горячего кэширования запрос не откатывается и запрос выполняется повторно. Фактические обходы Gremlin представлены в блоке кода ниже минус a, .count()который использовался для обеспечения того, чтобы все базы данных возвращали одинаковый набор результатов. Наконец, обратите внимание, что Titan / Cassandra использовался для этого эксперимента, хотя последние разработки кэша доступны для любой из базовых систем хранения Titan.
- 300 необработанных пользовательских идентификаторов были собраны из необработанных данных веб-обзора Amazon.
- 100 пользователей были опрошены с помощью «предпочтения пользователя».
- 100 пользователей были опрошены с помощью «сходства пользователей».
- 100 пользователей были опрошены с помощью «рекомендации продукта».
// what products has the user liked in the last year?
// user preference
user.outE('reviewed').has('score',5f).has('time',T.gte,ONE_YEAR_AGO).inV
// what users have liked the same products that the user liked within the last year?
// user similarity
user.outE('reviewed').has('score',5f).has('time',T.gte,ONE_YEAR_AGO).inV
.inE('reviewed').has('score',5f).has('time',T.gte,ONE_YEAR_AGO).outV()
.except([user])
// what products are liked by the users that like the same products as the user within the last year?
// product recommendation
user.outE('reviewed').has('score',5f).has('time',T.gte,ONE_YEAR_AGO).inV.aggregate(x)
.inE('reviewed').has('score',5f).has('time',T.gte,ONE_YEAR_AGO).outV
.except([user])[0.<1000]
.outE('reviewed').has('score',5f).has('time',T.gte,ONE_YEAR_AGO).inV
.except(x).groupCount(m)
Результаты тестирования доступны для ознакомительного просмотра по следующим URL-адресам (стало возможным благодаря HighCharts JS ).
Графики имеют больше точек данных на левом конце оси X. Чтобы изучить результаты этих меньших наборов результатов, графики можно увеличить, перетащив квадрат над этой областью диаграммы. Каждая линия графика может быть активирована (или деактивирована), нажав на название соответствующей линии в легенде графика.
Важно подчеркнуть, что результаты любого теста следует понимать в контексте, в котором они были выполнены. Этот тест демонстрирует относительную производительность
- на наборе данных графа бутика (то есть относительно небольшого графа),
- используя настройки по умолчанию для графовых баз данных,
- против двух разных носителей длительного хранения (HDD и SSD),
- в рамках ограничений ресурса одного компьютера (
m2.xlargeиc3.xlarge),- выполнение 3 конкретных запросов на чтение,
- и только с одним пользователем / потоком, запрашивающим базу данных в любой момент времени.
Холодные кэши демонстрируют производительность на диске

Благодаря методам сжатия графов, основанным на совместном расположении данных и логической смежности, занимаемая Титаном площадь диска остается относительно низкой.
- Титан / Кассандра — 2,9 гигабайта
- Популярная графическая база данных — 15,0 гигабайт

Теплые кэши демонстрируют производительность кэша вне кучи
После извлечения данных с диска они помещаются в память. Titan всегда хорошо справлялся с извлечением графических данных с базового носителя данных (как было показано в предыдущем разделе с HDD и SSD ). С точки зрения производительности в памяти, Titan 0.4.1 теперь может похвастаться системой «горячего кэша». Преимущество этого дополнения проявляется на графике выше при сравнении Titan 0.4.0 и Titan 0.4.1. В Titan 0.4.1 области графика с широким доступом хранятся в глобальном кэше, состоящем в основном из байтовых буферов. Если данные не находятся в кеше (потеря кеша), то механизмы кэширования Cassandra используются (обычно это кеш ключа и кеш страниц на основе ОС ).). Важно подчеркнуть, что отсутствие теплого кэша в Titan 0.4.1 дает время выполнения, эквивалентное тем, которые наблюдаются в Titan 0.4.0 (которые для представленных сложных обходов остаются менее секунды — см. Серую линию). Эти промежутки времени до секунды возможны из-за представления Titan на диске. Последовательность графиков позволяет эффективно использовать кеш страниц ОС, где «переход на диск» обычно не приводит к случайным поискам.
Горячие кэши демонстрируют производительность транзакций в куче
Чтобы ответить на запрос, примитивы обхода сначала проверяют данные в горячем кэше текущей транзакции , затем в глобальном горячем кэше, а затем на определенной странице диска (которая, опять же, может быть в памяти из-за кэша страниц операционной системы). Где бы в конечном итоге ни находились данные, они вычисляются в оперативном кеше локальной транзакции. Для обходов, которые перемещаются от вершины к вершине путем фильтрации путей с использованием свойств и меток ребер , Titan не нужно десериализовать ребра в объекты. Вместо этого он работает непосредственно с байтовыми буферами, хранящимися в теплом кэше. Это значительно уменьшает количество создаваемых объектов ( |V| << |E|), количество времени, затрачиваемого на сбор мусора кучей молодого поколенияи хорошо настраивает Titan для быстрых, рекурсивных графовых алгоритмов (которые будут рассмотрены в будущем сообщении в блоге).
Вывод

Подтверждения
Этот пост был начат доктором Родригесом после того, как он написал электронное письмо команде Aurelius, в котором говорилось, что кэш в памяти Titan должен быть оптимизирован для сценариев использования графиков бутиков. Павел Яскевич принял вызов и смог увеличить скорость прохождения с помощью программного профилирования горячей точки. После этого д-р Bröcheler дал дальнейшую оптимизацию, умело используя последовательные представления в памяти байтового буфера графических данных. Д-р Джулиан Макаули предоставил Аврелию предварительно обработанную версию данных веб-обзора Amazon под лицензией BSD и Дэниэла Куппица Использовать этот набор данных для тщательной постановки и выполнения представленного теста.






