Support #2109

[利用者向け FAQ] Mroonga の メモリ管理 について教えて下さい

Added by Kenji Maruyama about 4 years ago. Updated about 4 years ago.

Status:ドキュメント中Start date:12/03/2013
Priority:NormalDue date:
Assignee:Kenji Maruyama% Done:

0%

Category:-
Target version:-

History

#1 Updated by Kouhei Sutou about 4 years ago

これも質問がざっくり過ぎる気がするので分けたほうがいいんじゃないかと思いました。

  • Mroonga使っているメモリーを解放するにはどうしたらよいでしょうか。
  • Mroongaがたくさんメモリーを使っていますが大丈夫ですか?
  • map failed!!!というエラーがでたのですがどうしたらよいでしょうか。

とか、わけるのはどうでしょうか。

#2 Updated by Kouhei Sutou about 4 years ago

  • Status changed from 完了チェック待ち to ドキュメント中

#4 Updated by Susumu Yata about 4 years ago

全体的

人間の記憶という意味では「メモリー」という表記を使うこともありますが, IT 関連では「メモリ」の方が一般的だと思います.

一つ目

  • Q: Mroonga使っているメモリーを解放するにはどうしたらよいでしょうか。
  • A: FLUSH TABLES; を実行します。

「が」が抜けています.

それから,「使っているメモリを解放する」というのは違和感があります. おそらく,一般的なアプリケーションでは,外部から使っているメモリを解放するというのがありえない操作だからです. 「メモリ使用量を減らせないか」みたいな意味に変更した方が良いのではないでしょうか.

後,さすがにこの答えは簡潔すぎると思います. FLUSH TABLES を実行すると何が起きるのか(何が解放されるのか),メリットとデメリットも併せて説明すべきです.

二つ目

  • Q: Mroongaがたくさんメモリーを使っていますが大丈夫ですか?
  • A: 仮想メモリのサイズの肥大については mmap(2)を使っているからなのであまり気にしなくても大丈夫です。

「仮想メモリのサイズ」については大丈夫だとして,それ以外はどうなるのでしょうか. すごく気になります.

後,「mmap(2)を使っているから」というのは説明になっていないように思います. malloc で確保した領域についても,使わなければ大丈夫でしょうし…(※).

※ そもそも malloc が内部で mmap を使っているケースもありますが….

それから,余談ですが, Windows では mmap が使えません.

三つ目

  • Q: map failed!!!というエラーがでたのですがどうしたらよいでしょうか。
  • A: メモリを使い切るまでは十分なメモリがあるように振る舞う設定にすると解消されます。

「メモリを使い切るまでは十分なメモリがあるように振る舞う」というのは説明になっていないように思います. 「vm.overcommit_memory=1 にすることで解決できることがあります」とでもした方が親切なのではないでしょうか.

それから, /etc/sysctl.conf や /etc/sysctl.d/groonga.conf は MySQL 再起動じゃなくて OS 再起動で設定が有効になるのではないでしょうか. 後,「再起動後も設定が有効にする」じゃなくて「再起動後も設定を有効にする」だと思います.

解説のところではファイルのこととか 1GB ずつで分けることを説明していますが,ここでは関係ないように思います.

「必要になるまではメモリ上にロードされない」のと「データベースを閉じるまでは一度mmapした領域をunmapしません」というのを説明して「MroongaからはFLUSH TABLESを実行するとGroongaのデータベースを閉じることができます(※)」というのは素晴らしいのですが,これって一つ目と二つ目の質問に絡む内容じゃないでしょうか.

※ 閉じるだけだと大変なことになるので,一旦閉じるとか閉じて開き直すといったことを明示した方が良いと思います.

#5 Updated by Kouhei Sutou about 4 years ago

Susumu Yata wrote:

全体的


人間の記憶という意味では「メモリー」という表記を使うこともありますが, IT 関連では「メモリ」の方が一般的だと思います.

ちょっと、ここだけ!

Groonga関連プロジェクトでは、今後は 平成3年6月28日内閣告示第2号「外来語の表記」 に(できるだけ)あわせるのがいいんじゃないかと思っています。マイクロソフト( マイクロソフト製品ならびにサービスにおける外来語カタカナ用語末尾の長音表記の変更について) や、OSSの翻訳プロジェクト(スタイルガイド – JGUG Trac - 「カタカナ語の表記について(長音表記など) 原則として 外来語の表記(内閣告示第二号)に従う。」)でもあわせているからです。

で、そこでは、次のように、「ー」を省略しないとしています。(省略しても間違いではない。)

注3 英語の語末の-er, -or, -arなどに当たるものは,原則としてア列の長音とし長音符号「ー」を用いて書き表す。ただし,慣用に応じて「ー」を省くことができる。


〔例〕 エレベーター ギター コンピューター マフラー


エレベータ コンピュータ スリッパ

で、今回の「メモリー」ですが、「memory」で「-er, -or, -ar」で終わらないので「メモリ」でした!

マイクロソフトのスタイルガイド によると、「ー」も含めて4文字以上になるときは「ー」を省略するそうです。「キュー」は3文字なので省略しませんが、「メモリー」は4文字なので省略するそうです。

#6 Updated by Kenji Maruyama about 4 years ago

  • Status changed from 完了チェック待ち to ドキュメント中

