MarkLogicのContent Pump(mlcp)でのCSVファイルのロードとチューニング

概要
===
MarLogic Content Pump(以下、mlcp)を使ったデータロードをWindowsノートPC上で実行した際に色々とパラメータを動かしてみたので、その結果を示します。結論から言うと、性能面ではmlcpスレッド数・DB索引設定・ディスク性能の3つが効きました。

実行環境
===
| 項目 | 詳細 |
|---|---|
| OS | Windows10 Home |
| CPU | インテル® Core™ i7-4710MQ プロセッサー 4core/8スレッド |
| メモリ | 16GB |
| Java | jdk1.8.0_241 |
| MarkLogic | 10.0.3 |
| mlcp | 10.0.3 |

前提条件
===
・MarkLogicやJavaのインストール済み
・mlcp実行ファイルがダウンロード済み
・MarkLogic内にフォレスト/データベース/XDBCサーバ(ポート8062番)が作成済み

試験対象パラメータ
===
データロードは速いに越したことはないのですが、mlcpコマンドやDBパラメータなどを色々と調整してみることにしました。

1) mlcpパラメータ

| 項目 | 説明 |
|---|---|
| -thread_count | 実行時のスレッド数設定。デフォルトは4。 |
| -batch_size | 1リクエスト当たりの更新実行数。デフォルトは100。最大200。 | 
| -transaction_size | 1トランザクション当たりのリクエスト数。デフォルトは10。最大値は4000/actualBatchSizeに制限される。 | 
| -split_input | CSVなどをロードする際にファイルを分割して実行するオプション。 |
| -max_split_size | ファイル分割時の1ファイル当たりの最大バイト数指定 |

2) DBパラメータ
「fast 〇〇 searches」系の３個はデフォルトはtrueなのですが、falseも試してみました。理由は日本語データのシステム開発をする上で、重要性が低いと思われるためです。

| 項目 | 説明 |
|---|---|
| language | トークナイズ文法の規定。jaに変更。 |
| fast phrase searches | 2つの単語を組み合わせるといった句への検索のための索引 | 
| fast case sensitive searches | 大文字小文字を区別する検索のための索引 | 
| fast diacritic sensitive searches | ラテン文字などにみられる発生区別符号を区別する検索のための索引 | 

3) フォレスト配置
・HDD上で1または2個設定～2coreに対して1Forestという指標があるため。
・HDD/SSD

4)ウイルス対策ソフトの起動/停止

データの準備
===
適当なCSVファイルを作りました。サイズは286MBです。1行目に列名としてdata1～data50を配置し、データには"sample"と5桁の数字を文字列連結したものを50万行ならべました。このファイルをC:\work\load_csvに置きます。
データロード後にはCSV1行が1個のXML形式データとして格納されます。

```
data1,data2,...,data50
sample46911,sample78291,...,sample99999
...
```

mlcpの実行コマンド
===
コマンドプロンプトを開いて、mlcp実行ファイルを置いたディレクトリ(今回はC:\work\mlcp\bin)に移動します。その上でバッチファイルを実行します。以下は、スレッド数16、バッチサイズ200、トランザクションサイズ20、ファイル分割を20MBを上限に実施というオプションを設定したものです。
（見やすいように適当なところで改行しています。）

```
mlcp.bat import -host localhost -input_file_path C:\work\load_csv -host localhost ^ 
-port 8062 -username admin -password admin ^ 
-output_uri_replace "/C:/work/load_csv, '/load_csv'" ^
-input_file_type delimited_text -delimiter "," ^
-generate_uri true -thread_count 16 ^ 
-batch_size 200 -transaction_size 20 ^ 
-split_input true -max_split_size 20971520
```

実施結果
===
表にまとめます。全てのパターンを検証する訳にはいかなかったので、ある程度で見切りをつけています。

| thread | batch | transaction size | max split size | ウイルス対策 | フォレスト数 | ディスク | 索引削除 | 処理時間[秒] |
|---|---|---|---|---|---|---|---|---|
| 4 | 100 | 10 | - | 有 | 1 | HDD | 設定 | 252 |
| 16 | 100 | 10 | - | 有 | 1 | HDD | 設定 | 209 |
| 16 | 100 | 10 | - | 無 | 1 | HDD | 設定 | 215 |
| 16 | 200 | 5 | - | 有 | 1 | HDD | 設定 | 213 |
| 16 | 200 | 10 | - | 有 | 1 | HDD | 設定 | 222 |
| 16 | 200 | 20 | - | 有 | 1 | HDD | 設定 | 213 |
| 16 | 200 | 20 | 20MB | 有 | 1 | HDD | 設定 | 208 |
| 16 | 200 | 20 | 40MB | 有 | 1 | HDD | 設定 | 233 |
| 16 | 200 | 20 | - | 有 | 1 | HDD | case, diacriticを無効 | 211 |
| 16 | 200 | 20 | - | 有 | 1 | HDD | phrase, case, diacriticを無効 | 172 |
| 16 | 200 | 20 | - | 有 | 2 | HDD | phrase, case, diacriticを無効 | 156 |
| 16 | 200 | 20 | - | 有 | 1 | SSD | phrase, case, diacriticを無効 | 105 |
| 16 | 200 | 20 | - | 有 | 2 | SSD | phrase, case, diacriticを無効 | 103 |

分析
===
・DB索引のうち、phraseの無効化は効果があった(211→172秒)。
・thread_countを4→16とすることで、処理時間が252→209秒と改善した。ただし、16にしてもCPUが90%を超えることはなかった。ディスクIOネックと推測。他のmlcpパラメータやウイルス対策ソフト停止は効果が低い。
・フォレストをSSDに置くとCPU使用率が100%近くとなって、ほぼほぼリソースを使い切ったと推測。
・フォレストの追加はHDDだと若干の効果があったが、SSDだとCPUネックのためか効果は見られない。

mlcpのチューニングを行う心構え
===
改めてmlcpを使う上での心構えを整理します。
・DBパラメータで設定できる索引は、業務要件を鑑みて必要最小限とする。デフォルトのものでも不必要であれば削除するべきである。
・mlcpパラメータで最も重要なのはthread_countである。少なくともCPU数と同数から開始する。スレッド数を大きくすると負荷も上がることから、他の処理は行わないこと。
・今回のようにmlcp実行とMarkLogicを同一端末にするのは実際のシステム開発ではMarkLogicの負荷の大きさやリソース分析の観点からNGと思われる。
・(当然ながら)ディスクはHDDよりSSDがよい。また(今回は未検証だが)各フォレストごとに別々のディスクとする。
・CPUネックとなった場合は、別のEノードを追加するスケールアウトを行う。

------------------------------------------------------------------------