仕様-
MySQL 5.0.x , Redhat 5.9 , Physical memory - 16GB
Innodbバッファープールサイズを8GBに設定しようとしています(innodb_buffer_pool_size = 8G)。私が実行してmysqlを起動すると、次のエラーが発生します-
InnoDB: Error: cannot allocate 8589950976 bytes of
InnoDB: memory with malloc! Total allocated memory
InnoDB: by InnoDB 37679104 bytes. Operating system errno: 12
InnoDB: Check if you should increase the swap file or
InnoDB: ulimits of your operating system.
これはfree -m-の出力です
total used free shared buffers cached
Mem: 15922 15269 653 0 248 4275
-/+ buffers/cache: 10744 5178
Swap: 2047 0 2047
これはulimit -a-の出力です
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 127352
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 127352
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
「/etc/security/limits.conf」ファイルを確認しました。そこには何もありません。すべての行がコメント化されます(#で始まります)。空のディレクトリ '/etc/security/limits.d/'を確認しました。
MySQLへの4GBを超えるメモリの割り当てが妨げられています。わからない.
何か案は?
ダンケ。
memlockが問題でした。結局のところ、memlock設定はデフォルト(上記を参照)であり、これがmysqlへの4 GB以上のメモリの割り当てを妨げている可能性があります。
'/etc/security/limits.conf'のmemlock設定を変更し、8GBに制限しました。次に、7GBをmysqlバッファープールに割り当てました。働いた。 mysqlはログにエラーをスローせずに開始および停止するようになりました。
ここで注意すべき点がいくつかあります-
私がオンラインで読んだものから、mysqlに割り当てられたメモリの量は、バッファプールの設定よりもわずかに多くなっています。たとえば、プールに7GBを割り当てた場合、mysqlに割り当てられた実際のメモリは8GBに近くなります(これは例であり、実際の数値ではありません)。
mysqlサービスのオン/オフは非常に注意深く行う必要があります。 mysqld-startを実行した後、すぐにmysqld-stopを実行すると、mysqlが[FAILED]で応答することに気づきました。ログには、7GBの割り当てに失敗したと記載されています。