MySQL の 巨大な core ファイル 対策(~MySQL 5.7)
約1ヶ月ぶりのブログです。
--
core ファイルとはプロセスのメモリを丸ごとファイルにダンプしたものです。core ファイルをgdb等のデバッガで解析することで、プロセスが落ちた原因を探ることができます。
MySQL では以下のように設定することで、mysqldが落ちた際にcoreファイルを自動的に取得できるようになります。
- /etc/my.cnf
[mysqld]
core-file
- sysctl
fs.suid_dumpable=1
core ファイルサイズにlimitが効いている場合は ulimit -c unlimit でサイズの制限も解除する必要があります。
--
さて、MySQL に大きなメモリを割り当てていると、core ファイルのサイズも大きくなります。最近ではサーバに数百GBのメモリを搭載していることは珍しくありません。そうするとcoreファイルも巨大に・・・ディスクが足りずに、途切れてしまったcoreファイルでは解析できません。
対策としてcoreファイルを圧縮します。具体的には kernel.core_pattern にパイプで圧縮するコマンドを挟みました。圧縮方法は「圧縮率はそこそこだが、速いもの」を選びました。
圧縮率が高いアルゴリズムだと、圧縮に時間がかかり、coreを出力するのに時間がかかってしまいます。mysqldがダウンするとmysqld_safeによって、速やかに再起動されるわけですが、coreを書き出すのに時間がかかっていると、復旧するまでの時間が長くなってしまいます。
facebookのベンチマークによると、lz4が要件を満たしそうだったので、lz4にします。
$ sudo sysctl -w kernel.core_pattern='|/usr/bin/lz4 - /var/crash/%e.core.%u.lz4
圧縮率はデータによって左右されると思います。
テストでは6分の1程度に容量が減りました。速度は、17Gのcoreを出力するのに、22秒かかるようになりました。元々は5秒程度だったので、出力スピードは4倍以上遅くなっています。もう少し、速いと嬉しいところですが、トレードオフなので仕方ありません。
--
今回はkernelの機能で対応しましたが、MySQL 8.0 では、この巨大なcoreファイル問題を回避する機能がMySQLに追加されました