勉強したことのメモ

webプログラマ見習いが勉強したことのメモ。

WordPressサイトのロードアベレージが高い

   

あるWordPressサイトのロードアベレージが先月ぐらいまでは通常0.5前後でピーク時に2ほどだったのに、通常1.5前後でピーク時に3ほどまで上がっていた。また突発的に100以上になりサーバが停止する事もあった。以下に解決方法をメモ。

 

結論から書くとWordPress Popular Postsが原因

プラグインのWordPress Popular Postsが原因っぽい。プラグインを停止することでロードアベレージが落ち着いた。

経緯と対応した内容等は以下にメモ。尚、サーバスペックはメモリ2GBでCPUは仮想3コアになる。

 

WordPress4.8.2にアップグレードした時期あたりで重たくなった

時期的にはWordPressをアップグレードした時期あたりになる。他にも同じような症状が起こっていないか調べてみると以下記事が見つかった。

https://ja.wordpress.org/support/topic/wordpress-popular-posts%E3%81%AB%E3%82%88%E3%82%8B%E9%AB%98%E8%B2%A0%E8%8D%B7%E5%87%A6%E7%90%86%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/

ただ、WordPress Popular Postsをアップグレードしても直らなかった。

 

PHPとMySQLの設定

サーバのロードアベレージは上がっているもののメモリは比較的余っており、スワップ領域も使われていなかった。なのでPHPとMySQLのメモリ使用量を増やしてみた。

しかしながらこれでも直らず。

 

iptablesの設定

そのサイトは一時期、海外から大量にアクセスを受けることがあり、その影響でサーバ停止するという事があった。なので今回もそのようなアクセスかもしれないとaccess_logを追ってみたものの、それらしいIPは見つからず。

 

MySQLでCopying to tmp table

をちょくちょく見ていると、ロードアベレージが高くなっている際は「Copying to tmp table」というステータスの項目があった。

インデックスが大きくなりすぎ、メモリからディスクにデータをコピーして処理しているといった内容らしい。なので、my.confに以下設定を追記してみた。

しかしながらこれも意味がなかった。

 

Copying to tmp tableになっているテーブルを見てみると

「wp_popularpostssummary」というテーブルの処理に時間がかかっているみたい。また、ロードアベレージが10を超えている時はこのテーブルで処理待ちが発生しているようだった。

ここで結論に戻るんだけど、WordPress Popular Postsというプラグインが原因っぽいという考えに至った。また、プラグインを停止すると症状が改善されたので、恐らくこれが原因だろう。

ただ、このプラグインは「人気記事を表示させる」といったもので、アナリティクスの直帰率にかなり影響が出そう。できれば代替のプラグインを入れたい。

 

Simple GA Rankingが良い

Googleアナリティクスのデータを用いるSimple GA Rankingというプラグインがサーバに優しいとの事。

Simple GA Ranking

http://simple-ga-ranking.org/ja/

WordPressダッシュボードからインストールし有効にした後、Google側でAPIの設定が必要。導入にあたっては以下記事が参考になった。

https://www.tam-tam.co.jp/tipsnote/cms/post11104.html

表示させるにあたってはPHPで記述するかショートコードを書く必要がある。ウィジェットで使いたかったのでショートコードを選択した。簡単には以下の通り。

またサムネイルを表示させる場合は以下をfunctions.phpに追記。

表示に関しては以下記事が参考になった。

https://moriawase.net/simple-ga-ranking-thumbnail

https://moriawase.net/simple-ga-ranking-exclude

 

その他

サーバ設定の問題だと思っていただけにプラグインが原因というのは意外だった。WordPressで作成しているサイトの場合はプラグインも意識する。

 - MySQL, WordPress, サーバー

  関連記事

MySQLのエラーログ取得関数

場合によってログに出力させたい値が異なる場合があったのでメモ。 function ...

MySQLでtext型カラムに入っている数値をint型としてソートする

MySQLでtext型として指定されているカラムがあり、その中には文字列であった ...

MySQLで複数のテーブルを異なるデータベースと異なるカラムでJOIN

ちょっとややこしいんだけど、以下のような条件で3つのテーブルを結合したかった。 ...

WordPressでタグやカテゴリの複数検索

WordPressでカテゴリのアンド検索や、タグとカテゴリの同時検索を行いたかっ ...

プリペアドステートメント

個人的に得た内容として、SQL文だけ先にDBに送って、 変数は後で送る。だからS ...

WordPressのcron設定で負荷対策

WordPressのcron設定(wp-cron.php)を変更することで負荷が ...

CentOS6.10に無料SSL(Let's Encrypt)を導入

以前にもVPSにLet's Encryptを導入するという記事を書いたが、テスト ...

MySQLでserver has gone~というエラー

MySQLで「MySQL server has gone away」というエラー ...

WordPressにインスタグラムの画像を表示

WordPressにインスタグラムへ投稿している画像を表示させたかった。プラグイ ...

cronの時間設定部分が全てアスタリスク

サイトを引き継ぐことがあり、そのサーバの設定資料を確認するとcronの設定で日時 ...