我们在 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