Apache 每个进程占用超过 50 Mb 的内存

Apache 每个进程占用超过 50 Mb 的内存

我正在使用 debian + apache2 + php (作为 mod_apache) / 786Mb RAM 运行 VPS

问题是我的内存经常不足。

当我运行“top”命令时,它显示大约 10 个 apache2 进程 - 每个进程占用超过 50Mb 的内存!我认为每个进程占用的内存太多了,对吗?是什么原因造成的?

我运营着几个每天点击量约为 1000 次的网站和几个很少访问的 WordPress 博客。

我访问量最大的网站之一拥有大量中等尺寸的图像 - 这可能是一个问题吗?

更新(我正在添加流程表):

   top - 16:19:52 up  1:55,  1 user,  load average: 0.05, 0.51, 0.80
Tasks:  35 total,   2 running,  33 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:    786432k total,   786432k used,        0k free,        0k buffers
Swap:        0k total,        0k used,        0k free,        0k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
    1 root      15   0 10308  740  620 S  0.0  0.1   0:00.71 init
 9728 root      18   0 62184 1404  968 S  0.0  0.2   0:00.12 rsyslogd
 9741 root      16   0 48860 1204  704 S  0.0  0.2   0:00.16 sshd
 9763 root      15   0  193m  10m 5856 S  0.0  1.4   0:00.32 apache2
 9773 root      15   0 66948 3376 2448 S  0.0  0.4   0:00.43 sshd
 9776 bind      25   0  118m  12m 2624 S  0.0  1.6   0:00.01 named
 9787 root      15   0 12372  644  460 S  0.0  0.1   0:00.02 dovecot
 9813 root      18   0 71128 3004 2292 S  0.0  0.4   0:00.00 dovecot-auth
10060 Debian-e  15   0 42712  996  604 S  0.0  0.1   0:00.00 exim4
10065 nobody    15   0 21276 1432  696 S  0.0  0.2   0:00.02 memcached
10069 mongodb   18   0  116m  15m 4520 S  0.0  2.0   0:03.37 mongod
10076 dovecot   15   0 14216 2000 1604 S  0.0  0.3   0:00.01 imap-login
10117 root      19   0 17320 1448 1148 S  0.0  0.2   0:00.00 mysqld_safe
10157 mysql     15   0  200m  49m 6316 S  0.0  6.5   0:10.69 mysqld
10158 root      18   0  3776  596  504 S  0.0  0.1   0:00.00 logger
10165 root      15   0 42204 2044 1404 S  0.0  0.3   0:00.10 sftp-server
10235 proftpd   18   0 64224 1556  592 S  0.0  0.2   0:00.00 proftpd
11281 root      18   0 18544  928  712 S  0.0  0.1   0:00.01 cron
13549 root      15   0 66220 3172 2448 S  0.0  0.4   0:00.05 sshd
13551 root      15   0 42080 1888 1400 S  0.0  0.2   0:00.01 sftp-server
13560 www-data  15   0  227m  42m 5572 S  0.0  5.5   0:07.49 apache2
15702 root      15   0 66064 3132 2472 R  0.0  0.4   0:00.22 sshd
15849 root      15   0 17452 1700 1244 S  0.0  0.2   0:00.00 bash
20348 dovecot   15   0 14208 1988 1596 S  0.0  0.3   0:00.00 pop3-login
20468 root      15   0 18820 1196  940 R  0.0  0.2   0:01.56 top
21788 www-data  15   0  236m  51m 4164 S  0.0  6.8   0:06.18 apache2
21972 www-data  15   0  232m  48m 4044 S  0.0  6.3   0:07.14 apache2
21973 www-data  18   0  230m  46m 4672 S  0.0  6.1   0:01.82 apache2
26321 www-data  15   0  227m  43m 4060 S  0.0  5.6   0:00.76 apache2
26335 www-data  15   0  229m  46m 4776 S  0.0  6.0   0:00.44 apache2
26336 www-data  15   0  232m  49m 4844 S  0.0  6.4   0:01.37 apache2
26337 www-data  15   0  227m  43m 4148 S  0.0  5.6   0:00.64 apache2
26340 www-data  15   0  227m  43m 4104 S  0.0  5.6   0:00.46 apache2
26341 www-data  18   0  231m  48m 4596 S  0.0  6.3   0:00.44 apache2
27983 root      15   0  106m 8492 6192 S  0.0  1.1   0:00.10 ispmgr

答案1

我已经将内容添加memory_get_peak_usage()到每个网站的页脚,我发现 WordPress 仅显示网站主页就使用了 > 37Mb。

同时,我自己编写的另一个网站没有使用任何框架或 CMS(非常复杂的网站,但代码比 WordPress 干净得多)仅使用 0.9 Mb 的内存。

WordPress 非常饥饿。

答案2

首先,786mb 是一个非常小的服务器。我猜这是托管服务最小的内存占用量,旨在让您运行,但目的是让您在尝试做任何有用的事情时耗尽内存。我猜他们的营销模式当时就奏效了 :)

其次,你确定每个进程都使用了 50mb 吗?请记住,Apache 是一个分叉服务器,因此很多子进程可能看起来很大,但实际上它们共享内存。你可能需要复习一下虚拟内存、保留内存和共享内存之间的区别:

http://mugurel.sumanariu.ro/linux/the-difference-among-virt-res-and-shr-in-top-output/

简而言之,您要查看的是“top”输出中的“res”列,即每个额外的 apache 进程所占用的额外物理内存量。

图像不是问题,apache 可以全天提供这些图像而不会影响其内存模型。

答案3

每个都占用>50Mb的内存

不。要是真的那么简单就好了。我快速谷歌了一下,找到了一些关于 Linux 内存管理的链接,但互联网上有很多不好的信息。虽然这种描述对于一个进程的单个实例来说是一种可行的(如果不准确的话),但是对于自分叉守护进程来说,情况就非常不同了。

尝试测量实际内存使用量是一个漫长而复杂的过程。查看“free”的输出并将其与正在运行的 httpd 进程数进行比较要简单得多 - 不过,对于您而言,由于流量如此之低,您可能需要重新配置服务器以减少空闲 httpd 进程数。

我有一个 1Gb 的服务器群,每个服务器都可以通过 Apache/PHP 轻松处理 200 多个客户端。很多将取决于您的应用程序的性质,我当然不会期望 11 会耗尽内存。

另一方面,我没有在同一个盒子上运行 mongo、exim、dovecot、bind、memcache、mysql 和 ftp 服务器。

答案4

这是对使用 Apache PHP5 DSO 模块解释器运行的任何资源密集型 PHP 应用程序的标准观察。

Magento 一直是世界闻名的资源消耗大户,它非常擅长测试并证明您需要安装 Fast-CGI 来停止将 Apache 转换为非常低效的 PHP 解释器,或者最好转向 LiteSpeed 和 lsphp5 来提高速度和效率。

Wordpress 和 Joomla 都属于需要提供足够内存和高效服务器平台的类别,该平台已经过优化,超越了通常在较便宜的网络托管上获得的 OEM 开箱即用安装。

相关内容