Вот исходный код теста: https://github.com/a-rog/px100data/tree/master/examples/HazelcastVsIgnite
Это часть платформы NoSQL в стиле JDBC, о которой я упоминал ранее: Px100 Data
Создание и запуск:
cd <project-dir>
mvn clean package
cd target
java -cp "grid-benchmark.jar:lib/*" -Xms512m -Xmx3000m -Xss4m com.px100systems.platform.benchmark.HazelcastTest 100000
java -cp "grid-benchmark.jar:lib/*" -Xms512m -Xmx3000m -Xss4m com.px100systems.platform.benchmark.IgniteTest 100000
Как видите, я установил высокие лимиты памяти, чтобы избежать сборки мусора. Вы также можете запустить мой собственный фреймворк-тест (см. Px100DataTest.java) и сравнить с двумя вышеприведенными, но давайте сосредоточимся на чистой производительности. Ни один из тестов не использует Spring или что-то еще, кроме Hazelcast 3.5.1 и Ignite 1.3.3 — последних на данный момент.
Эталонный тест транзакционно вставляет указанное количество прибл. Записи размером 1K (из них 100000 — можно увеличить, но остерегайтесь памяти) в пакетах (транзакциях) по 1000. Затем он выполняет два запроса с сортировкой по возрастанию и убыванию: всего четыре. Все поля запроса и ORDER BY индексируются.
Я не буду публиковать весь класс (скачайте его с GitHub). Запрос Hazelcast выглядит следующим образом:
PagingPredicate predicate = new PagingPredicate(
new Predicates.AndPredicate(new Predicates.LikePredicate("textField", "%Jane%"),
new Predicates.GreaterLessPredicate("id", first.getId(), false, false)),
(o1, o2) -> ((TestEntity)o1.getValue()).getId().compareTo(((TestEntity)o2.getValue()).getId()),
100);
Соответствующий запрос Ignite:
SqlQuery<Object, TestEntity> query = new SqlQuery<>(TestEntity.class,
"FROM TestEntity WHERE textField LIKE '%Jane%' AND id > '" + first.getId() + "' ORDER BY id LIMIT 100");
query.setPageSize(100);
Вот результаты, выполненные на моем 8-ядерном MBP 2012 года с 8 ГБ памяти:
Хейзелкаст
Starting - used heap: 49791048 bytes
Inserting 100000 records: ....................................................................................................
Inserted all records - used heap: 580885264 bytes
Map: 100000 entries, used heap: 531094216 bytes, inserts took 5458 ms
Query 1 count: 100, time: 344 ms, heap size: 298844824 bytes
Query 2 count: 100, time: 115 ms, heap size: 454902648 bytes
Query 3 count: 100, time: 165 ms, heap size: 657153784 bytes
Query 4 count: 100, time: 106 ms, heap size: 811155544 bytes
Зажечь
Starting - used heap: 100261632 bytes
Inserting 100000 records: ....................................................................................................
Inserted all records - used heap: 1241999968 bytes
Cache: 100000 entries, heap size: 1141738336 bytes, inserts took 14387 ms
Query 1 count: 100, time: 222 ms, heap size: 917907456 bytes
Query 2 count: 100, time: 128 ms, heap size: 926325264 bytes
Query 3 count: 100, time: 7 ms, heap size: 926325264 bytes
Query 4 count: 100, time: 103 ms, heap size: 934743064 bytes
Одним из очевидных отличий является производительность вставки, заметная в реальной жизни. Однако очень редко вставляется 1000 записей. Обычно это одна вставка или обновление (сохранение введенных данных пользователя и т. д.), поэтому меня это не беспокоит. Однако производительность запроса делает. Большинство программ для бизнеса, ориентированных на данные, требуют большого количества операций чтения.
Обратите внимание на потребление памяти. Ignite потребляет больше оперативной памяти, чем Hazelcast. Что может объяснить лучшую производительность запросов. Хорошо, если я решил использовать сетку в памяти, должен ли я беспокоиться о памяти?
Вы можете четко сказать, когда сетки данных попадают в индексы, а когда нет, как они кэшируют скомпилированные запросы (7 мс) и т. д. Я не хочу спекулировать и позволю вам поиграть с этим, как Hazelcast и Разработчики Ignite дают некоторое представление.
Что касается общей производительности, то она сравнима, если не ниже MySQL. Технология IMO in-memory должна работать лучше. Я уверен, что обе компании примут к сведению.
Приведенные выше результаты довольно близки. Однако при использовании в Px100 Data и более высоком уровне Px100 (который в значительной степени зависит от индексированных «полей сортировки» для разбивки на страницы) Ignite вырывается вперед и лучше подходит для моей структуры. Я забочусь в первую очередь о производительности запросов.
person
Alex Rogachevsky
schedule
11.08.2015