原因究明編
先月、EC2のインスタンスタイプをt3.smallにスケールアップしたのですが、今日Webサイトにアクセスするとまた「Error establishing a database connection」のエラー表示。t2.microの時より頻度は減ったものの再発しました。
またチャッピーと一緒に原因を探っていく!
まずはDBの状態を確認。まずはec2にsshでログインして、
sudo systemctl status -l mariadb
を実行。結果。
「Active: inactive (dead) since 日 2025-10-26 23:01:09 UTC; 6 days ago」
と、6日前からDBが落ちてる表示・・・。だいぶ前から落ちてんな!
自動起動とかアラートとかそこら辺も検討しないとな。
とはいえ、これだけではこの日時にDBが止まったということしからわからんので、もう少し探る。
jouranctl(システムのログ)からログを引っ張ってみる。
sudo journalctl -u mariadb --since "2025-10-26 22:30" --until "2025-10-26 23:10" --no-pager -l | tail -n 50
で止まった日時あたりのログを探る。が、・・・何も出ていない。
今度はMariaDBに対して情報の取得を試みる。
sudo systemctl show mariadb -p ActiveEnterTimestamp,ActiveExitTimestamp,InactiveEnterTimestamp,Result,ExecMainPID,ExecMainCode,ExecMainStatus
で、結果は
Result=success
ExecMainPID=20051
ExecMainCode=0
ExecMainStatus=0
ActiveEnterTimestamp=日 2025-11-02 08:42:38 UTC
ActiveExitTimestamp=日 2025-10-26 23:01:09 UTC
InactiveEnterTimestamp=日 2025-10-26 23:01:09 UTC
あ、さっき起動しちゃったからActiveEnterTimestampは立ち上げた日時になっててResultもsuccessに上書きされてしまいましたね。Resultから異常終了かなんらかの原因で止められたのか見ようとしたんですが、これじゃぁ止まって、立ち上がってますってことしかわからん。
とまぁ。遠回りしましたが、結局はいつものお前が犯人なんだろう。OOM(Out Of Memory)!!
というわけで。
カーネルメッセージからout of memory で検索。
dmesg -T | grep -iE 'out of memory|killed process.*mysqld' || true
すると結果。
Out of memory: Killed process 2466 (mysqld)、そしてOut of memory: Killed process 5135 (httpd)がばっちりでていました。httpdも巻き込んで、結局前回と一緒じゃないの。
OOM対策をチャッピーに聞いたところ、スワップのメモリを2Gにした方がいいとのこと。そういえば前のインスタンスタイプ「t2.micro」は非力だったんでスワップも1Gにしてそのままでした。とりあえず対策としてスワップメモリを2Gに変更します。
対策編
そもそもスワップメモリとは。
🧱 スワップメモリとは何か
スワップメモリ(swap memory)とは、
物理メモリ(RAM)が足りなくなったときに、一時的にディスク領域を「仮想メモリ」として使う仕組みのことです。
Linuxは、メモリ不足(Out of Memory = OOM)になる前に、
使っていないデータをスワップ領域に退避させることで、システム全体の停止を防ぎます。
助手のチャッピーによると上記のようなことです。これを2GBにするということは、「最大2GB分までメモリの代わりにディスクを使ってもいい」という“余裕枠”をLinuxに渡す ということみたいです。
まぁメモリが足りないのが原因なので、インスタンスタイプをスケールアップすればいいのですが、それはお財布に痛いので、もうちょい踠いてみます。(費用面もそのうち記事にします。)
さて肝心の変更手順です。
# swap停止
sudo swapoff /swapfile
# サイズ変更(2GBに再作成)
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# 永続化(すでに /etc/fstab にある場合は自動で反映される)
sudo sed -i '/swapfile/s/.*/\/swapfile none swap sw 0 0/' /etc/fstab
# 確認
swapon --show
free -h
軽く説明すると、動いているswapを一旦停止、スワップ用の空ファイルを作成&権限変更(rootのみ読み書き可能)。mkswapでスワップ用にフォーマット。swaponでスワップ開始。
swaonは再起動で無効になってしまうので、/etc/fstab (File System Table=マウントの管理) に swapfile none swap sw 0 0 を書き込みます。スワップもマウントの一種のようで、ここに書くことで起動時に毎回スワップの設定がされるようになります。
これで2Gのスワップ領域の作成は完了です!
swapon –show で現在のスワップの状態が、free -h でスワップがどれだけ利用されているか確認ができます。