MySQL - Mroonga でメモリマッピングエラー!

Updated:


Mroonga は、全文検索エンジン Groonga をベースとした MySQL のストレージエンジンです。

Mroonga を利用した自作ツールを実行した際に、メモリマッピングに関するエラーが発生するようになったので、その対処方法について記録しておきます。

0. 前提条件

  • CentOS 6.8(32bit)
  • MySQL 5.7.14 (Mroonga プラグイン有効)
    • データベースの総容量は 42GB 程度
  • Mroonga にそれほど長けている訳でもないので、以下の記述に誤りがあるかもしれない。

1. 現象

MySQL を使用した自作ツールを実行すると、以下のようなエラーが発生することがある。

mmap(262144,444,66883584)=Cannot allocate memory <306810880>

メモリのマッピングに失敗しているようだ。

2. 原因

大きなデータベースを扱うための Groonga のパラメータが適切に設定されていないため。(おそらく)

3. 対策

7.22. チューニング — Groonga v6.0.7ドキュメント」を参考に、 “/etc/sysctl.conf” に vm.overcommit_memoryvm.max_map_count の設定を記述する。

まず、現在値を確認してみる。

# sysctl -a | grep overcommit_memory

# sysctl -a | grep max_map_count
vm.max_map_count = 262144

vm.overcommit_memory は未設定で、 vm.max_map_count には 262144 が設定されている。

Groonga は一度に 256KiB ずつメモリー上にマップするようなので、上記の場合は、 262,144 * 256(KiB) = 67,108,864(KiB) = 65536(MiB) = 64(GiB) となり、データベースのサイズが 64GiB までは問題ないはず。

vm.overcommit_memory が未設定なのが問題のようなので、設定しておく。

File: /etc/sysctl.conf

1
2
vm.overcommit_memory = 1
vm.max_map_count = 266144

逆に、vm.overcommit_memory が設定済みにも関わらずエラーとなる場合は、 vm.max_map_count の値を確認してみる。

“/etc/sysctl.conf” を編集し終えたら、以下を実行して設定を有効化する。

# sysctl -p
      :
===< 中略 >===
      :
vm.overcommit_memory = 1
vm.max_map_count = 262144

これで、様子を見てみる。

4. 参考サイト


Mroonga 導入後に忘れがちな作業なので、記録しておいた次第です。

以上。





 

Sponsored Link

 

Comments