インメモリデータグリッドApache Igniteの性能をYardstickを使用して測定してみた

# はじめに

Igniteの性能測定用に、「Yardstick Apache Ignite(yardstick-ignite)」というベンチマークが提供されています。
このベンチマークはYardstick Frameworkの上に書かれてます。Yardstickはベンチマークを書くためのフレームワークで、クラスター化されたシステムやその他の分散システムのベンチマークを作成するのに利用されています。

Yardstickを使ったIgniteの性能を測定してみます。

以下を参考にしています。

https://apacheignite.readme.io/docs/perfomance-benchmarking

# 環境

VirtualBox上に以下の3台のサーバを構築しました。
各サーバはCentOS7で、1core、メモリ3GBにしています。

igniteserver1：Igniteクラスタ用サーバ(192.168.10.71)
igniteserver2：Igniteクラスタ用サーバ(192.168.10.72)
igniteserver3：Yardstick用サーバ(192.168.10.73)

各環境にはIgniteをインストール済みです。YardstickはIgniteに同梱されているものを利用するため、環境構築はありません。

Apache Igniteのインストール方法は以下の記事を参考にしてください。

[インメモリデータグリッド Apache Igniteを始めてみる（Java）](https://qiita.com/mkyz08/items/81a526827a573ea17805)


# 用意されているベンチマーク

Ignite用に標準で提供されているベンチマークは以下の24個があります。
今回は試しに2～5のベンチマークを実施してみます。

実行するのは、Atomicとトランザクションの2種類×put/put+getの2種類＝4種類となります。


1. GetBenchmark - benchmarks atomic distributed cache get operation.
1. PutBenchmark - benchmarks atomic distributed cache put operation.
1. PutGetBenchmark - benchmarks atomic distributed cache put and get operations together.
1. PutTxBenchmark - benchmarks transactional distributed cache put operation.
1. PutGetTxBenchmark - benchmarks transactional distributed cache put and get operations together.
1. SqlQueryBenchmark - benchmarks distributed SQL query over cached data.
1. SqlQueryJoinBenchmark - benchmarks distributed SQL query with a Join over cached data.
1. SqlQueryPutBenchmark - benchmarks distributed SQL query with simultaneous cache updates.
1. AffinityCallBenchmark - benchmarks affinity call operation.
1. ApplyBenchmark - benchmarks apply operation.
1. BroadcastBenchmark - benchmarks broadcast operations.
1. ExecuteBenchmark - benchmarks execute operations.
1. RunBenchmark - benchmarks running task operations.
1. PutGetOffHeapBenchmark - benchmarks atomic distributed cache put and get operations together off-heap.
1. PutGetOffHeapValuesBenchmark - benchmarks atomic distributed cache put value operations off-heap.
1. PutOffHeapBenchmark - benchmarks atomic distributed cache put operations off-heap.
1. PutOffHeapValuesBenchmark - benchmarks atomic distributed cache get value operations off-heap.
1. PutTxOffHeapBenchmark - benchmarks transactional distributed cache put operation off-heap.
1. PutTxOffHeapValuesBenchmark - benchmarks transactional distributed cache put value operation off-heap.
1. SqlQueryOffHeapBenchmark -benchmarks distributed SQL query over cached data off-heap.
1. SqlQueryJoinOffHeapBenchmark - benchmarks distributed SQL query with a Join over cached data off-heap.
1. SqlQueryPutOffHeapBenchmark - benchmarks distributed SQL query with simultaneous cache updates off-heap.
1. PutAllBenchmark - benchmarks atomic distributed cache batch put operation.
1. PutAllTxBenchmark - benchmarks transactional distributed cache batch put operation.


# Yardstickの設定

Igniteを「/opt/apache-ignite」にインストールした場合、Yardstickは「/opt/apache-ignite/benchmarks」にあります。

IgniteクラスタはYardstickから自動起動されるため、起動しておく必要はありません。

リモートでIgniteクラスタへ接続してベンチマークを実行するため、「ignite-remote-config.xml」の設定を変更します。

```
cd /opt/apache-ignite/benchmarks/config
vi ignite-remote-config.xml
```

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
    Ignite Spring configuration file to startup grid.
-->
<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-2.5.xsd">
    <import resource="ignite-base-config.xml"/>

    <bean id="grid.cfg" class="org.apache.ignite.configuration.IgniteConfiguration" parent="base-ignite.cfg">

        <property name="discoverySpi">
            <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
                <property name="ipFinder">
                    <bean
                        class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">
                        <property name="addresses">
                            <list>
                                <!-- In distributed environment, replace with actual hosts IP addresses. -->
                                <value>192.168.10.71:47500</value>
                                <value>192.168.10.72:47500</value>
                            </list>
                        </property>
                    </bean>
                </property>
            </bean>
        </property>
    </bean>
</beans>
```


次にベンチマークの設定を変更します。
「benchmark-remote-sample.properties」というサンプルファイルがあるので、これをコピーして設定ファイルを作成します。

```
cp -p benchmark-remote-sample.properties benchmark-remote-test.properties
vi benchmark-remote-test.properties
```

プロパティファイルのSERVER_HOSTS項目に、IgniteノードのIPアドレスを入れます。

```properties
SERVER_HOSTS=192.168.10.71,192.168.10.72
```

実行するベンチマークを追加します。
「benchmark.properties」を参考にして作成します。

```properties
# Run configuration.
# Note that each benchmark is set to run for 300 seconds (5 min) with warm-up set to 60 seconds (1 minute).
CONFIGS="\
-cfg ${SCRIPT_DIR}/../config/ignite-remote-config.xml -nn ${nodesNum} -b ${b} -w ${w} -d ${d} -t ${t} -sm ${sm} -dn IgnitePutBenchmark -sn IgniteNode -ds ${ver}atomic-put-${b}-backup,\
-cfg ${SCRIPT_DIR}/../config/ignite-remote-config.xml -nn ${nodesNum} -b ${b} -w ${w} -d ${d} -t ${t} -sm ${sm} -dn IgnitePutGetBenchmark -sn IgniteNode -ds ${ver}atomic-put-get-${b}-backup,\
-cfg ${SCRIPT_DIR}/../config/ignite-remote-config.xml -nn ${nodesNum} -b ${b} -w ${w} -d ${d} -t ${t} -sm ${sm} -dn IgnitePutTxBenchmark -sn IgniteNode -ds ${ver}tx-put-${b}-backup,\
-cfg ${SCRIPT_DIR}/../config/ignite-remote-config.xml -nn ${nodesNum} -b ${b} -w ${w} -d ${d} -t ${t} -sm ${sm} -dn IgniteGetAndPutTxBenchmark -sn IgniteNode -ds ${ver}tx-getAndPut-${b}-backup,\
"
```

Yardstickを実行するサーバ（Driverと呼ぶようです）から、各IgnoreノードへSSHでログインできるようにします。

```
# ssh-keygen -t rsa
(パスフレーズは入力しない)

# ssh-copy-id root@192.168.10.71
# ssh-copy-id root@192.168.10.72

# ssh root@192.168.10.71
# ssh root@192.168.10.72
```


「benchmark-run-all.sh」でベンチマークを開始します。

```
[root@igniteserver3 config]#  ../bin/benchmark-run-all.sh ./benchmark-remote-test.properties
<02:20:00><yardstick> Creating output directory
../bin/benchmark-run-all.sh: line 73: ifconfig: command not found
<02:20:00><yardstick> Copying yardstick to the host 192.168.10.71
Warning: Permanently added '192.168.10.71' (ECDSA) to the list of known hosts.
```

ベンチマークを実行すると、上のようにifconfigがないと怒られるので、net-toolsをインストールする。

```
# yum install -y net-tools
```

Ctrl-Cで強制終了した場合、Ignoreノードが起動したままになります。その状態でベンチマークを再実行すると残っていたIgnoreノードもクラスタに参加してしまうので、強制終了した場合は個別にIgnoreノードを停止する必要があります。


Visorで見てみると、サーバが3台起動しているようです。
1台がClientとなると思ったのですが、そうではないようです。


```
visor> top
Hosts: 3
+============================================================================================================================+
| Int./Ext. IPs |   Node ID8(@)    | Node Type |                  OS                   | CPUs |       MACs        | CPU Load |
+============================================================================================================================+
| 10.0.2.15     | 1: 0908F8F4(@n0) | Server    | Linux amd64 3.10.0-693.2.2.el7.x86_64 | 1    | 02:42:4A:05:5B:CD | 55.00 %  |
| 127.0.0.1     |                  |           |                                       |      | 08:00:27:76:F3:CF |          |
| 172.17.0.1    |                  |           |                                       |      | 08:00:27:E3:4A:44 |          |
| 192.168.10.71 |                  |           |                                       |      |                   |          |
+---------------+------------------+-----------+---------------------------------------+------+-------------------+----------+
| 10.0.2.15     | 1: 02A9366F(@n1) | Server    | Linux amd64 3.10.0-693.2.2.el7.x86_64 | 1    | 08:00:27:76:F3:CF | 51.33 %  |
| 127.0.0.1     |                  |           |                                       |      | 08:00:27:7F:64:16 |          |
| 192.168.10.72 |                  |           |                                       |      |                   |          |
+---------------+------------------+-----------+---------------------------------------+------+-------------------+----------+
| 10.0.2.15     | 1: 97EFB660(@n2) | Server    | Linux amd64 3.10.0-693.2.2.el7.x86_64 | 1    | 08:00:27:64:78:7A | 90.33 %  |
| 127.0.0.1     |                  |           |                                       |      | 08:00:27:76:F3:CF |          |
| 192.168.10.73 |                  |           |                                       |      |                   |          |
+----------------------------------------------------------------------------------------------------------------------------+

Summary:
+--------------------------------------+
| Active         | true                |
| Total hosts    | 3                   |
| Total nodes    | 3                   |
| Total CPUs     | 3                   |
| Avg. CPU load  | 65.56 %             |
| Avg. free heap | 83.00 %             |
| Avg. Up time   | 00:03:58            |
| Snapshot time  | 2018-08-25 02:48:02 |
+--------------------------------------+
```

「cache -a」で見てみると、以下のように3サーバともにキャッシュが格納されています。
ということは、DriverのサーバもIgnoreクラスタに入っており、性能測定の対象になっているようです。

```
Cache 'atomic(@c0)':
+-----------------------------------------------------------+
| Name(@)                     | atomic(@c0)                 |
| Nodes                       | 3                           |
| Total size Min/Avg/Max      | 305670 / 333334.33 / 350590 |
|   Heap size Min/Avg/Max     | 0 / 1.00 / 3                |
|   Off-heap size Min/Avg/Max | 305670 / 333333.33 / 350587 |
+-----------------------------------------------------------+

Nodes for: atomic(@c0)
+============================================================================================================+
|     Node ID8(@), IP      | CPUs | Heap Used | CPU Load |   Up Time    |         Size         | Hi/Mi/Rd/Wr |
+============================================================================================================+
| 02A9366F(@n1), 10.0.2.15 | 1    | 29.76 %   | 40.33 %  | 00:06:43.146 | Total: 305670        | Hi: 0       |
|                          |      |           |          |              |   Heap: 0            | Mi: 0       |
|                          |      |           |          |              |   Off-Heap: 305670   | Rd: 0       |
|                          |      |           |          |              |   Off-Heap Memory: 0 | Wr: 0       |
+--------------------------+------+-----------+----------+--------------+----------------------+-------------+
| 0908F8F4(@n0), 10.0.2.15 | 1    | 24.59 %   | 45.00 %  | 00:06:43.395 | Total: 343743        | Hi: 0       |
|                          |      |           |          |              |   Heap: 0            | Mi: 0       |
|                          |      |           |          |              |   Off-Heap: 343743   | Rd: 0       |
|                          |      |           |          |              |   Off-Heap Memory: 0 | Wr: 0       |
+--------------------------+------+-----------+----------+--------------+----------------------+-------------+
| 927AB38D(@n2), 10.0.2.15 | 1    | 20.24 %   | 88.00 %  | 00:00:34.269 | Total: 350590        | Hi: 0       |
|                          |      |           |          |              |   Heap: 3            | Mi: 0       |
|                          |      |           |          |              |   Off-Heap: 350587   | Rd: 0       |
|                          |      |           |          |              |   Off-Heap Memory: 0 | Wr: 0       |
+------------------------------------------------------------------------------------------------------------+


```

ベンチマークの実行が終わると自動で結果がグラフ出力されます。


```bash
<03:08:51><yardstick> Driver is stopped on localhost
<03:08:51><yardstick> Server is stopped on 192.168.10.71
<03:08:51><yardstick> Server is stopped on 192.168.10.72
<03:08:52><yardstick> Collecting results from the host 192.168.10.71
<03:08:53><yardstick> Collecting results from the host 192.168.10.72
<03:08:54><yardstick> Creating charts
Moving chart directory to the /opt/apache-ignite/benchmarks/output/results-20180825-024401 directory.
```

HTMLファイルで出力されており、開くの以下のように表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/fa02afce-ec39-c880-ba0a-737340499f3f.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/b0c53071-632a-1a85-b785-d65754c2d408.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/64d6ea51-263a-3001-e719-3e3983778e8b.png)

Putだと平均38,000オペレーション（青）ですが、トランザクションを有効にすると平均11,000程度（赤）まで落ち込んでいることが分かります。
最初からベンチマークが同梱されているため、簡単に性能測定することができました。
今回はデフォルトパラメータで実行しましたが、今後、色々変更して性能の変化を確認してみたいですね。

# YCSB (Yahoo Cloud Serving Benchmark)

YCSB (Yahoo Cloud Serving Benchmark)もIgniteに対応しているようです。

YCSBを使用したベンチマークの結果が以下に掲載されていました。
Apache® Ignite™ and Apache® Cassandra™ Benchmarks: The Power of In-Memory Computing
https://www.gridgain.com/resources/blog/apacher-ignitetm-and-apacher-cassandratm-benchmarks-power-in-memory-computing