最近、バックエンドにログインした後、時々ブログのメモリが「食われ」ていることがわかり、最初は Swap 不足が原因であると疑ったので、追加しました。数ギガバイトのスワップを VPS ホストに送信し、しばらくして観察すると、スワップがどんなに大きくても、ゆっくりと「食べられて」いることがわかりました。

一部の PHP サービスが VPS のメモリを占有していて解放していないため、物理メモリが使い果たされた後に Swap が呼び出されていることは明らかです。明らかに、Swap は物理メモリほど効率的に実行されないため、プロセスは次のようになります。立ち往生。現在、WordPress Web サイトで使用しているテーマとプラグインが多すぎることを考慮すると、この状況が発生するのは正常です。

公式声明によると、LNMP アーキテクチャでは、PHP は FastCGI モードで実行されます。php-cgi は、各リクエストの終了時にスクリプトによって使用されたすべてのメモリをリサイクルしますが、オペレーティング システムには解放されませんが、続行されます。次の PHP リクエストに応答します。 php-fpm は FastCGI プロセス マネージャーであり、php のメモリとプロセスを制御するために使用されます。

Linux php-fpm 最適化体験 - php-fpm プロセスは大量のメモリを消費し、メモリを解放しない

したがって、解決策は、php-fpm を通じてプロセスの総数と単一プロセスが占有するメモリを最適化し、php-fpm プロセスが大量のメモリを占有し、メモリが解放されない問題を解決することです。 Linux サーバーの最適化方法と Web サイト構築の経験のほか、次のようなものもあります。

  1. Linux Crontab コマンド スケジュールタスク 基本構文と操作チュートリアル - VPS/サーバー自動化
  2. Alibaba Cloud Japan VPSホスト速度性能評価 - 日本ソフトバンク香港NTT回線
  3. DNS ドメイン名解決により DNSSEC が DNS ハイジャックを防止できる - Google Cloud DNS 設定 DNSSEC

追記: 2018 年 12 月 14 日更新、 VPS ホストのメモリとパフォーマンスがあまり良くない場合は、この時点でキャッシュを有効にしてリソース消費を大幅に節約するのが最善です: WordPress は Nginx fastcgi_cache キャッシュ アクセラレーションを有効にしますメソッド -Nginx の設定例。

追記: 2019 年 9 月 29 日更新、 Google が開発したサーバー最適化アーティファクト ngx_pagespeed により、画像の遅延読み込み、アダプティブ WebP、JS および CSS の最適化、画像などの最適化ツールの完全なセットが統合されています。最適化: PageSpeed Server 最適化アーティファクト - Nginx は ngx_pagespeed モジュールをデプロイし、加速効果を体験します。

1. php-fpm のメモリ使用量を分析して決定する

VPS ホストがスタックしていることがわかった場合は、まずメモリ使用量を確認してください。一般的に使用されるコマンドは、Top、Glances、Free などです。これらのコマンドを知らない友人は、まずマイニング ステーションがそれを実行しているかどうかを確認してください。 Linux システム パフォーマンスのボトルネックを見つけるためのマスター CPU、メモリ、ディスク IO などの監視コマンドの概要。

Glances コマンドを使用して m を押すと、現在の VPS ホスト プロセスのメモリ使用量が最も占有されているメモリから最も占有されていない順に並べ替えられます (または、Top コマンドを使用して M を押すと、結果は同じです)。以下に示すように (クリックして拡大):

3.2  php-fpm プロセスの数を減らす

VPS ホストのメモリが占​​有されて使い果たされている場合は、php-fpm プロセスの数 = メモリ/2/30 に従って計算できます。 1 GB のメモリは 10 です。20 ~ 20 の間は、PHP によってロードされるアドオンによって異なります。

3.3  php-fpm 構成例

ここでは、メモリ 1GB の php-fpm の VPS 構成をデモンストレーションとして使用します。実際の運用では、サーバー自体のパフォーマンスや PHP などを考慮して設定値を検討する必要があります。

pm = dynamic #dynamic和ondemand适合小内存。
pm.max_children = 15 #static模式下生效,dynamic不生效。
pm.start_servers = 8 #dynamic模式下开机的进程数量。
pm.min_spare_servers = 6 #dynamic模式下最小php-fpm进程数量。
pm.max_spare_servers = 15 #dynamic模式下最大php-fpm进程数量。

4. php-fpmプロセスがメモリを解放しない問題を解決する

php-fpm のメモリ使用量を削減するという上記の問題は、php-fpm プロセスの総数を減らすことで実現されますが、実際に使用すると、php-fpm プロセスが長時間メモリを占有するという問題が依然として存在することがわかります。それを解放すること。解決策は、pm.max_requests の数を減らすことです。

リクエストの最大数 max_requests は、PHP-CGI プロセスによって処理されるリクエストの数が max_requests まで累積すると、プロセスが自動的に再起動され、メモリ解放の目的が達成されることを意味します。例として、1 GB のメモリを備えた VPS ホスト設定を取り上げます (設定した値がメモリを解放するレベルに達していない場合は、値を下げ続けることができます)。

pm.max_requests = 500 

php-fpm プロセスが pm.max_requests で設定された値に達すると、メモリを解放するためにプロセスが再起動されます。下の図は私がテストした結果です。php-fpmプロセスが強制終了され、メモリが解放されたことがわかります。

5. まとめ

大規模なメモリ、同時実行性、および可用性の要件については、静的管理モード + 最大の pm.max_children を使用することをお勧めします。メモリの少ないサーバーの場合は、動的モードまたはオンデマンド モードを使用し、pm.start_servers プロセスと pm.max_spare_servers プロセスの数を減らすことをお勧めします。

望ましい効果を達成するためにパラメータを調整しなかったのはなぜですか? wzfou.com の経験によると、php-fpm 設定ファイルのパラメータは、サーバー自体のパフォーマンス、WEB 動的コンテンツ、およびメモリが長時間占有されている場合の可用性要件に基づいて調整する必要があります。メモリリークがあるかどうかを確認するのが最善です。

2019 年 10 月 9 日更新、php-fpm パラメーターの調整が小さすぎる場合、502 エラーが発生する可能性があります。 解決策: WordPress のバックグラウンド編集保存メニューで 502 エラーを解決します。

返信を残す