Apache与mod_php高内存利用率

我们在mod_php和mysql上部署了Apache的Magento应用程序。 我观察到,有时Apache服务器开始消耗高内存,导致内存交换,并在服务器上导致高负载。 每当apache服务器负载较大时,导致高负载的apache进程在mysql结束时处于睡眠模式,客户端处于CLOSE_WAIT状态。 任何帮助表示赞赏解决这个问题。

@raj你可能会发现进程处于S状态,因为他们正在等待I / O绑定的另一个进程(处于D状态)。 让机器停止交换。

所以关键是要解决两个关键问题,标准内存分配和内存承诺。

运行Magento时,只需将PHP Max的内存限制设置得太高,就可以轻而易举地大量提交RAM。 在正常情况下,它不会有任何不良影响,但应用程序尝试使用该内存时,它几乎立即进入交换(如果你已经用完了内存)。

然后,你可能会发现Apache不是内存使用的主要关注点,而是MySQL更可能是罪魁祸首。

您还没有提到您的服务器规格或您商店的任何具体细节,因此无法准确提供build议。 但是简单地修改你的Apache和MySQLconfiguration将是一个简单的开始。 删除Apache线程的数量,MySQL连接,分配的内存承诺。 然后开始使用像Munin这样的工具进行绘图,以便实际上能够关联stream量,线程,CPU使用率和内存使用情况。 如果不这样做,你正在盲目工作。

但是我build议停止在netstat周围进行探测,因为需要诊断TCP状态还有很长的路要走; 你需要从头开始。

阅读一些关于HTTP调优和性能pipe理的好书(真的 – 你不可能在这里得到答案)。

这会导致内存交换

那么你的服务器configuration不好 – 一个web服务器不应该开始交换。 应用通常的Apache调整仪式,并减lessphp最大内存。

每当Apache服务器的负载很高时,导致高负载的Apache进程在mysql结束时处于睡眠模式

嗯? 根据定义的睡眠过程不会导致加载。 什么mhysql结束?

使用这个脚本: http : //saiweb.co.uk/linux/apache/bash%20script/linux-the-sysadmin-script-part-3/

确定您的apache进程使用了​​多less内存。

然后将apacheconfiguration中的MaxClients限制为可以在不交换的情况下运行的进程量。 在这种情况下,当问题发生时,你不会有高LA,你可以find问题的真正根源。 这是我的脚本版本(上面的链接似乎现在被打破)

#!/bin/bash if [ -z "$1" ]; then echo "Usage: sysadmin appmem app_name ie (sysadmin appmem apache)"; else RRES=(`ps aux | grep "$1" | grep -v 'grep' | grep -v "$0" | awk '{print $6}'`); VRES=(`ps aux | grep "$1" | grep -v 'grep' | grep -v "$0" | awk '{print $5}'`); COUNT=0; VMEM=0; RMEM=0; for RSS in ${RRES[@]} do RMEM=$(($RSS+$RMEM)); done; for VIRT in ${VRES[@]} do VMEM=$(($VIRT+$VMEM)); COUNT=$(($COUNT+1)); done; VMEM=$(($VMEM/$COUNT)); VMEM=$(($VMEM/1024)); RMEM=$(($RMEM/1024)); echo -e "$YELLOW ----- MEMORY USAGE REPORT FOR '$1' ----- $CLEAR"; echo "PID Count: $COUNT"; echo "Shared Mem usage: $VMEM MB"; echo "Total Resident Set Size: $RMEM MB"; echo "Mem/PID: $(($RMEM/$COUNT)) MB"; fi