我的情况如下:我们在 15Gb RAM 实例、机架空间上运行 Magento Professional。
运行 htop 时,我们可以看到“apache2 -k start”不断产生更多的子进程,其中一些占用了约 900Mb 的内存。
当内存几乎用完时,所有站点都会超时或变得非常慢。当内存全部用完时,似乎其中一些进程被终止以释放内存。
然后同样的程序发生。
我的问题是,当内存使用率达到 85-90% 时,我们是否可以设置 ubuntu / apache 来终止子进程并释放内存?
答案1
#!/bin/sh
TOTAL=`cat /proc/meminfo | grep MemTotal: | awk '{print $2}'`
USEDMEM=`cat /proc/meminfo | grep Active: | awk '{print $2}'`
LOG=/var/log/apache-free.log
LIMIT=90
DATA=`date +%Y-%m-%d" "%H:%M:%S`
if [ "$USEDMEM" -gt 0 ]
then
USEDMEMPER=$(($USEDMEM * 100 / $TOTAL))
USEDMEMPERLOG=$USEDMEMPER
if [ $USEDMEMPER -lt $LIMIT ]; then
echo "$DATA | Memory: $USEDMEMPER%, (limit: $LIMIT%) | Do not restart!"
else
echo "$DATA | Memory limit reached ($LIMIT%): $USEDMEMPERLOG% | Restarting apache..."
# restart apache
sudo service apache2 restart
TOTAL=`cat /proc/meminfo | grep MemTotal: | awk '{print $2}'`
USEDMEM=`cat /proc/meminfo | grep Active: | awk '{print $2}'`
USEDMEMPER=$(($USEDMEM * 100 / $TOTAL))
echo "$DATA | Memory limit reached ($LIMIT%): $USEDMEMPERLOG% | Memory after restart: $USEDMEMPER%" >> $LOG
tail -1 $LOG
fi
fi
将此代码保存为apache-free.sh文件并设置为可执行文件并添加权限
chmod +X apache-free.sh
chmod 755 apache-free.sh
添加 crontab 计划,每 1 分钟运行一次(可以随意重新定义这个时间)
crontab -e
*/1 * * * * cd /dir/of/script && sh apache-free.sh
该脚本保存了一个日志文件,其中/var/log/apache-free.log
包含一些有关执行和内存保存的信息。
** 记住:这只是一个创可贴!必须检测出服务器的真正问题。
希望对你有帮助!
答案2
这不完全是您的要求,但您可以使用此方法:
您必须知道两个参数:每个 apache 进程的平均内存使用量、您想要为 apache 分配的 RAM 数量(例如完整 RAM - 2GB)
然后你设置最大客户数指令
MaxClients = 您要为 apache 分配的 RAM 数量(例如完整 RAM - 2GB)/每个 apache 进程的平均内存使用量
因此,如果我计算您的情况正确的话:14GB(系统为 15-1)/ 800 => MaxClients ~= 18
但请记住:当您达到的流量超过 18 个同时请求时,它们将被排队,但您的内存和整个 SysOp 将是安全的......
答案3
这可能有点笨拙,但是……您可以设置一个 cron 作业来定期运行脚本。该脚本可以检查 apache 的内存使用情况,并在必要时终止/重新启动它。
这个问题有一个cron示例:https://stackoverflow.com/questions/5398014/cron-crontab-execute-a-script-every-minute-and-another-one-every-24-hours