ubuntu loadaverage 高_谢宝友:Load高故障分析

本文由阿里巴巴内核软件工程师谢宝友分享,介绍了如何分析和处理Linux系统Load average高的问题。通过监控Load指标、CPU利用率和IO等待时间,结合top和uptime命令,以及内核模块实现轻量级的负载监控,找出系统负载升高的原因。文章还提供了实践案例,展示了如何定位和解决Load高问题。
摘要由CSDN通过智能技术生成
684d2970d14f913cd3403f94ea4373d5.png 666c2b6ef2ef02bd22b49550addde495.png人物介绍 bbd4f1a4c55d9055c70077fc75599676.png

      谢宝友,阿里巴巴系统软件事业部内核软件工程师。他以奇特的经历进入IT行业,在编程一线工作已经有20年时间,其中最近10年时间工作于Linux操作系统内核。在中兴通讯操作系统产品部工作期间,他作为技术总工参与的电信级嵌入式实时操作系统,获得了行业最高奖----中国工业大奖。同时,他也是中国开源软件推进联盟专家委员会委员,Linux ZTE架构的Maintainer,向Linux提交了4000多行代码。他翻译的《深入理解并行编程》一书已经于2017年出版。该书原作者PaulE.McKeney是IBM Linux中心领导者、Linux RCU Maintainer。目前,他在维护阿里集团数以万计生产服务器稳定性的同时,也在利用业余时间继续编写DIM-SUM操作系统,并根据此操作系统编写《国产自研操作系统设计与实现》一书。

0 1 Load指标的意义

Linux的Load指标代表系统运行负载,是一个让新手不太容易了解的概念。简单的说,Load指标表示一段时间内,系统有多少个正在运行的任务。包含:

1、正在CPU上面运行的任务数量

2、等待CPU调度运行的任务数量

3、等待IO执行结果的任务数量

根据工程经验,一般来说,当系统的Load指标值大于系统中CPU 数量的1.5~2倍时,表明系统负载较重,需要分析原因,采取措施降低Load指标值。否则可能产生系统卡顿的现象。如果系统的Load指标值大于系统中CPU 数量的3倍时,,表明系统负载非常严重。

随着多核系统中CPU数量的增加,以及容器虚拟化技术的发展,不同业务均运行在同一系统中,不可避免的造成业务之间的相互影响。此时,业务方常常会将系统Load指标作为衡量系统负载的重要指标。如果系统负载超过警告值,就会采取业务迁移等运维手段。并要求技术工程师分析Load高的原因。

因此,技术工程师有必要掌握Load高的分析手段。

0 2 如何观察Load指标

我们一般通过top、uptime命令查看最近1分钟、5分钟、15分钟的平均Load指标。

下图是top命令的输出示例:

top - 13:54:54 up  1:49,  1 user,  load average: 2.18, 1.72, 1.00

Tasks: 201 total,   4 running, 154 sleeping,   0 stopped,   0 zombie

%Cpu(s):  8.0 us,  1.7 sy,  0.1 ni, 90.1 id,  0.1 wa,  0.0 hi,  0.1 si,  0.0 st

KiB Mem :  4039160 total,   624264 free,  1616064 used,  1798832 buff/cache

KiB Swap:  1045500 total,  0031045500 free,        0 used.  2007432 avail Mem

红色部分表示系统在最近1分钟、5分钟、15分钟的平均Load指标为2.18/1.72/1.00。

Load指标受到CPU利用率和IO等待时间的影响。

首先看看CPU利用率。在上图中,通过观察如下三个指标来判断CPU利用率:

%Cpu(s):  8.0 us,  1.7 sy,  0.1 ni, 90.1 id,  0.1 wa,  0.0 hi,  0.1 si,  0.0 st

这三个指标分别代表程序运行在用户态、内核态、以及运行在nice值调整期间的时间。您可以简单的认为这三个值之和代表了系统的CPU利用率。

如果系统中I/O密集型的程序在运行,那么iowait指标会偏高:

%Cpu(s):  8.0 us,  1.7 sy,  0.1 ni, 90.1 id,  0.1 wa,  0.0 hi,  0.1 si,  0.0 st

0 3如何构造测试用例

首先,我们在控制台中运行如下命令,共计运行4次:

while :;do :;done &

这会启动4个后台运行的CPU密集型任务,占用4个CPU。

然后,使用如下命令启动fio,运行IO密集型任务:

sudo sh -c "while :; do fio -name=mytest -filename=test.data -direct=0 -thread -rw=randread -ioengine=psync -bs=4k -size=1M -numjobs=2 -runtime=10 -group_reporting;echo 1 > /proc/sys/vm/drop_caches; done"

我们可以在top命令中看到如下结果:

top - 14:31:34 up  2:26,  1 user,  load average: 6.51, 5.14, 3.93Tasks: 206 total,   7 running, 156 sleeping,   0 stopped,   0 zombie%Cpu(s): 86.3 us, 12.9 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.7 si,  0.0 stKiB Mem :  4039160 total,  1382444 free,  1599384 used,  1057332 buff/cacheKiB Swap:  1045500 total,  1045500 free,        0 used.  1743056 avail Mem

思考题:我们明明启动了一个fio这样的IO密集型任务,为什么上图中的wa指标为0?

有不少排查Load问题的方法,然而本文介绍的方法可以用于工程实践中,原因是:

1、轻量级,对系统性能的影响微乎其微

2、不需要安装第三方工具,易于部署

3、可以大规模部署,长时间运行

4、灵活,可以根据实际情况随时调整工具

接下来,我们看看如何一步一步的找到Load高问题的元凶!

0 4一步一步编写工具

我们的工具是一个内核模块,首先实现一个最简单的模块,包含三个文件:

1、Makefile文件

OS_VER := UNKNOWNUNAME := $(shell uname -r)ifneq ($(findstring 4.15.0-39-generic,$(UNAME)),)             OS_VER := UBUNTU_1604endififneq ($(KERNELRELEASE),)             obj-m += $(MODNAME).o             $(MODNAME)-y := main.o             ccflags-y := -I$(PWD)/else             export PWD=`pwd`ifeq ($(KERNEL_BUILD_PATH),)             KERNEL_BUILD_PATH := /lib/modules/`uname -r`/buildendififeq ($(MODNAME),)             export MODNAME=load_monitorendifall:             make CFLAGS_MODULE=-D$(OS_VER) -C /lib/modules/`uname -r`/build M=`pwd`  modulesclean:             make -C $(KERNEL_BUILD_PATH) M=$(PWD) cleanendif

思考题:为什么要定义OS_VER这个变量?

2、main.c文件

/** * Baoyou Xie's load monitor module * * Copyright (C) 2018 Baoyou Xie. * * Author: Baoyou Xie  * * License terms: GNU General Public License (GPL) version 2 */#include #include #include "load.h"static int load_monitor_init(void){
                 printk("load-monitor loaded.\n");             return 0;}static void load_monitor_exit(void){
                 printk("load-monitor unloaded.\n");}module_init(load_monitor_init)module_exit(load_monitor_exit)MODULE_DESCRIPTION("Baoyou Xie's load monitor module");MODULE_AUTHOR("Baoyou Xie ");MODULE_LICENSE("GPL v2");

请大家注意文件中的注释,以及文件末尾的模块说明。

3、load.h文件

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值