ごだいぶろぐ 絶対大丈夫じゃないSEのぼやき

頭が封印解除しているシステムエンジニアのブログです。カードキャプターさくら クリアカード編の感想記事を定期更新中

【VPS+Wordpress】不定期にI/O負荷が爆上げしてサーバが停止するので調査してみる

スポンサーリンク

2018.11.24 解決しました!!

 

Facebookやmixiに次ぐ大手SNSサイト『ともよちゃんねる』に激震が走った。ここ数日でサイトが断続的にダウンしていたのだ。

 

 

この事態に管理者は困惑。

 

 

そして現実逃避。あ、ピカブイ買いました。

 

 

ということで(珍しく)真面目に障害調査をしてみたので、備忘を兼ねて対応内容を記してみます。

 

前提条件

サーバを動かしている環境は以下の通り。結構低スペで動かしております。

基盤:さくらのVPS

メモリ:1GB

ストレージ:SSD30GB

CPU:2コア

OS:CentOS Linux release 7.5.1804

DB:mysql Ver 15.1 Distrib 10.2.15-MariaDB

WEB:Apache/2.4.6

ソフト:Wordpress

 

今回確認した事象

f:id:godaiyu:20181123060422p:plain

・不定期にDISK I/O負荷が急増する

・事象発生時にはサイトにアクセスできなくなる

・コンソールはかろうじて動くがかなり重い

・rebootすれば解消する

 

障害調査するんだぁ

とりあえずtopコマンドでサーバの負荷を見てみる。

 

 

通常時

f:id:godaiyu:20181123083602p:plain

 

 

暴走時

f:id:godaiyu:20181123062440p:plain

おうふ。。。メモリが自爆寸前のセルのごとくパンパンになっておりました。もうこの時点でコンソール操作がかなり重い。肝心の「何のプロセスが負荷をかけているのか」ですが、ご覧の通りWEBサーバのapacheさんがかなり頑張っているみたいです。

 

 

ということでhttpd関連のログをチェックしました。案の上エラーログを吐いているので中身を確認します。

 

コマンド:

 cat /var/log/httpd/error_log

 

結果:

f:id:godaiyu:20181123080723p:plain

 

 

oh...

 

 

ログがずらーーーっと並んでおりますが、接続を元をみると殆ど同一のIPアドレス[83.142.X.X][220.243.X.X]で、国を調べてみるとイギリスや中国のものっぽい。

 

 

まさかDOS攻撃かと思いつつエラーログの各行末尾を確認すると、どうやら特定のインスタンスへのアクセスに対し集中放火されているみたいです。

……wp/wp-includes/wp-db.php on line 1924

 

 

ググったらたまたま同じ事象に直面している人がいたので、こちらのエントリを参考にしてみる。

f:id:godaiyu:20181123082612p:plain

https://wordpress.org/support/topic/error-messages-when-accessing-site/

 

 

回答者曰く「テーマやらプラグインやらが競合している可能性があるから一度全部停止して切り分けてみよ」的なものでした。私が直面している問題は不定期で発生しており確認が難しかったため、とりあえず余計なテーマやプラグインを片っ端から停止➡︎削除しました。

 

 

メモリが少ないからスケールアップも考えてみたけど、原因が分からないしもっとアクセスが集中していたときもこのスペックで捌けていたので、とりあえず今はこれで様子見…

 

 

うーん、接続元が海外というのが気になるなあ。テーマやプラグインのアップデート先が海外で、自動でアップデートしようとして失敗というシナリオだったら納得するけど…

おまけの対応 

ついでに以下対応も行いました。

 

①データベースの正常性確認

目的:

 データベースの正常性を確認する

コマンド:

 mysqlcheck -c -u "ユーザ名" -p --all-databases

結果:

 全てOK

 

②データベースの最適化処理

目的:

 特定のデータベースのテーブル内にオーバーヘッドが出てないか確認し、出ていれば最適化を行う。

 

コマンド: 
 mysql> use "Wordpressのデータベース名";
 mysql> show table status \G;

 

結果:

f:id:godaiyu:20181123084420p:plain

テーブルの22行目の[wp_posts]にオーバーヘッドが結構残っていた。名前的に投稿データを格納するテーブルだと思われる。最適化する。

 

コマンド:

 mysqlcheck -o -u "ユーザ名" -p --all-databases

 

結果:

f:id:godaiyu:20181123085516p:plain

半分くらいになった。

 

③ネットワーク監視ツールの導入

f:id:godaiyu:20181123090036p:plain

無料で利用できるネットワークの死活監視ツールを導入してみた。アカウントを取得して監視対象のURL等の情報を入力するだけで、対象サイトに対しhttpやpingのポーリングを行ってくれる優れもの。

 

 

f:id:godaiyu:20181123090359p:plain

指定した時間以内に対象サイトから応答がなかった場合は、以上の様にメールで通知してくれる。もっと早く導入しておけば良かった…

 

 

おしまい