7

apache httpd のどこかに (増大する) メモリの問題があるようです。

クイック写真: http://screencast.com/t/NGAzarD87O

しばらくの間、元の (物理) サーバーで正常に動作していることに注意してください。現在、新しい VM (より多くのメモリと CPU を使用) で実行されますが、システムがハングするまで mem/swap でゆっくりと消費されます。

httpd を再起動すると、mem が元に戻ります (キャッチした場合)。

httpd.x86_64                           2.2.3-76.el5_9         installed
PHP 5.1.6 (cli) (built: Jun 22 2012 06:20:25)
MySQL Server version: 5.0.95

物理マシンで何年も正常に実行されているため、run/etc のスクリプトのいずれかであるとは思えません。新しいマシンですべての構成 (http、php など) を一致させようとしましたが、httpd が成長し続ける理由がわかりません。

$ ps -ylC httpd --sort:rss
S   UID   PID  PPID  C PRI  NI   RSS    SZ WCHAN  TTY          TIME CMD
S     0 13814     1  0  78   0 29208 68382 -      ?        00:00:00 httpd
S    48 20854 13814  0  76   0 34876 70930 semtim ?        00:00:00 httpd
S    48 20853 13814  0  75   0 36592 71387 semtim ?        00:00:00 httpd
S    48 13822 13814  0  75   0 36780 71430 semtim ?        00:00:00 httpd
S    48 20696 13814  0  75   0 37092 71520 semtim ?        00:00:00 httpd
S    48 13821 13814  0  75   0 37184 71529 semtim ?        00:00:01 httpd
S    48 13820 13814  0  75   0 37220 71527 -      ?        00:00:01 httpd
S    48 13824 13814  0  75   0 37236 71513 semtim ?        00:00:01 httpd
S    48 13818 13814  0  75   0 37636 71547 semtim ?        00:00:01 httpd
S    48 13819 13814  0  75   0 37636 71617 semtim ?        00:00:01 httpd
S    48 13823 13814  0  75   0 37888 71689 semtim ?        00:00:01 httpd
S    48 13825 13814  0  75   0 37900 71676 semtim ?        00:00:01 httpd

更新: この質問を書いている間 (おそらく 10 ~ 15 分)、上記を再実行したところ、RSS はすべて、上記の ~37000 ではなく ~51072 に置かれています。

これはpythonプログラムからの実行です

 Private  +   Shared  =  RAM used       Program
.... SNIPPED OUT ....
208.0 MiB +  25.5 MiB = 233.5 MiB       httpd (12)
---------------------------------
                        477.1 MiB

PHP メモリ設定:

max_execution_time = 30 
max_input_time = 60  
memory_limit = 152M  

モジュール:

$ apachectl -M
httpd: Could not reliably determine the server's fully qualified domain name, using 192.168.1.2 for ServerName
Loaded Modules:
 core_module (static)
 mpm_prefork_module (static)
 http_module (static)
 so_module (static)
 auth_basic_module (shared)
 auth_digest_module (shared)
 authn_file_module (shared)
 authn_alias_module (shared)
 authn_anon_module (shared)
 authn_dbm_module (shared)
 authn_default_module (shared)
 authz_host_module (shared)
 authz_user_module (shared)
 authz_owner_module (shared)
 authz_groupfile_module (shared)
 authz_dbm_module (shared)
 authz_default_module (shared)
 ldap_module (shared)
 authnz_ldap_module (shared)
 include_module (shared)
 log_config_module (shared)
 logio_module (shared)
 env_module (shared)
 ext_filter_module (shared)
 mime_magic_module (shared)
 expires_module (shared)
 deflate_module (shared)
 headers_module (shared)
 usertrack_module (shared)
 setenvif_module (shared)
 mime_module (shared)
 dav_module (shared)
 status_module (shared)
 autoindex_module (shared)
 info_module (shared)
 dav_fs_module (shared)
 vhost_alias_module (shared)
 negotiation_module (shared)
 dir_module (shared)
 actions_module (shared)
 speling_module (shared)
 userdir_module (shared)
 alias_module (shared)
 rewrite_module (shared)
 proxy_module (shared)
 proxy_balancer_module (shared)
 proxy_ftp_module (shared)
 proxy_http_module (shared)
 proxy_connect_module (shared)
 cache_module (shared)
 suexec_module (shared)
 disk_cache_module (shared)
 file_cache_module (shared)
 mem_cache_module (shared)
 cgi_module (shared)
 version_module (shared)
 perl_module (shared)
 php5_module (shared)
 proxy_ajp_module (shared)
 python_module (shared)
 ssl_module (shared)
Syntax OK

httpd.conf 設定:

IfModule prefork.c>  ignore format on these tags
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients       256
MaxRequestsPerChild  4000

# worker MPM
StartServers         2
MaxClients         150
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     25
MaxRequestsPerChild  0

https://code.google.com/p/check-httpd-limits/wiki/Documentationでプログラムを使用すると、次の結果が得られました。

Apache Httpd MPM 構成の制限を確認する (バージョン 2.4)
ジャン・セバスチャン・モリセット著 - http://surniaulula.com/

Httpd バイナリ

 - 設定: /etc/httpd/conf/httpd.conf
 - EXE : /usr/sbin/httpd
 - MPM : プリフォーク
 - ルート: /etc/httpd
 - バージョン: 2.2

