またmysqldが落ちていて、service mysqld restartをしても[FAILED]で起動しないとあわてて調べてswapを作ることでとりあえず解決、EC2のt1.microは本当にカツカツだなと感じる今日この頃

WordPressが起動しない!という同僚の声に、はたと会社サーバにログイン。Amazon EC2でホストしているのだが、t1.microではよくMySQLが落ちる。ということで、crontabで定期的にプロセスを見て起動させるようにしていたのだけれど、どうやらこれが上がっていないらしい。


WordPressのエラーが「データベースに接続できません」なので、最初はちょっとあせってSSHログインして設定とか確認しようと思ったのだが、プロセスを見たら起動していないので、これはもしや……ということでログを確認。

やはり、やはりエラーで落ちている。

ん、でもなぜ落ちっぱなしなんだろう?
以前にもmysqldは落ちて、Amazon EC2のt1.microという一番安いサービスではMySQLが結構頻繁に落ちるという話題を聞いていたので、スクリプトを書いてcronで回して定期的にチェックをしていたはずのだ。

しかし、それでも落ちているということは、もっと致命的な問題があるということなんだろう。

[text]
140702 01:21:02 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
140702 1:21:02 [Note] Plugin ‘FEDERATED’ is disabled.
140702 1:21:02 InnoDB: The InnoDB memory heap is disabled
140702 1:21:02 InnoDB: Mutexes and rw_locks use GCC atomic builtins
140702 1:21:02 InnoDB: Compressed tables use zlib 1.2.5
140702 1:21:02 InnoDB: Using Linux native AIO
140702 1:21:02 InnoDB: Initializing buffer pool, size = 128.0M
InnoDB: mmap(137363456 bytes) failed; errno 12
140702 1:21:02 InnoDB: Completed initialization of buffer pool
140702 1:21:02 InnoDB: Fatal error: cannot allocate memory for the buffer pool
140702 1:21:02 [ERROR] Plugin ‘InnoDB’ init function returned error.
140702 1:21:02 [ERROR] Plugin ‘InnoDB’ registration as a STORAGE ENGINE failed.
140702 1:21:02 [ERROR] Unknown/unsupported storage engine: InnoDB
140702 1:21:02 [ERROR] Aborting

140702 1:21:02 [Note] /usr/libexec/mysqld: Shutdown complete

140702 01:21:02 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
[/text]

一応手動でservice mysqld startを叩いたが、案の定[FAILED]で起動しない。

[text]
# service mysqld start
MySQL Daemon failed to start.
Starting mysqld: [FAILED]
[/text]

ということで調べてみたら、こちらのブログ様に対処方法が記載されていた。ありがたい。参考にさせていただきました。

■Amazon EC2 の t1.microインスタンスでMySQLがよく落ちる – blog.hereticsintheworld
http://blog.hereticsintheworld.com/4165.html

swapを作ればよい、と説明されている。
確かに、freeコマンドで確認するとfreeは17MB。17MB!!
swapも0。

[text]
# free
total used free shared buffers cached
Mem: 608480 591316 17164 0 9640 29892
-/+ buffers/cache: 551784 56696
Swap: 0 0 0
[/text]

まあ、t1.microだし、メモリ600MBとかって……いや……さーせん、弊社貧乏なもので……(涙)。

ということで、さっそく上記ブログ様の手順にならってswap領域を確保してみる。
ddコマンドでswapファイルを作成。/dev/zeroから吐き出される0で1MB分の領域を確保。今回はブロックサイズ1MBを1024個作って1GBを確保をしている。多数プロセスを動かす予定もないし、まあこのぐらいでなんとなかるだろう……なってほしい。

t1.microということもあるだるだろうが、結構時間はかかるので、「おかしい!」と思ってCtrl-Cとかしないように。5分程度は様子見をしておくといい。自分は2分ぐらいかかった。

[Sponsored Link]


CentOSではswapはファイルシステム上のファイルとして作成するのね。FreeBSDとかだとディスクパーティションの一部にswap領域を設定しているのだけれど。これは便利なようで遅い気もしないでもないが、ext4とかだと気にならないぐらいの速度なんだろうか。

[text]
# dd if=/dev/zero of=/swapfile bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 34.7787 s, 30.9 MB/s
[/text]

そのあと、mkswapコマンドでファイルをswapファイルをセットアップする。man mkswapを見ると、ファイルやデバイスをswap領域に設定できるとあるから、デバイスやパーティションをswapにすることもやはり可能らしい。まあでもファイルをswap領域に設定できるなら、swap領域が不足した際にはかなり便利ではあるが、通常2GBぐらい確保すれば十分だとは思うので、一度余裕をもってswap領域を確保しておくのがよいかもしれない。

[text]
# mkswap /swapfile
mkswap: /swapfile: warning: don’t erase bootbits sectors
on whole disk. Use -f to force.
Setting up swapspace version 1, size = 1048572 KiB
no label, UUID=0e99xxde-xxxx-0000-xx99-90xxxxxdd0
[/text]

そしてswaponコマンドでswapファイルを有効化。

[text]
# swapon /swapfile
[/text]

ふたたびfreeコマンドで確認をしてみる。

[text]
# free
total used free shared buffers cached
Mem: 608480 600768 7712 0 1864 46468
-/+ buffers/cache: 552436 56044
Swap: 1048572 0 1048572
[/text]

swapができております。よかったよかった……って、freeがすでに7MBになっている……(涙)。

そして無事mysqldも起動成功。

[text]
# service mysqld start
Starting mysqld: [ OK ]
[/text]

t1.microの話をしていたら、T2インスタンスの発表があったそうな……。どういうアドバンテージがあるのかちょっとわからんが、一応ブログの末尾では「低コストで高い性能」みたいなことを言っている。が、T2はローカルディスクを持たないらしいので移行はめんどくさいぽい。モチベーションは低いな……。

Amazon Web Services クラウドデザインパターン実装ガイドAmazon Web Services クラウドデザインパターン 設計ガイドAmazon Web Servicesプログラミング ―APIの基礎からElastic Beanstalkの利用までWEB+DB PRESS Vol.77ジェフ・ベゾス 果てなき野望Amazonベーシック ポータブル機器 (カメラ, 携帯電話, GPS など)用キャリングケース ブラック

コメントを残す

メールアドレスが公開されることはありません。