勉強したことのメモ

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 サーバー

  関連記事

gzip圧縮とキャッシュをhttpd.confで設定する方法

今まで共用サーバーで使っていたWordPressをVPSに移した。せっかくなので ...

WordPressのテーマファイル内で取得したオブジェクトを指定のフィールド名でソートする方法

WordPressのテーマファイル内で記事やカテゴリ一覧等を取得するとオブジェク ...

WordPressで「No URL was~」というエラーの原因と対応方法

WordPressでmp4ファイルをアップロードして記事に埋め込んだものの、記事 ...

WordPressでテーマファイル内で共通の変数を設定及び使用する方法

WordPressでテーマ内の共通変数を設定し使用したかった。例えば記事一覧ペー ...

WP Social Bookmarking LightでSNSボタンが表示されない際の対応方法

WordPressでWordPress WP Social Bookmarkin ...