处理器

处理器

在收到几条 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

相关内容