`Ctrl`+`K`

# 7.24. チューニング

## 7.24.1. 概要

大きなデータベースを扱うためのチューニングパラメーターがいくつかあります。

## 7.24.2. 引数

このセクションではチューニングパラメーターについて説明します。

### 7.24.2.1. 1プロセスで開ける最大ファイル数

このパラメーターは大きなデータベースを扱うためのパラメーターです。

Groongaは1つのテーブル・カラムごとに1つ以上のファイルを作ります。もし、データベース内にたくさんのテーブル・カラムがある場合は、Groongaプロセスはたくさんのファイルを開く必要があります。

システムでは1プロセスごとに開ける最大ファイル数を制限しています。そのため、この制限を緩和する必要があります。

Groongaがどのくらいファイルを開くのかを計算する式は次の通りです。:

    3 (for DB) +
      N tables +
      N columns (except index clumns) +
      (N index columns * 2) +
      X (the number of plugins etc.)

次のスキーマを例として考えます。:

    table_create Entries TABLE_HASH_KEY ShortText
    column_create Entries content COLUMN_SCALAR Text
    column_create Entries n_likes COLUMN_SCALAR UInt32
    table_create Terms TABLE_PAT_KEY ShortText --default_tokenizer TokenBigram --normalizer NormalizerAuto
    column_create Terms entries_key_index COLUMN_INDEX|WITH_POSITION Entries _key
    column_create Terms entries_content_index COLUMN_INDEX|WITH_POSITION Entries content

この例では少なくとも11ファイル開きます。:

    3 +
      2 (Entries and Terms) +
      2 (Entries.content and Entries.n_likes) +
      4 (Terms.entries_key_index and Terms.entries_content_index) +
      X = 11 + X

### 7.24.2.2. メモリ使用量

このパラメーターは大きなデータベースを扱うためのパラメーターです。

Groongaはデータベースファイルをメモリー上にマップしてデータベース内のデータにアクセスします。Groongaはすべてのファイルをマップするわけではなく、そのファイルの内容が必要になった段階でマップします。

データベース内のすべてのデータにアクセスすると、データベースのすべてのファイルをメモリー上にマップします。もし、データベースファイルの総サイズが6GiBなら、Groongaプロセスも6GiBのメモリーを使います。

通常、データベースのすべてのファイルをメモリー上にマップすることはありません。しかし、マップすることもあります。たとえば、データベースの内容をダンプするときです。

通常、メモリーとスワップをあわせてデータベースのサイズより大きな量を用意する必要があります。Linuxにはメモリーとスワップの総量がデータベースサイズよりも小さくても動くようにできるチューニングパラメーターがあります。

## 7.24.3. Linux

このセクションではLinux上でパラメーターをカスタマイズする方法について説明します。

### 7.24.3.1. `nofile`

次の内容の `/etc/security/limits.d/groonga.conf` 設定ファイルを作ることで 1プロセスで開ける最大ファイル数 パラメーターの制限を緩和することができます。:

    ${USER} soft nofile ${MAX_VALUE}
    ${USER} hard nofile ${MAX_VALUE}

Groongaプロセスを `groonga` ユーザーで動かし、Groongaプロセスが10000以下のファイルを開くなら、次の設定を使います。:

    groonga soft nofile 10000
    groonga hard nofile 10000

この設定はGroongaサービスが再起動したあと、あるいは、 `groonga` ユーザーがログインし直したときに反映されます。

### 7.24.3.2. `vm.overcommit_memory`

これは メモリ使用量 関連のパラメーターです。 `vm.overcommit_memory` カーネルパラメーターを `1` に設定することで、メモリーとスワップの総量以上のサイズのデータベースを扱うことができます。 `1` は「Groongaは常にデータベースファイルをメモリー上にマップできる」という意味です。Groongaはこの設定を推奨しています。

`vm.overcommit_memory` パラメーターの詳細は overcommitに関するLinuxカーネルのドキュメント を参照してください。

次の内容の `/etc/sysctl.d/groonga.conf` 設定ファイルを作成することでこの設定をすることができます。:

    vm.overcommit_memory = 1

設定した内容はシステムを再起動するか、次のコマンドを実行することで反映されます。:

    % sudo sysctl --system

### 7.24.3.3. `vm.max_map_count`

これは メモリ使用量 関連のパラメーターです。 `vm.max_map_count` カーネルパラメーターの値を増やすことで16GiB以上のサイズのデータベースを扱うことができます。このパラメーターはメモリーマップの回数を制限します。

このカーネルパラメーターのデフォルト値は `65530` か `65536` です。Groongaは一度に256KiBずつメモリー上にマップします。データベースが16GiBよりも大きい場合、Groongaはこの制限に達します。（ `256KiB * 65536 = 16GiB` ）

16GiB以上のサイズのデータベースを扱う場合はこのカーネルパラメーターの値を増やす必要があります。たとえば、 `65536 * 2 = 131072` まで増やすと32GiBくらいのデータベースを扱うことができます。次の内容の設定ファイルを `/etc/sysctl.d/groonga.conf` に置くとこの設定を適用できます。:

    vm.max_map_count = 131072

すでに `vm.overcommit_memory` の設定があるはずなので、実際の設定ファイルの内容は次のようになることに注意してください。:

    vm.overcommit_memory = 1
    vm.max_map_count = 131072

設定した内容はシステムを再起動するか、次のコマンドを実行することで反映されます。:

    % sudo sysctl -p

## 7.24.4. FreeBSD

このセクションではFreeBSD上で引数をカスタマイズする方法を説明します。

### 7.24.4.1. `kern.maxfileperproc`

TODO