本文へスキップ
`Ctrl`+`K`

# 7.3.2. 並列実行

## 7.3.2.1. 概要

Groongaはデフォルトでは逐次的に実行しますが、オプションで並列数を指定することで並列実行することもできます。

次のセクションでは並列実行するための設定方法を説明します。その後に注意点も記載しているので合わせてご確認の上でご利用ください。

## 7.3.2.2. 使い方

### 7.3.2.2.1. Groongaコマンドごとに設定する

実行するGroongaコマンドでのみ有効です。

#### 7.3.2.2.1.1. Groongaコマンドの`--n_workers`オプションで指定する

Groongaコマンド例:

    load --table Data --n_workers -1
    [
    {"_key", "value"}
    ]

### 7.3.2.2.2. デフォルト値を設定する

デフォルト値を設定するとGroongaコマンドごとに指定する必要はありません。すべてのGroongaコマンドでデフォルト値が利用されます。

#### 7.3.2.2.2.1. `groonga`実行ファイルの`--default-n-workers`オプションで指定する

Execution example:

    $ groonga --default-n-workers -1 DB_PATH status

#### 7.3.2.2.2.2. 環境変数`GRN_N_WORKERS_DEFAULT`で指定する

Execution example:

    $ GRN_N_WORKERS_DEFAULT=-1 groonga DB_PATH status

### 7.3.2.2.3. 設定できる値

並列数を設定することができ、`-1` または `2` 以上を指定すると並列で実行します。

n_workers | 挙動
--- | ---
`0`または`1`を指定した場合 | 並列実行しません。
`2`以上を指定した場合 | 指定したスレッド数以下で並列実行します。
`-1`を指定した場合 | CPUのコア数以下のスレッドで並列実行します。

## 7.3.2.3. 設定の確認

statusコマンドの`n_workers`と`default_n_workers`の値で確認できます。

Execution example:

    status
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   {
    #     "alloc_count": 29,
    #     "starttime": 1696558618,
    #     "start_time": 1696558618,
    #     "uptime": 1,
    #     "version": "2.9.1",
    #     "n_queries": 0,
    #     "cache_hit_rate": 0.0,
    #     "command_version": 1,
    #     "default_command_version": 1,
    #     "max_command_version": 3,
    #     "n_jobs": 0,
    #     "features": {
    #       "nfkc": true,
    #       "mecab": true,
    #       "message_pack": true,
    #       "mruby": true,
    #       "onigmo": true,
    #       "zlib": true,
    #       "lz4": true,
    #       "zstandard": true,
    #       "kqueue": false,
    #       "epoll": true,
    #       "poll": false,
    #       "rapidjson": false,
    #       "apache_arrow": true,
    #       "xxhash": true,
    #       "blosc": true,
    #       "bfloat16": true,
    #       "h3": true,
    #       "simdjson": true,
    #       "llama.cpp": true,
    #       "back_trace": true,
    #       "reference_count": false
    #     },
    #     "apache_arrow": {
    #       "version_major": 2,
    #       "version_minor": 9,
    #       "version_patch": 1,
    #       "version": "2.9.1"
    #     },
    #     "memory_map_size": 2929,
    #     "n_workers": 0,
    #     "default_n_workers": 0,
    #     "os": "Linux",
    #     "cpu": "x86_64"
    #   }
    # ]

`n_workers`はGroongaコマンドごとに使われる値、`default_n_workers`はデフォルト値です。

## 7.3.2.4. 注意点

### 7.3.2.4.1. Apache Arrowが必須

Apache Arrow が有効である必要があります。

パッケージの提供元によりApache Arrowが有効かどうかは異なります。

Apache Arrow が有効かどうかは、status コマンドの結果で`apache_arrow`が`true`かどうかで確認することができます。

### 7.3.2.4.2. 常駐プロセスで利用する場合

たとえば、CPUが6個のシステムでGroonga HTTPサーバー を使うケースを考えます。

Groonga HTTPサーバーは各リクエストごとに1スレッド（= 1 CPU）を割り当てて処理します。

平均同時接続数が6のとき、CPUを既に6つ使用しているのでCPUのリソースに空きはありません。各リクエストを処理するためにすべてのCPUが使われているからです。

平均同時接続数が2のとき、リクエストを処理するためにはCPUを2つしか使用していないので、4つ空きがあります。`n_workers`に`2`を指定すると、リクエストを処理するためのスレッドを含んで最大で3つのCPUを使用します。そのため、`n_workers`に`2`を指定したGroongaプロセスに同時に2つリクエストがあると、合計で最大で6つのCPUを使用することになりリソースをすべて使って高速に処理できます。 `2`より大きな値を指定すると、CPUのリソースよりも高い並列度になってしまうので、かえって実行が遅くなる可能性があります。

## 7.3.2.5. 並列実行のサポート状況

- 静的なインデックス構築

- load

- select