レビューありがとうございます。全体的に MySQLバリバリな皆様向けに書いていて、MySQLマニュアルを参考にすでにMySQLマニュアルにあることは省略して書いていました。また、FAQという位置づけなので、質問と答え + 語弊があるかもしれませんが、大雑把なイメージ解説 + MySQLとの関係、Groongaとの関係や内部の詳しい挙動に関する詳細説明はMroongaのリファレンスへのリンク をゴールにしています。

「使っているメモリを解放する」というのは違和感があります. おそらく,一般的なアプリケーションでは,外部から使っているメモリを解放するというのがありえない操作だからです. 「メモリ使用量を減らせないか」みたいな意味に変更した方が良いのではないでしょうか.

メモリ解放もたしかに違和感を感じますが、ドキュメント化するにあたって、参考にしているMySQL (http://dev.mysql.com/doc/refman/5.1-olh/ja/flush.html) , tritonn ユーザガイド ("topコマンドでmysqldを監視して制限値に達する前に"flush tables"でメモリを解放する" http://qwik.jp/tritonn/userguide.html) のドキュメント等でつかわれていましたので慣例に従いました。。。

FLUSH TABLES を実行すると何が起きるのか(何が解放されるのか),メリットとデメリットも併せて説明すべきです.

MySQLのマニュアルにある "開いているすべてのテーブルを閉じ、使用されているすべてのテーブルを強制的に閉じて、クエリーキャッシュをフラッシュします" は既知として省略しました。ちゃんと説明するには、MySQL, Groongaで何かおきるのが書かないといけないので、下記"メモリ管理の章"を追加して、そこで詳しく説明するとして、後ほどそのリンクへの付加でどうでしょうか。

Q: Mroongaがたくさんメモリーを使っていますが大丈夫ですか?について

質問と答えが合っていないのと、答えが大雑把すぎるのはたしかにその通りです。

この質問自体削除しました。理由は以下です。

この質問自体はMroongaのメモリ管理を知りたいのが真意なので、http://qwik.jp/tritonn/userguide.html にある"メモリの使用と注意点" と同じようにFAQではなく、公式リファレンスにメモリ管理の章を設けた方がよさそうです。

vm.overcommit_memory=1 にすることで解決できることがあります」とでもした方が親切なのではないでしょうか.
/etc/sysctl.conf や /etc/sysctl.d/groonga.conf は MySQL 再起動じゃなくて OS 再起動で設定が有効になるのではないでしょうか. 後,「再起動後も設定が有効にする」じゃなくて「再起動後も設定を有効にする」だと思います.

修正しました。

人間の記憶という意味では「メモリー」という表記を使うこともありますが, IT 関連では「メモリ」の方が一般的だと思います.
で、今回の「メモリー」ですが、「memory」で「-er, -or, -ar」で終わらないので「メモリ」でした!

メモリー となっているところを メモリ としました。

余談ですが、参考にしているMySQL公式だとメモリーになっていますね。http://dev.mysql.com/doc/refman/5.1-olh/ja/flush.html

  • 修正後のリンク

http://redmine.groonga.org/projects/mroonga/wiki/%E5%88%A9%E7%94%A8%E8%80%85%E5%90%91%E3%81%91_FAQ/edit?section=5

http://redmine.groonga.org/projects/mroonga/wiki/%E5%88%A9%E7%94%A8%E8%80%85%E5%90%91%E3%81%91_FAQ/edit?section=8

#7 Updated by Susumu Yata about 4 years ago

MySQLマニュアルにあることは省略

重要な情報についてはリンクを入れてもいいかもしれませんね. たまにド忘れすることもありますし…(すくなくとも私は).

ただ,それはそれで MySQL ドキュメントの構成が変更される可能性が怖いです.

参考にしているMySQL

どちらかといえばキャッシュのクリアという表現が多いようです.

tritonn ユーザガイド

メモリについての解説がある上でメモリを解放するという表現を使っているので違和感はありません. それに,「32bit Linuxでの注意点と対策」の一部として,「topコマンドでmysqldを監視して制限値に達する前に」と続けて示されています.

「Mroongaが使っているメモリを解放するにはどうしたらよいでしょうか。」という質問に違和感があるのは,ユーザがいきなりそこに行き着くとは思えないからです. 内部実装について分かっている人でなければ,この質問には至らないのではないでしょうか.

「メモリ使用量が多いのを何とかできないか?」という質問であれば,よくありそうな話です.

MySQLのマニュアルにある "開いているすべてのテーブルを閉じ、使用されているすべてのテーブルを強制的に閉じて、クエリーキャッシュをフラッシュします" は既知として省略しました。

すみません. そもそも閉じるだけで大丈夫なのでした. 指摘自体が的はずれでした.

ただ,それなら Groonga のメモリ管理についても言及しなくてかまわないと思います. FLUSH TABLES とすれば,ほかのテーブルと同じように Mroonga のテーブルも閉じることができるとした方が混乱させなくて済むのではないでしょうか.

詳しい説明についてはリファレンスを参照してもらいましょう.

この質問自体削除しました。理由は以下です。

仮想メモリの使用量がトンデモナイことになっていますが大丈夫でしょうか,みたいに少し具体化して残せばいいんじゃないでしょうか. 気になる人はそれなりにいそうです.

回答については, Resident Set Size(物理メモリの使用量)が大きくなっているのでなければ大丈夫なことと,メモリ管理の章へのリンクで大丈夫だと思います. 物理メモリの使用量について言及するなら,メモリ解放やメモリリークに関する質問に誘導しておけばよさそうです.

Also available in: Atom PDF