Httpd プロセス

 - PID 10860 (httpd) : 106.93 MB / 3.95 MB 共有
 - PID 13814 (httpd) : 28.52 MB / 共有 6.36 MB [平均から除外]
 - PID 13818 (httpd) : 180.28 MB / 4.29 MB 共有
 - PID 13819 (httpd) : 182.67 MB / 4.04 MB 共有
 - PID 13820 (httpd) : 182.45 MB / 4.08 MB 共有
 - PID 13821 (httpd) : 185.53 MB / 4.04 MB 共有
 - PID 13822 (httpd) : 176.12 MB / 4.36 MB 共有
 - PID 13823 (httpd) : 180.05 MB / 4.04 MB 共有
 - PID 13824 (httpd) : 182.21 MB / 4.05 MB 共有
 - PID 13825 (httpd) : 179.36 MB / 4.04 MB 共有
 - PID 20696 (httpd) : 180.10 MB / 4.04 MB 共有
 - PID 20853 (httpd) : 180.39 MB / 4.03 MB 共有
 - PID 20854 (httpd) : 180.79 MB / 4.04 MB 共有
 - PID 21003 (httpd) : 159.77 MB / 4.05 MB 共有

 - HttpdRealAvg : 166.09 MB [共有を除く]
 - HttpdSharedAvg: 4.05 MB
 - HttpdRealTot : 2225.76 MB [共有を除く]
 -HttpdRunning: 14

Httpd 構成

 - 開始サーバー: 8
 - サーバー制限: 256
 - MinSpareServers: 5
 - MaxSpareServers: 20
 -MaxRequestsPerChild: 4000
 - 最大クライアント数: 256

サーバーメモリ

 - キャッシュ: 671.46 MB
 - MemFree : 547.88 MB
 - MemTotal : 3819.89 MB
 - スワップフリー: 5951.89 MB
 - スワップ合計 : 5951.99 MB

計算のまとめ

 - OtherProcsMem : 370.74 MB (MemTotal - キャッシュ - MemFree - HttpdRealTot - HttpdSharedAvg)
 - FreeMemNoHttpd : 3449.15 MB (MemFree + キャッシュ + HttpdRealTot + HttpdSharedAvg)
 - MaxLimitHttpdMem : 42523.09 MB (HttpdRealAvg * MaxClients + HttpdSharedAvg)
 - AllProcsTotalMem : 42893.83 MB (OtherProcsMem + MaxLimitHttpdMem)

MemTotal の最大値 (3819.89 MB)

   
        StartServers 8 # (変更なし) デフォルトは 5 です
        ServerLimit 21 # (256 -> 21) MaxClients
        MinSpareServers 5 # (変更なし) デフォルトは 5 です
        MaxSpareServers 20 # (変更なし) デフォルトは 10 です
        MaxRequestsPerChild 4000 # (変更なし) デフォルトは 10000 です
        MaxClients 21 # (256 -> 21) (MemFree + キャッシュ + HttpdRealTot + HttpdSharedAvg) / HttpdRealAvg
   

結果

エラー: AllProcsTotalMem (42893.83 MB) が MemTotal (3819.89 MB) と空きスワップ (5951.89 MB) を 33122.05 MB 超えています。

4

2 に答える 2

1

メモリの割り当てが多すぎると、メモリの問題が発生することがあります。PHP に 152M を割り当てる特別な理由がない限り、これは高い値です。それを 32M または 64M に落とします。特定のスクリプトがさらに必要な場合は、そのスクリプトに対してのみ有効にします。

次に、データベースの割り当てを確認します。多くの場合、他に実行する必要がある項目 (クエリのチューニングなど) がある場合に、何かをより高速に実行するためにメモリが最初に割り当てられます。

基本的に、割り当てが多すぎると、I/O の情報のバックアップが作成されます。後ろ向きに聞こえます、私は知っています。同様の問題があり、リソースの割り当てが過剰でした。リソースをデフォルト値にドロップし、これによってメモリ使用量がまったく変化するかどうかを確認します。そこからチューニングして、最適な設定を見つけます。

于 2013-06-22T05:57:39.663 に答える
1

Apache が大量のメモリを消費する理由はいくつも考えられます。普遍的な「答え」はありませんが、トラブルシューティング リストがあります。

  1. Apache とすべてのモジュールを再インストールします。
  2. 必要のないモジュールをすべて無効にします。これらは、余分なリソースを使用する可能性があるだけでなく、セキュリティ上の問題になる可能性もあります。
    1. mod_autoindexは、そのディレクトリに index.* がない限り、誰でも public_html ディレクトリ内の任意のディレクトリ内のすべてのファイルを表示できるようにします。
    2. mod_alias は、Apache を実行していることを明らかにするだけでなく、余分なモジュールを削除していないことを示す良い指標にもなり、標的になる可能性が高くなります。
    3. 実際に使用していない限り、すべてのプロキシ モジュールを削除します。
    4. 不要なmod_cgi、 mod_php などをすべて削除します。Apache に実行を許可するファイルの種類が多いほど、悪意のある人物が悪意を持つ方法が増えます。
  3. サーバー構成を確認してください。特定のディレクティブが何をするかを研究することを恐れないでください。また、apache.conf のバックアップを作成し、いくつか変更することを恐れないでください。最悪の場合、Apache の起動に失敗するか、Apache がクラッシュします。
于 2013-06-10T16:24:32.133 に答える