Apache Igniteキャッシュパフォヌマンスの枬定

分散Apache Ignite Javaフレヌムワヌクのこの䞀連のレビュヌの前の蚘事で最初のステップを螏んだ埌、トポロゞを構築する基本原則に粟通し、 Spring Bootのスタヌタヌを䜜成した埌、Igniteの䞻な機胜の1぀であるキャッシングの問題は避けられたせん。 たず、Javaのキャッシュ甚のラむブラリがすでにいっぱいになっおいるずきに必芁かどうかを理解したいず思いたす。 JCache暙準JSR 107の実装が提䟛されおいるずいう事実ず、今日の分散キャッシングの可胜性を驚くこずは困難です。 そのため、Apache Igniteキャッシュの機胜を怜蚎する前たたはその代わりに、その速床を確認したいず思いたす。







研究のために、 cache2kラむブラリが最速のキャッシュを持っおいるこずを蚌明するために蚭蚈されたcache2k-benchmarkベンチマヌクを䜿甚したした 。 ここで同時に確認しおください。 この蚘事は、包括的なパフォヌマンステストを目的ずするものではなく、少なくずも科孊的に有効なものではありたせん。ApacheIgnite開発者にこれを蚱可しおください。 倧きさの順序、䞻な機胜、ランキングの盞察的な䜍眮を芋るだけで、ConcurrentHashMapにはcache2kずネむティブキャッシュもありたす。



テスト方法



テスト方法論の䞀郚ずしお、私は車茪を再発明せず、cache2kに぀いお説明したものを採甚したした 。 JMHベヌスのラむブラリを䜿甚しお、倚くの䞀般的な操䜜のパフォヌマンスを比范したす。





この手法のリファレンスずしお、ConcurrentHashMapに基づいおキャッシュを実装するために取埗された倀が考慮されたす。これは、より高速なものはないず想定されるためです。 したがっお、すべおのカテゎリで、闘争は2䜍になりたす。 Cache2k-benchmark以降CB は、cache2kおよびその他のいく぀かのプロバむダヌCaffeine、EhCache、Guava、Infinispan、TCache、およびConcurrentHashMapに基づくネむティブ実装甚のスクリプトを実装したす。 他のベンチマヌクもCBに実装されおいたすが、これら2぀に限定したす。



枬定は、次の条件䞋で実行されたした。





Apache Igniteキャッシュの動䜜は、トポロゞここではApache Igniteトポロゞの基本抂念を思い出すこずをお勧めしたすず負荷分散が異なるいく぀かのモヌドで調査されたした。





CBの芁件に埓っお、IgniteCacheFactoryクラスが実装されたした コヌドは 、 CBフォヌクに基づいおGitHubで利甚可胜です 。 サヌバヌずクラむアントは、次の蚭定で䜜成されたす。



サヌバヌ構成
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="ignite.cfg-server" class="org.apache.ignite.configuration.IgniteConfiguration"> <property name="gridName" value="testGrid"/> <property name="clientMode" value="false"/> <property name="peerClassLoadingEnabled" value="false"/> <property name="cacheConfiguration"> <list> <bean class="org.apache.ignite.configuration.CacheConfiguration"> <property name="name" value="testCache"/> <property name="cacheMode" value="LOCAL"/> <property name="statisticsEnabled" value="false" /> <property name="writeSynchronizationMode" value="FULL_ASYNC"/> </bean> </list> </property> <property name="discoverySpi"> <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi"> <property name="ipFinder"> <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder"> <property name="addresses"> <list> <value>127.0.0.1:47520..47529</value> </list> </property> </bean> </property> <property name="localAddress" value="localhost"/> </bean> </property> <property name="communicationSpi"> <bean class="org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi"> <property name="localAddress" value="localhost"/> </bean> </property> </bean> </beans>
      
      







クラむアントずサヌバヌのキャッシュ蚭定が同じであるこずが重芁です。



サヌバヌは、オプション-Xms1g -Xmx14g -server -XX+ AggressiveOpts -XXMaxMetaspaceSize = 256mを䜿甚しお、同じJVMを䜿甚しおテスト倖のコマンドラむンから䜜成されたす。぀たり、ほずんどすべおのメモリを提䟛したす。 サヌバヌを起動しお、バむザヌで接続したす詳现に぀いおは、シリヌズの2番目の蚘事を参照しおください。 cacheコマンドを䜿甚しお、キャッシュが存圚し、初期状態であるこずを確認したす。









クラスを䜿甚しおCBず接続したす



ベンチマヌク甚のファクトリヌキャッシュ
 public class IgniteCacheFactory extends BenchmarkCacheFactory { static final String CACHE_NAME = "testCache"; static IgniteCache cache; static Ignite ignite; static synchronized IgniteCache getIgniteCache() { if (ignite == null) ignite = Ignition.ignite("testGrid"); if (cache == null) cache = ignite.getOrCreateCache(CACHE_NAME); return cache; } @Override public BenchmarkCache<Integer, Integer> create(int _maxElements) { return new MyBenchmarkCache(getIgniteCache()); } static class MyBenchmarkCache extends BenchmarkCache<Integer, Integer> { IgniteCache<Integer, Integer> cache; MyBenchmarkCache(IgniteCache<Integer, Integer> cache) { this.cache = cache; } @Override public Integer getIfPresent(final Integer key) { return cache.get(key); } @Override public void put(Integer key, Integer value) { cache.put(key, value); } @Override public void destroy() { cache.destroy(); } @Override public int getCacheSize() { return cache.localSize(); } @Override public String getStatistics() { return cache.toString() + ": size=" + cache.size(); } } }
      
      







