我想弄清楚为什么我的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
你几乎肯定会运行mod_php,这意味着你几乎肯定在mpm_prefork中运行apache。
如果性能一般正常,直到负载导致你开始交换,一个快速的解决办法是开始限制阿帕奇的MaxClients。 如果允许apache在任何时候分叉工作进程,它将在加载时开始交换。 请求将排队,直到有一名工作人员可用,所以事情会变得缓慢,但不会像死亡交换一样慢。
如果你真的需要调整更紧密的东西,考虑离开prefork apache MPM。 这意味着将PHP作为FastCGI运行。 如果你打算在FastCGI下使用PHP,你应该考虑升级到PHP 5.3.3,它有更好的FastCGI进程pipe理器(–enable-fpm configure option)。
php-fpm / worker比老式的mod_php更有效率。 然后,您可以独立于PHP进程的数量来调整apache进程/线程的数量。 而你的内存庞大的PHP进程只用于提供php驱动的内容,而不会浪费在提供静态文件上。
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
是wordpress唯一运行在Apache? 我很好奇主要关于那里的PID 6765非常高的CPU使用率。 不知道它在做什么。 就mem%s而言,对于webapp设置来说,这看起来很正常,因为每个线程实际上运行着多个worker。
你用什么MPM为Apache,你如何configuration?
另外,如果您要发布terminal转储,请用四个空格开始每行。 它允许保存格式。
我的水晶球有点尘土飞扬,但我想你正在使用memcached和它的PHP扩展。 如果是这种情况,请尝试禁用它,除非你真的需要这个东西。
另一种可能是你有一些操作码caching,比如XCache ,并且已经configuration它使用大量的内存。
你可以试试
pmap -x `pidof apache`
看看消耗什么内存。
apache进程的内存数字对于PHP安装来说是非常正常的。 一个高度优化的apache / php服务器在这里有很多未加载甚至编译的模块/扩展,每个进程的虚拟内存通常在200到350MiB之间,每个进程的内存在40到45MiB之间。
你可能不熟悉虚拟内存子系统? 从你写的东西,你的系统可能是健康的。 检查平均负载,除非这个数字还很高,否则这些内存数字是可以的。
如果你认为它应该永远保持在0MiB swap,那么你错了,那对于你的操作系统来说这将是一件非常愚蠢的事情。
不要加载未使用的Apache模块(如Python,Perl等)。
使用eAccelerator php模块。 这是php编译器。 你可以得到更快的执行和更小的内存使用。
其他用户也许也是对的。