🦋
Butterfly 用户手册
  • Introduction
  • 一 前言
  • 二 开始
    • 安装部署
    • 五分钟体验指南
    • 单机使用手册
    • 应用规范
      • handler specs
      • middleware specs
      • xingqiao_plugin specs
      • yiqiu_program specs
  • 三 客户端功能
    • MySQL 原生协议
    • MySQL ORM
    • Redis 原生协议
      • redis_config
      • redis_tls
    • Redis ORM
    • Redis mcpack
    • Localcache
    • Kazoo
  • 四 应用(通用服务)
    • API JSON 规范
    • 异步任务 BaiChuan(百川)
    • 任务调度 RuQi(如期)
    • 任务编排 XingQiao(星桥)
    • 配置管理 WuXing(五行)
    • 运筹决策 BaiCe(百策)
  • 五 部署运维
    • 单机容器化部署
    • 监控
    • 异常排查
      • CPU Load spike every 7 hours
    • 升级
    • 安全
    • 其他
  • 六 前端
    • butterfly_template
    • butterfly_fe
    • butterfly-admin(json2web)
      • amis
      • sso
      • pangu
    • NoahV
    • PyWebIO
  • 七 潘多拉魔盒
    • 装饰器
      • localcache_decorator
      • retry_decorator
      • custom_decorator
      • command2http_decorator
    • 算法
      • 算法-分位数
      • 算法-变异系数
    • 实用工具
      • host_util
      • shell_util
      • http_util
      • time_util
      • random_util
      • concurrent
      • jsonschema
      • blinker
      • toml
      • command_util
      • config_util
      • picobox
      • 对称加密
        • des
        • aes
      • ascii_art
        • ttable
        • chart
      • business_rules
      • python-mysql-replication
      • dict_util
    • 中间件
      • middleware_status
      • middleware_whitelist
    • test_handler.py
  • 八 最佳实践
    • 分布式架构
    • Code practice
    • Log practice
    • Daemon process
  • 附录
Powered by GitBook
On this page
  • 1 CPU load 含义
  • 2 Load 周期性波动
  • 2.1 特定机器?
  • 2.2 这个是内核 BUG 吗?
  • 2.3 这是一个特定的问题吗?
  • 4 如何找出系统中 load 高时处于运行队列的进程
  • 传送门
  1. 五 部署运维
  2. 异常排查

CPU Load spike every 7 hours

CPU负载每 7 小时激增一次

1 CPU load 含义

CPU load 是指一段时间内系统所有 CPU 上,正在处理以及等待CPU处理的进程数之和。

在使用top命令检查系统负载的时候,可以看到Load averages字段,但是这个字段并不是表示CPU的繁忙程度,而是度量系统整体负载。

Load averages采样是从/proc/loadavg中获取的:

$ cat /proc/loadavg
0.00 0.01 0.05 1/161 29703

每个值的含义依次为:
lavg_1 (0.00) 1-分钟平均负载
lavg_5 (0.01) 5-分钟平均负载
lavg_15(0.05) 15-分钟平均负载
nr_running (1) 在采样时刻,运行队列的任务的数目,与/proc/stat的procs_running表示相同意思,这个数值是当前可运行的内核调度对象(进程,线程)。
nr_threads (161) 在采样时刻,系统中活跃的任务的个数(不包括运行已经结束的任务),即这个数值表示当前存在系统中的内核可调度对象的数量。
last_pid(29703) 系统最近创建的进程的PID,包括轻量级进程,即线程。

假设当前有两个CPU,则每个CPU的当前任务数为0.00/2=0.00

如果你看到 load average 数值是 10,则表明平均有 10 个 进程在运行或等待状态。

有可能系统有很高的负载但是 CPU 使用率却很低,或者负载很低而 CPU 利用率很高,

因为这两者没有直接关系。

2 Load 周期性波动

#define LOAD_FREQ   (5*HZ+1)

load 不是每 5 秒检查一次,是每 5.001 检查一次,因此,需要5*1000*5.001秒才能回到5秒的倍数。25005/3600大约是7小时(6小时56分40秒)。

2.1 特定机器?

每台机器都会有这个情况,只是是否明显,即使是空闲的机器,也会有 7 小时 cpu 波动情况。

如果定时任务执行脚本时间很短,load 不是每次都能采集到进程正在运行,但随着时间推移,会在 7 小时内采集到

2.2 这个是内核 BUG 吗?

不是!我们确信,增加额外的毫秒是有意的,以准确覆盖正在进行非常短但紧张的工作的情况。想象一下,load 是以 5 秒的间隔精确测量的。load 测量中根本看不到一个特殊定制的任务,比如等待0.1秒,做4.8秒的高强度工作,然后再等待0.1秒。

2.3 这是一个特定的问题吗?

绝对不是,当定期执行相对较短(执行时间 <5s)的任务时,这种情况一定无处不在。

执行脚本小于 5s 时,load 检查时,检查的时候,只会在特定的周期才能正好捕获到脚本处于运行中

4 如何找出系统中 load 高时处于运行队列的进程

每秒输出处于 R (运行中的队列)or D (不可中断的睡眠进程)状态的进程

#!/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 "\n"
    sleep ${interval}
done

查 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
    echo "----------------------------------"
    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

传送门

Previous异常排查Next升级

Last updated 23 days ago

这是由于内核计算负载的方式造成的。参见

内核源码
Investigation of regular high load on unused machines every 7 hours
Logo
Nagios load spike every 7 hoursServer Fault
找到Linux虚机Load高的"元凶"-阿里云开发者社区
Logo
Logo