WordPressサイトのロードアベレージが高い際の対応方法
2024/02/22
あるWordPressサイトのロードアベレージが先月ぐらいまでは通常0.5前後でピーク時に2ほどだったのに、通常1.5前後でピーク時に3ほどまで上がっていた。また突発的に100以上になりサーバが停止する事もあった。以下に解決方法をメモ。
目次
結論から書くとWordPress Popular Postsが原因
プラグインのWordPress Popular Postsが原因っぽい。プラグインを停止することでロードアベレージが落ち着いた。
経緯と対応した内容等は以下にメモ。尚、サーバスペックはメモリ2GBでCPUは仮想3コアになる。
WordPress4.8.2にアップグレードした時期あたりで重たくなった
時期的にはWordPressをアップグレードした時期あたりになる。他にも同じような症状が起こっていないか調べてみると以下記事が見つかった。
ただ、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で作成しているサイトの場合はプラグインも意識する。
関連記事
-
WordPress内でPHPの独自プログラムページを実装する方法
WordPress内にてPHPで作ったシステムを実装したい。ヘッダー / フッタ ...
-
PHP8系で「Warning: Constant xxxxx already defined in」エラーの対応方法
PHP8系&WordPress6.4.3で「Warning: Const ...
-
WordPressで翌日以降に編集した記事のみ最終更新日を表示する方法
WordPressで翌日以降に編集した記事のみ最終更新日を表示させたい。逆に言う ...
-
WordPressで運用中のサイトを停止しないままサーバ移設する方法
WordPressを設置しているサーバのリソースがそろそろ危ういので移設を検討す ...
-
Advanced Custom Fieldsでチェックボックスの記事を取得
Advanced Custom Fieldsでチェックボックス設定しているカスタ ...