勉強したことのメモ

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のメモリ使用量を増やしてみた。

# vi /etc/my.cnf
query_cache_limit=1M
↓
query_cache_limit=2M

query_cache_size=24M
↓
query_cache_size=48M

key_buffer = 16M
↓
key_buffer = 32M


# vi /etc/php.ini
memory_limit = 32M
↓
memory_limit = 48M

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

 

iptablesの設定

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

 

MySQLでCopying to tmp table

show full processlist

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

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

max_heap_table_size = 32M
tmp_table_size = 32M

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

 

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で記述するかショートコードを書く必要がある。ウィジェットで使いたかったのでショートコードを選択した。簡単には以下の通り。

#デフォルト
[sga_ranking]
#固定ページは省く場合
[sga_ranking exclude_post_type="page"]
#表示数を5件にする場合
[sga_ranking display_count="5"]

またサムネイルを表示させる場合は以下をfunctions.phpに追記。
//サムネイル登録
add_theme_support('post-thumbnails');
add_image_size('thumb-small',75,75,true);
//サムネイル生成
function sga_ranking_thumb_4536($thumbnail, $id) {
 $post_url = get_permalink($id);
 $title = get_the_title($id);
 $thumbnail = '';
 if( has_post_thumbnail( $id ) ) {
 $post_thumb = wp_get_attachment_image_src( get_post_thumbnail_id( $id ) , 'thumb100' );
 $post_thumb_url = $post_thumb[0];
 $post_thumb_width = $post_thumb[1];
 $post_thumb_height = $post_thumb[2];
 $thumbnail = '<figure class="sga-ranking-thumb"><a href="'.$post_url.'" title="'.$title.'"><img src="'.$post_thumb_url.'" alt="'.$title.'" title="'.$title.'" width="'.$post_thumb_width.'" height="'.$post_thumb_height.'"></a></figure>';
 }
 return $thumbnail;
}
add_filter('sga_ranking_before_title', 'sga_ranking_thumb_4536', 10, 2);
add_filter( 'sga_ranking_cache_expire', function($expire) { return 12*60*60; } );

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

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

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

 

その他

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

 - MySQL, WordPress, サーバー

  関連記事

WordPressで自作テーマにウィジェット対応

WordPressで自作したテーマでウィジェットを登録しようとしたところダッシュ ...

WordPressで固定ページに記事一覧を表示させるプラグイン

WordPressで固定ページ編集時にショートコードを書くことで、記事一覧を表示 ...

WordPressのサーバー移行で気付いた点

あるWordPressを置いているサーバーのリソースが苦しくなってきたので、新た ...

MySQLで速度改善

よく見るけど実際に対面してみて難しさが分かった。 150万件ほどのデータがあって ...

お手軽に負荷分散(DNSラウンドロビン)を行う方法

サーバ設定か何かの記事を見ていて「DNSラウンドロビン」という聞いたことのない言 ...

サーバーのメモリー使用状況を調べる(free)

サーバーのメモリー使用状況を調べる際は teratermでログインして、 fre ...

MySQLで指定の順にデータをソートする方法(ORDER BY FIELD)

MySQLで指定した順にソートしてデータを取り出したい。通常だと主キーだったり何 ...

MySQLでデータがあれば更新、無ければ挿入

DBにデータがあれば更新、無ければ挿入(新規作成)を 行いたい際に使えるものがあ ...

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

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

htmlファイル内でPHPを動かす(AddHandler)

サイトを引き継ぐことがあり、ソースを確認していると拡張子はhtmlなのにPHPの ...