Apache mod_php 内存利用率过高

Apache mod_php 内存利用率过高

我们在 Apache 上部署了 Magento 应用程序,其中包含 mod_php 和 mysql。我发现有时 apache 服务器开始消耗大量内存,这会导致内存交换并导致服务器负载过高。每当 apache 服务器负载过高时,导致负载过高的 apache 进程在 mysql 端处于睡眠模式,在客户端处于 CLOSE_WAIT 状态。如能帮助解决此问题,我们将不胜感激。

答案1

@raj 您可能会发现进程处于 S 状态,因为它们正在等待受 I/O 约束的另一个进程(处于 D 状态),即等待机器停止交换。

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

运行 Magento 时,只需将 PHP 最大内存限制设置得太高,就很容易大量占用 RAM。在正常情况下,这不会有任何不良影响,但当应用程序尝试使用该内存时,它几乎会立即进入交换区(如果您的 RAM 已用完)。

然后,您可能会发现 Apache 不是内存使用的主要问题,而 MySQL 更可能是罪魁祸首。

您没有提到您的服务器规格或商店的任何具体细节,因此无法准确提供建议。但只需修改您的 Apache 和 MySQL 配置就可以轻松开始。减少 Apache 线程数、MySQL 连接数、分配的内存承诺。然后开始使用 Munin 等工具绘制图表,以便真正关联流量、线程、CPU 使用率和内存使用率。如果不这样做,您就是在盲目工作。

但是我建议不要再四处寻找 netstat,因为您距离诊断 TCP 状态还有很长的路要走;您需要从头开始。

答案2

去读一些关于 HTTP 调整和性能管理主题的好书(真的 - 你不太可能在这里得到答案)。

这会导致内存交换

那么你的服务器配置不正确 - 网络服务器应该绝不开始交换。应用通常的 apache 调整程序并减少 php 最大内存。

每当 apache 服务器负载过高时,导致负载过高的 apache 进程在 mysql 端处于睡眠模式

嗯?睡眠过程根据定义不增加负载。mhysql 结束什么?

答案3

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

确定你的 Apache 进程使用了​​多少内存。

然后在 apache 配置中限制 MaxClients,使其达到无需交换即可运行的进程数量。在这种情况下,当问题发生时,您的 LA 不会很高,您可以找到问题的真正根源。这是我的脚本版本(上面的链接现在似乎已损坏)

#!/bin/bash
       if [ -z "$1" ]; then
                echo "Usage: sysadmin appmem app_name i.e. (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

相关内容