当内存使用率达到 90% 时终止 Apache 进程

当内存使用率达到 90% 时终止 Apache 进程

我的情况如下:我们在 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

相关内容