ここでは、クラむアントモヌドでサヌバヌに接続し、サヌバヌからキャッシュを取埗したす。 テストの終了時にクラむアントを停止するこずが重芁です。そうしないず、JMHはテストの終了時にただスレッドが動䜜しおいるこずを誓いたす-Igniteはその機胜のために倚くのスレッドを䜜成したす。 たた、オフセットは各反埩埌にキャッシュを削陀する時間であるこずに泚意しおください。 これを調査方法のコストず芋なしたす。぀たり、キャッシュ自䜓のパフォヌマンスだけでなく、キャッシュの管理コストも考慮したす。



ベンチマヌククラス
 @State(Scope.Benchmark) public class IgnitePopulateParallelOnceBenchmark extends PopulateParallelOnceBenchmark { Ignite ignite; { if (ignite == null) ignite = Ignition.start("ignite/ignite-cache.xml"); } @TearDown(Level.Trial) public void destroy() { if (ignite != null) { ignite.close(); ignite = null; } } }
      
      







結果



mvn clean installを䜿甚しおプロゞェクトをビルドした埌、たずえば次のコマンドでテストを実行できたす。

java -jar <BENCHMARK_HOME> \ benchs.jar PopulateParallelOnceBenchmark -jvmArgs "-server -Xmx14G -XX+ UseG1GC -XX+ UseBiasedLocking -XX+ UseCompressedOops" -gc true -f 2 -wi 3 -w r 30s -t 2 -p cacheFactory = org.cache2k.benchmark.thirdparty.IgniteCacheFactory -rf json -rff e\ tmp \ 1.json。 JMH蚭定は元のベンチマヌクから取られたものであり、ここでは説明したせん。 「-t 1」パラメヌタヌは、キャッシュで䜿甚するスレッドの数を瀺したす。 念のため、14Gbのメモリを瀺したした。 「-f 2」は、2぀のJVMフォヌクが䞊昇しおテストを実行するこずを意味したす。これにより、信頌区間JMH出力の「゚ラヌ」列が倧幅に枛少したす。



耇数のスレッドでキャッシュを埋める



たず、cacheMode = LOCALでApache Igniteのテストを実行したす。 この堎合、サヌバヌず察話する意味がないので、サヌバヌモヌドでテストするためにノヌドを䞊げ、誰にも接続したせん。 100䞇から100䞇、200䞇、400䞇、800䞇の数字をキャッシュするのにかかる時間を枬定したす。 スレッド1、4、8の数8コアプロセッサを持っおいたすの堎合、結果は次のようになりたす。



4぀のストリヌムが1぀のストリヌムの玄2倍の速床である堎合、さらに4぀のストリヌムを远加するず玄20のゲむンが埗られるこずがわかりたす。 ぀たり、スケヌリングは非線圢です。 比范のために、ConcurrentHashMapずcache2kが衚瀺するものを芋おみたしょう。



ConcurrentHashMap



cache2k



したがっお、ロヌカルモヌドで挿入するず、IgniteキャッシュはConcurrentHashMapの玄10倍、cache2kの4〜5倍遅くなりたす。 次に、同じマシン䞊の2぀のサヌバヌノヌド間でキャッシュをパヌティション分割できるオヌバヌヘッドを評䟡しおみたしょう぀たり、キャッシュは半分に分割されたす。 たずえば、独自のシリアル化を䜿甚したす。これは、独自のシリアル化よりも20倍高速です。 テスト䞭に、バむザヌを芋るこずができたす。これは理にかなっおいたす。トポロゞがありたす。









最埌に、これらの悲惚な数字を芋たす









぀たり、キャッシュを分割しおも、コストはそれほどかかりたせんでしたが、10倍は悪化したした。 REPLICATEDキャッシュモヌドは調査されたせんでした。デヌタは䞡方のノヌドに保存されたす。



読み取り専甚



倚くのパラメヌタヌで状況を耇雑にしないために、4぀のスレッドでこのテストを行い、Igniteはロヌカルでのみ起動したす。 ここでは、 ReadOnlyBenchmarkを䜿甚したす。 キャッシュには10䞇個の゚ントリが栌玍されおおり、ヒット率が異なる倀がキャッシュからランダムに遞択されたす。 1秒あたりの操䜜数が枬定されたす。



Cache2k / ConcurrentHashMap / Igniteデヌタは次のずおりです。



぀たり、Cache2kはConcurrentHashMapの1.5〜2.5倍、Igniteは2〜3倍も劣っおいたす。



結論



したがっお、Igniteは、控えめに蚀っおも、キャッシュの速床に衝撃を䞎えたせん。 私は事前に可胜な非難に答えようずしたす





たあなど。 䞀般的に、Igniteはパフォヌマンスの゜ヌスずしおではなく、分散アプリケヌションのアヌキテクチャフレヌムワヌクずしお䜿甚する必芁がありたす。 おそらく、圌はさらに抑制された䜕かを加速するこずができたす。 もちろん、私芋。



Igniteのパフォヌマンスに関する私の芋解を共有しおください。



参照資料






All Articles