LockPagesInMainMemory
提供:MySQL Practice Wiki
| ファイル | config.ini |
| セクション | [ndbd], [ndbd default] |
| データ型 | 整数値 |
| デフォルト値 | 0 |
| 値の範囲 | 0,1,2 |
| 効果 | プロセスのメモリをロックする。 |
| 効果の有効範囲 | ndbdプロセス全体 |
| 使用頻度 | 高 |
説明
ndbdデーモン開始後に、アロケートしたメモリをロックする。ロックすることにより、プロセスがスワップアウトするのを防ぐ。ndbdにとって、スワップアウトは命取りであるが、運用中に他のプロセスを誤って実行してしまったりすることでシステムがメモリ不足に陥り、ndbdがスワップの対象になってしまうという事態が発生しうる。これを防ぐために、多くのUNIX系OSではスワップアウトをしないようにするための機能が備わっている。
ソースコード関連
ロックにはmlockall()/munlockall()を使用する。これを呼び出しているのはstorage/ndb/src/common/portlib/NdbMem.cにあるNdbMem_MemLockAll()関数である。この館数の引数はint型で、呼び出されるときの値は0か1なのだが、LockPagesInMainMemory=1のときにNdbMem_MemLockAll(0)が呼び出され、LockPagesInMainmemory=2のときにNdbMem_MemLockAll(1)が呼び出されるので非常にややこしい。
呼び出し元はstorage/ndb/src/kernel/blocks/cmvmi/Cmvmi.cppとなっている。
storage/ndb/src/kernel/vm/Configuration.hppに設定値が保存されている。
バグ情報
Linuxのman mlockall()を見ると、MCL_FUTUREオプションを指定したときのバグが載っている。MCL_FUTUREはLockPagesInMainMemory=2のときに呼び出されるのだが、個人的な勘からすると潜在的な問題も孕んでそうな気がする。LockPagesInMainMemoryはスワップの防止に必要なので、1に設定しておこう。