Apacheのメモリ消費を抑える
運用しているサービスでapache(httpd)がメモリを大量に消費するのでメモリ量を調整して抑える設定を実施する。
前段として
Apacheについて、サービスを起動すると、プロセス(httpd)が複数個、生成されます。
それぞれのプロセスはクライアントからのリクエスト(http/https)を受け、処理をした上でレスポンスを返します。
リクエストを受けてレスポンスを返すという作業を同時に複数行う。
複数のリクエストを処理するのにマルチプロセッシングモジュール (MPM) というものを使用する。
マルチプロセッシングモジュール (MPM) はprefork, worker, eventがある。
デフォルトでは「prefork」の設定にとなっております。
「prefork」について
1つのプロセスは1つのスレッドを持ちます。
スレッドはCPUに命令を渡す単位となりますからリクエストに対して起動しているプロセス数が少ない状態は処理が遅くなります。
逆にプロセスを多く生成すぎるとメモリを消費するためをサーバーは圧迫します。
複数、同時のリクエストに応じて、Apacheはプロセスを増減させている。
memo:プロセスはメモリを使用します。スレッドはCPUを使用します。
増減の際のfork処理は重いため、発生を抑えるよう設定する必要がある。
事前にforkしておくということから「prefork」という名称である。
「prefork」のようなプロセスを「シングルスレッドプロセス」と言います。
memo:「fork」コマンドはプロセスから別のプロセスを呼び出すコマンドであり、Linuxのシステムコールの一種です。
子プロセス(fork)一つ一つが通信を受け持つ
あるプロセスは他のプロセスからの影響を受けないため、安定したリスポンスを返すことができる。
方針として
- 同時に処理する件数を考慮して起動する最大プロセス数を検討する。
- メモリー数値を意識して最小プロセス数を検討する。
2-2. アプリケーションで使用するメモリーも意識する必要がある。
最大プロセス数はサーバーの使用可能なメモリー量よりプロセスが使用するメモリ数より算出する。
上記の内容より以下を設定する。
- 高負荷状態を推測して最大アイドルプロセス数を設定する=MaxSpareServers
- 低負荷状態でもパフォーマンスを考慮して最小アイドルプロセスを設定する=MinSpareServers
応答できる同時複数クライアント最大値の「MaxClients」の設定も忘れずに行う。
シングルスレッドプロセスのため、MaxClients=MaxSpareServersとなる。
参考サイト: https://qiita.com/nownabe/items/1111cc32da9fe63289f0
参考サイト: https://qiita.com/takahashi-kazuki/items/2352aec16d6a1dc40582