この質問は少し長いことは承知していますが、私は自分の側から観察したすべての側面を説明することにしました。
私は Linux サーバーを使用しています。OS は Ubuntu 14.04 を使用しています。その他の構成はすべて以下で定義されています。この Web サーバーは PHP で構築されたアプリケーションを提供するために使用され、データベースは RDS でホストされています。ピーク時には平均で約 200 件の同時リクエストがサーバー上にあり、メモリ使用率が 100% になります。このため、アプリケーションが非常に遅くなったり、エラーで応答したりすることがあります。そこで、以下に示すいくつかの手順を実行してこの問題を解決し、Apache を調整して異常な状況に対して制限しようとしました。
OS
名前="Ubuntu" バージョン="14.04.5 LTS
サーバー構成
CPU: 8 コア
RAM: 15 GB
ハードウェアプロバイダー: AWS
インスタンスタイプ: c4.2xlarge
Apache.Conf パラメータ (2.4)
タイムアウト 300
KeepAlive オン
MaxKeepAliveRequests 100
KeepAliveTimeout 5
HostnameLookups オフ
LogLevel warn
AllowOverride すべて (アプリケーションのドキュメント ルート用)
使用される MPM: prefork
MPM_PREFORK.CONF
開始サーバー数 5
最小スペアサーバー数 5 最大
スペアサーバー数 10
最大リクエストワーカー数 256
最大接続数/子 200
モッズが有効
access_compat.load autoindex.load mime.load setenvif.load alias.conf deflate.conf mpm_prefork.conf socache_shmcb.load alias.load deflate.load mpm_prefork.load ssl.conf authn_core.load dir.conf negotiation.conf ssl.load authn_file.load dir.load negotiation.load status.conf authz_core.load env.load php5.conf status.load authz_host.load filter.load php5.load authz_user.load headers.load rewrite.load autoindex.conf mime.conf setenvif.conf
平均 Apache プロセス サイズ
使用されたコマンド:
sudo ps -ylC apache2 | awk '{x += $8;y += 1} END {print "Apache Memory Usage (MB): "x/1024; print "Average Process Size (MB): "x/((y-1)*1024)}' <br/>
Apache メモリ使用量 (MB): 7227.66
平均プロセス サイズ (MB): 314.246
MaxRequestWorkersの計算
X = Apache に割り当てたい専用 RAM (13GB): 13312 MB
Y = 過去 15 日間にサーバー上で監視している平均プロセス サイズ: 314.246
MaxRequestWorkers = X/Y = 約 40
使用される MPM: prefork
変更された MPM_PREFORK.CONF
開始サーバー数 5
最小スペアサーバー数 5
最大スペアサーバー数 10
最大リクエストワーカー数 40
子あたりの最大接続数 8
Apache が起動すると、5 つの startservers プロセスが開始され、各 startserver プロセスは 8 つの子接続を開始するため、合計で 40 の同時接続をサーバーに確立できます。MaxRequestWorkers は 40 に制限されており、同時リクエストが 40 を超えることはありません。これにより、DOS、DDOS の場合にサーバーが停止するのを防ぎ、最大 13 GB の RAM を占有して 2 GB の RAM をサーバーに解放します。MaxConnectionsPerChild
パラメータについてもよくわかりません。これを間違って使用している場合は、修正してください。
PHP.INI パラメータ (php5)
古い
output_buffering = 4096
max_execution_time = 60
memory_limit = -1
log_errors = オン
新規
output_buffering = 4096
max_execution_time = 60
memory_limit = 64M
log_errors = オン
私がまだ直面している問題
mpm_prefork_conf を変更した後、メモリ使用率は下がりましたが、MaxRequestWorkers パラメータが原因で、サーバーは多くのクライアントに 503 エラーを返します。各 Apache プロセスが 315 MB の RAM を使用している理由を解明しようとしましたが、約 2 日間 Google 検索しましたが、この問題をさらにトラブルシューティングするための適切な方法を見つけることができませんでした。そこで、最終的にこれをここに投稿しました。現在、2 つのオプションがあります。
Apache の平均プロセス制限を最適化し、MaxRequestWorkers 制限を増やします。
RAM を増やして、同じ平均プロセス サイズでクライアントにサービスを提供することは、正しい選択ではないと思います。
PHP を使用した Apache の平均プロセス サイズを特定して削減する方法を適切な提案で教えてください。誠実な回答のみお願いします。
答え1
これよりいい方法はないと思います。php-fpmを使うと、非動的コンテンツの読み込みがはるかに速くなり、メモリ消費も少なくなります。ガイド (digitalocean.com)、良いアドバイスをくれます。チェックできるのは、Apacheのキープアライブ時間を変更することです。ここ
答え2
これは、Apache プロセスあたりかなりのメモリです。Ubuntu 14.0.4 は 2019 年に EOL になりました。
あなたが投稿した設定で注目すべき点は次のとおりです:
KeepAliveTimeout 5
これを 1 に変更します。現在、アクティブなプロセスの少なくとも半分がキープアライブ タイムアウトを待機して何もしていないことがわかります。
トラフィックの分析を開始し、すべての静的コンテンツがキャッシュ可能であることを確認します。
Apache の設定を確認して、使用していないモジュールがロードされていないことを確認してください。
PHP にデフォルトの timeone が設定されていること、およびスクリプトがエラー報告を無効にしていないことを確認してください。エラー ログを確認し、エラーをクリーンアップしてください。Apache で listenBacklog を調整してみてください。
子あたりの最大接続数 8
なぜ?これはとても低い。Apache は一般的に非常に安定しています。Apache がフォークする回数を減らして容量を増やすには、この値を 100 まで上げることができます。この値を変更するとアプリケーションのエラー率に影響が出る場合は、永続的なデータベース接続のコードが不適切でないかどうかを確認してください。メモリ使用量に影響する場合は、パッチが最新であることを確認してください。