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

我不认为它可以是运行/等的任何脚本,因为它们在物理机器上运行多年。我们尝试在新机器上匹配所有配置(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 都在 ~51072 而不是上面的 ~37000

这是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 版)
让-塞巴斯蒂安·莫里塞特(Jean-Sebastien Morisset)- http://surniaulula.com/

Httpd 二进制

 - 配置:/etc/httpd/conf/httpd.conf
 - 可执行文件:/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
 - 内存免费:547.88 MB
 - 内存总量:3819.89 MB
 - 无交换:5951.89 MB
 - 总交换:5951.99 MB

计算摘要

 - OtherProcsMem:370.74 MB(MemTotal - 缓存 - MemFree - HttpdRealTot - HttpdSharedAvg)
 - FreeMemNoHttpd:3449.15 MB(MemFree + Cached + 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 + Cached + HttpdRealTot + HttpdSharedAvg) / HttpdRealAvg
   

结果

错误:AllProcsTotalMem (42893.83 MB) 超过 MemTotal (3819.89 MB) 和自由交换 (5951.89 MB) 33122.05 MB。

4

2 回答 2

1

有时分配过多的内存会产生内存问题。除非有特定原因将 152M 分配给 PHP,否则这很高。将其降低到 32M 或 64M。如果特定脚本需要更多,请仅为该脚本启用它。

接下来,检查您的数据库分配。当还有其他需要完成的事情(比如查询调优)时,通常内存是人们分配的第一件事,以使某些事情运行得更快。

从本质上讲,过多的分配会为 I/O 创建信息备份。听起来倒退,我知道。我有一个类似的问题,它是过度分配资源。将您的资源设置为默认值,看看这是否会改变内存使用情况。从那里进行调整以找到最佳设置。

于 2013-06-22T05:57:39.663 回答
1

Apache 占用太多内存的原因可能有很多。虽然没有通用的“答案”,但有一个故障排除列表:

  1. 重新安装 Apache 和所有模块。
  2. 禁用所有不需要的模块。除了可能使用额外的资源外,这些也可能是安全隐患。
    1. mod_autoindex将允许任何人查看 public_html 目录中任何目录中的所有文件,只要该目录中没有 index.*。
    2. mod_alias不仅会显示您正在运行 Apache,而且还会很好地表明您没有删除额外的模块,并使您更有可能成为目标。
    3. 删除所有代理模块,除非您实际使用它们。
    4. 删除所有不需要的mod_cgi 、 mod_php 等。您允许 Apache 执行的文件类型越多,恶意人员进行恶意攻击的方式就越多。
  3. 检查您的服务器配置。不要害怕研究某些指令的作用,不要害怕创建 apache.conf 的备份并更改一些内容。最坏的情况是 Apache 无法启动,或者 Apache 崩溃。
于 2013-06-10T16:24:32.133 回答