zoukankan      html  css  js  c++  java
  • 处理Load高一直不降的故障

    问题描述

      应用部发现机器load一直飙升达到600%多, 但IO与CPU都处于正常值状态, 业务流量也没有上升, 机器资源是CPU:2核   内存:8G, 应用: 2个tomcat应用, 需要查找什么原因导致load飙升.

    处理过程

      查看uptime, 发现load值已处于600%多, 如下:

     查看vmstat 与iostat查看IO都处于0值,表现业务并没有什么流量.

    在使用top命令检查系统负载的时候,可以看到Load averages字段,但是这个字段并不是表示CPU的繁忙程度,而是度量系统整体负载。系统有很高的负载但是CPU使用率却很低,或者负载很低而CPU利用率很高,这两者没有直接关系.

    找出运行队列中的进程

    每隔1秒统计:

    #!/bin/bash
    LANG=C
    PATH=/sbin:/usr/sbin:/bin:/usr/bin
    interval=1
    length=86400
    for i in $(seq 1 $(expr ${length} / ${interval}));do
    date
    LANG=C ps -eTo stat,pid,tid,ppid,comm --no-header | sed -e 's/^ *//' | perl -nE 'chomp;say if (m!^S*[RD]+S*!)'
    date
    cat /proc/loadavg
    echo -e "
    "
    sleep ${interval}
    done

           发现有大量的df命令处于D状态, 他们才是造成load上伤的元凶,和我们的应用没有关系. 但是为什么都是df命令呢, 在机器执行df命令发现一直卡起, 马上能定位到业务部查看文件

    系统使用时都是直接退出, 找到卡其的原因, 发现这台机器上有nfs, 但是没有挂载所以才会造成执行df 一直卡起.

    D代表不可中断的睡眼进程. 找出这些df的进程, 进行kill. load慢慢就降下来了.

    检查CPU使用率比较高的线程脚本

    #!/bin/bash
    LANG=C
    PATH=/sbin:/usr/sbin:/bin:/usr/bin
    interval=1
    length=86400
    for i in $(seq 1 $(expr ${length} / ${interval}));do
    date
    LANG=C ps -eT -o%cpu,pid,tid,ppid,comm | grep -v CPU | sort -n -r | head -20
    date
    LANG=C cat /proc/loadavg
    { LANG=C ps -eT -o%cpu,pid,tid,ppid,comm | sed -e 's/^ *//' | tr -s ' ' | grep -v CPU | sort -n -r | cut -d ' ' -f 1 | xargs -I{} echo -n "{} + " && echo ' 0'; } | bc -l
    sleep ${interval}
    done
    fuser -k $0

      

  • 相关阅读:
    C字符串处理函数
    C语言字符串函数大全
    那些闪亮的日子
    牛客网在线编程:幸运数
    牛客网在线编程:水仙花数
    [LeetCode]617.Merge Two Binary Trees
    [LeetCode]657.Judge Route Circle
    [LeetCode]141. Linked List Cycle
    五大算法:分治,贪心,动态规划,回溯,分支界定
    [LeetCode]387.First Unique Character in a String
  • 原文地址:https://www.cnblogs.com/zhangzihong/p/13600486.html
Copyright © 2011-2022 走看看