在收到几条 nagios 消息(如“CRITICAL - 平均负载:135.12, 92.20, 44.09”和 oom-killer)之后,我一次又一次地检查配置,使用了不同的设置,但都没有成功。
在 ubuntu 上唯一似乎有帮助的解决方法是这个更清洁的 cronjob:
[ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) ! -execdir fuser -s {} 2>/dev/null \; -delete
读取 oom-killer 信息,告诉我 apache2 是坏进程(父进程)。此虚拟服务器上的流量很少,几乎没有峰值。
处理器
架构:x86_64
CPU 操作模式:32 位、64 位
字节顺序:小端
CPU:1
免费-m
内存:2003 835 1168 0 18 381
-/+ 缓冲区/缓存:435 1568
交换:1019 129 890
apache2.conf mpm
<IfModule mpm_prefork_module>
StartServers 2
MinSpareServers 2
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 10000
</IfModule>
<IfModule mpm_worker_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
KeepAliveTimeout 15
ThreadLimit 64
ThreadsPerChild 25
MaxClients 100
MaxRequestsPerChild 10000
</IfModule>
<IfModule mpm_event_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxClients 100
MaxRequestsPerChild 10000
</IfModule>
有没有类似 apache 的 mysql_tuner.sh 或者类似 vps 的有用示例?
谢谢
答案1
您过度分配了内存 - OOM 表示“内存不足” - 高负载平均数将是机器交换的结果。
您不需要调整脚本就可以知道要使用哪些合适的设置。启动 Apache,然后查看单个线程的 RAM 使用情况。通常,对于 PHP 应用程序,预计约为 30MB。然后,您可以开始计算实际可以运行的线程数。
您可能会发现您在应用程序级别(PHP 最大内存或 MySQL)分配了过多的内存,而不是 Apache 线程数量本身;只是应用程序使使用率超出了极限。
暂时要非常保守,然后逐步提高。因此,将设置降低到如下水平:
StartServers 1
MinSpareServers 1
MaxSpareServers 10
MaxClients 15
MaxRequestsPerChild 1500
然后降低所有 MySQL 内存设置,或者至少降低连接数(至约 15);并降低所有 PHP 最大内存设置。
内存使用脚本
这是我为内存使用编写的一个小脚本,但请记住,它不会正确考虑共享库等。
只需创建一个新文件,
例如。/root/memory_usage.sh
然后使用应用程序名称运行,
例如。/root/memory_usage.sh apache2
或者 /root/memory_usage.sh mysqld
#!/bin/bash
grandtotal=0
if [ $# -lt 1 ];then
echo "$0: invalid option"
echo "You are missing required arguments"
echo "1 Application name or 'all', 2 2nd application name (optional)"
exit 0
fi
if [[ "$1" == "all" ]]; then
tot=0;for i in `ps -e -orss=`;do tot=$(( $tot + $i )); done;
echo "Total " $(( $tot /4096 )) "MB"
exit
fi
for app in $@; do
echo -n $app
ps u -p $(pidof $app) | awk 'NR > 1 {nm += $5} END {print " Total: " nm/1024 " MB"}'
apptotal=`ps -e -orss=,args= | grep "$app" | awk 'NR > 0 {nm += $1} END {print nm}'`
echo "$app Total: " $(( $apptotal / 4096 )) "MB"
grandtotal=$(( $apptotal + $grandtotal ))
done
if [ $# -gt 1 ];then
echo "Grand total: " $(( $grandtotal / 4096 )) "MB"
fi