我想知道为什么我的 Apache 进程消耗了这么多内存
我的切片规格(1.5GB RAM,CentOS 5,Apache2,PHP 5.2,MySQL)
正如您所看到的,我的顶级进程消耗了几乎一半的内存,并且当产生更多进程时,服务器几乎陷入停顿,频繁进入交换并崩溃。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6817 apache 40 0 296m 103m 3920 S 0.0 6.7 0:03.52 httpd
6789 apache 40 0 295m 101m 3932 S 0.0 6.6 0:07.04 httpd
6765 apache 40 0 284m 91m 3948 S 55.1 5.9 0:12.45 httpd
6798 apache 40 0 284m 90m 3944 S 0.0 5.9 0:05.49 httpd
6542 apache 40 0 283m 90m 3956 S 0.0 5.8 0:43.25 httpd
6827 apache 40 0 283m 88m 3796 S 0.0 5.7 0:01.83 httpd
有谁知道是什么原因导致 apache(和 php)消耗如此多的内存?
total used free shared buffers cached
Mem: 1545 827 718 0 3 111
-/+ buffers/cache: 713 832
Swap: 3071 103 2968
答案1
您几乎肯定正在运行 mod_php,这意味着您几乎肯定正在 mpm_prefork 中运行 apache。
如果性能通常都还好,直到负载导致您开始交换,那么一个快速解决方法就是开始限制 apache 的 MaxClients。如果允许 apache 随时分叉工作进程,它将在负载下开始交换。请求将排队,直到有工作进程可用,因此速度可能会变慢,但不会像因交换而死亡那样慢。
如果您确实需要更严格地调整,请考虑放弃 prefork apache mpm。这意味着将 PHP 作为 FastCGI 运行。如果您要在 FastCGI 下使用 PHP,则应考虑升级到 PHP 5.3.3,它具有更好的 FastCGI 进程管理器(--enable-fpm 配置选项)。
php-fpm/worker 比老式的 mod_php 更节省内存。然后,您可以独立于 PHP 进程数调整 apache 进程/线程数。而且,占用大量内存的 PHP 进程仅用于提供 php 驱动的内容,而不会浪费在提供静态文件上。
答案2
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6817 apache 40 0 296m 103m 3920 S 0.0 6.7 0:03.52 httpd
6789 apache 40 0 295m 101m 3932 S 0.0 6.6 0:07.04 httpd
6765 apache 40 0 284m 91m 3948 S 55.1 5.9 0:12.45 httpd
6798 apache 40 0 284m 90m 3944 S 0.0 5.9 0:05.49 httpd
6542 apache 40 0 283m 90m 3956 S 0.0 5.8 0:43.25 httpd
6827 apache 40 0 283m 88m 3796 S 0.0 5.7 0:01.83 httpd
apache 上唯一运行的程序是 wordpress 吗?我最好奇的是 PID 6765 的 CPU 使用率非常高。不知道它在做什么。就 mem%s 而言,这对于 webapp 设置来说看起来很正常,因为每个线程实际上都在运行多个工作程序。
您正在使用什么 MPM 用于 apache,以及如何配置它?
另外,如果您要发布终端转储,请以四个空格作为每行的开头。这样可以保留格式。
答案3
我的水晶球有点脏,但我猜你正在使用memcached及其 PHP 扩展。如果是这种情况,请尝试禁用它,除非您确实需要它。
另一种可能性是,你有某种操作码缓存,例如缓存、安装并配置它以使用大量内存。
你可以尝试
pmap -x `pidof apache`
看看是什么消耗了内存。
答案4
不要加载未使用的 apache 模块(例如 python、perl 等)。
使用 eAccelerator php 模块。它是 php 编译器。您可以获得更快的执行速度和更小的内存使用量。
其他用户也许也对。