勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

WordPressサイトのロードアベレージが高い際の対応方法

   2024/02/22  MySQL 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のContact Form 7プラグインで入力内容確認及び送信完了ページを実装する方法
WordPressのContact Form 7プラグインで入力内容確認及び送信完了ページを実装する方法

WordPressのContact Form 7プラグインで実装されたお問い合わ ...

WordPressの管理画面で記事一覧にアイキャッチ画像を表示
WordPressの管理画面で記事一覧にアイキャッチ画像を表示

WordPressの管理画面で記事一覧にアイキャッチ画像を表示させる方法のメモ。 ...

WordPress Popular Postsのサムネイルが表示されない
WordPress Popular Postsのサムネイルが表示されない

WordPressの人気記事を表示させるWordPress Popular Po ...

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

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

WordPressのPolylangで言語毎に分岐処理する方法
WordPressのPolylangで言語毎に分岐処理する方法

WordPressで多言語サイトを作成するにあたりPolylangというプラグイ ...