httpdのメモリ使用量


13

httpdApache/2.2.29)メモリ使用量に問題があります。

時間が経つにつれて、httpdプロセスのメモリ使用量は徐々に増加し、最終的に100%になります。

最後に再起動したのhttpdは約24時間前でした。次からの出力free -m

[ec2-user@www ~]$ free -m
             total       used       free     shared    buffers     cached
Mem:          1655       1415        239          0        202        424
-/+ buffers/cache:        788        866
Swap:         1023          4       1019

それが間違いないことを証明するためにhttpd、私は再起動しhttpdfree -m再び走りました:

[ec2-user@www ~]$ sudo service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]
[ec2-user@www ~]$ free -m
             total       used       free     shared    buffers     cached
Mem:          1655        760        894          0        202        360
-/+ buffers/cache:        197       1457
Swap:         1023          4       1019

したがって、Apacheを再起動すると、空きメモリが239 Mbから894 Mbになります。これは大きな飛躍のようです。

私は現在有効なApacheモジュールのリストを調べており(かなりたくさんあります)、無効化/削除されmod_wsgiていますmod_perl(どちらもPHPベースのWebアプリケーションを実行しているこのサーバーには必要ありません-特にMagento)。

https://servercheck.in/blog/3-small-tweaks-make-apache-flyに基づいて、実行ps aux | grep 'httpd' | awk '{print $6/1024 " MB";}'して次の出力を取得しました。

[root@www ~]# ps aux | grep 'httpd' | awk '{print $6/1024 " MB";}' 15.1328 MB 118.09 MB 127.449 MB 129.059 MB 117.734 MB 113.824 MB 125.062 MB 123.922 MB 119.855 MB 108.066 MB 136.23 MB 114.031 MB 113.27 MB 110.695 MB 102.113 MB 113.234 MB 186.816 MB 118.602 MB 0.835938 MB

他の推奨診断ツールを実行すると、次の結果MaxClientsps aux | grep 'httpd' | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}'返されます。

[root@www ~]# ps aux | grep 'httpd' | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}'
110.212 MB

このサーバー(Amazon AWS m1.smallインスタンス)に1.7 GbはRAM があります。したがって、したがって:

httpd設定を微調整する最善の方法や、これを引き起こしている可能性のあるものを正確に診断する方法に関するさらなるポインター/提案​​はありますか?


プロセスによるメモリ使用量を確認するには、次の-/+ buffers/cache行を見る必要があることに注意してください。ただし、この場合、変更は同等です。Apacheの調整方法によっては、リクエストを処理する準備ができているいくつかのプロセスで開始する場合があります。多数の同時要求の期間が経過すると、おそらく負荷を処理するためにより多くのプロセスが分岐します。アイドルプロセスの数も調整できます。したがって、Apacheが大きくなりすぎてメモリを使用するようになった場合は、チューニングを行う必要があります。
ウルテル

Apacheサーバーの構成に問題はありませんが、過去にApacheのパフォーマンスチューニングの面で大したことはしていません。私が見ているべき指令やガイドに関する提案はありますか?一定時間後に分岐したプロセスを強制終了するようにApacheに指示できる構成設定はありますか?(Apacheは何らかの理由でデフォルトでこれを行わないようです。)
ジェームズスピットタル

これが、私がApacheから離れた正確な理由です... NginxまたはLighttpdを試してください。

面白い。良いことを聞いたnginxので、試してみる時が来るかもしれませんが、正直なところ、私は長年Apacheを使用しており、大きな問題は一度もありませんでした。しかし、Magentoは本当にメモリをかみます。
ジェームズ・スピタル

平均メモリ使用量を計算するスクリプトには、grep httpd(少なくとも私にとっては)-processの低メモリ使用量が含まれていることに注意してください。:私はこのような計算からその行を除外するために推薦することを修正するためにps aux | grep 'httpd' | grep -v grep | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}'
MaPePeR

回答:


11

これを「解決」するために私がやったことは次のとおりです。

  1. セットMaxClients 7(に基づいて(1740.8Mb Memory on server - 900Mb for MySQL + other stuff) / 111Mb average usage per httpd process = 7.5747747747747747747747747747748

したがって:

<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients         7
MaxRequestsPerChild  4000
</IfModule>
  1. 以外のすべてのApacheモジュールを無効にしauthz_host_modulelog_config_moduleexpires_moduledeflate_modulesetenvif_modulemime_moduleautoindex_modulenegotiation_moduledir_modulealias_modulerewrite_modulephp5_module

  2. mod_sslクライアントはまったく使用していないため、パッケージを削除しますhttps://

この新しい構成がしばらく実行されたら、レポートして、これが解決するかどうかを確認します。

ここからのインスピレーションは、http//www.activoinc.com/blog/2009/08/31/performance-optimized-httpd-conf-for-magento-ecommerce/およびhttp://www.activoinc.com/から借りたものです。ダウンロード/httpd.conf-magento


上記の構成は間違いなく大いに役立ちました。
ジェームズ・スピッタル

1
数日後、「メモリリーク」の問題はhttpd完全になくなったようです。
ジェームズスピッタル

2

MaxRequestsPerChildオプションは、定義されたリクエスト数の後にプロセスのリサイクルを可能にするため、あなたのケースで助けたのではないかと心配しています。

さらに:MaxClients = ServerLimit * ThreadsPerChild

あなたの場合、7人の同時ユーザー(MaxClients = 7)のみが必要な場合、2プロセスで完全に十分です(ダウンタイムを最小化できない場合に備えて)、configは次のようになります:

<IfModule prefork.c>
StartServers       2
MinSpareServers    2
MaxSpareServers   20
ServerLimit        2
MaxClients         8
ThreadsPerChild    4
MaxRequestsPerChild  4000
</IfModule>

私はMaxClients 8を使用して、2つのプロセス間でより均等に要求を分配します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.