百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Linux性能调优 | 平均负载的理解和分析

gudong366 2025-06-05 15:51 12 浏览

01 uptime命令

通常我们发现系统变慢时,我们都会执行top或者uptime命令,来查看当前系统的负载情况,比如像下面,我执行了uptime,系统返回的了结果。

[root@lincoding ~]# uptime
 08:31:49 up 27 min,  1 user,  load average: 0.07, 0.04, 0.00

前几列的信息,相信大家都很熟悉,它们分别是当前时间、系统运行时间和正在登陆的用户个数,最后一个就是系统平均负载的情况。

08:31:49                        // 当前时间
up 27 min                       // 系统运行时间
1 user                          // 正在登录用户数
load average: 0.07, 0.04, 0.00  // 平均负载的情况

Load Average的三个数字,依次则是过去1分钟、5分钟、15分钟的平均负载。可以通过观察这三个数字的大小,可以简单判断系统的负载是下降的趋势还是上升的趋势。

  • 如果 load average: 1.00, 5.00, 10.00 三个数字依次增大,则说明在过去的 1 分钟系统的负载比过去 15 分钟系统的负载,表明系统的负载是下降的趋势。
  • 如果 load average: 10.00, 5.00, 1.00 三个数字依次降低,则说明在过去的 1 分钟系统的负载比过去 15 分钟系统的负载,表明系统的负载是上升的趋势。
  • 如果 load average: 0.07, 0.04, 0.0 三个数字基本相同,或者相差不大, 表明系统的负载是平稳的。

所以分析系统的负载情况,必须要看三个不同时间间隔的平均值。


02 平均负载概念

平均负载很多人容易理解成单位时间内的 CPU 使用率,这是不正确的。平均负载确实与 CPU 使用率有关系,但不是直接的关系。

简单来说,平均负载是指单位时间内,系统处于可运行状态不可中断状态的平均进程数,也就是平均活跃进程数,它和 CPU 使用率并没有直接关系。

  • 可运行状态,是指正在使用 CPU 或者正在等待 CPU 的进程,也就是在 ps 命令看到的 R 状态的进程。
  • 不可中断状态,是指正处于内核关键流程中的进程,并且这些流程是不可以打断的,比如最常见的等待硬件设备的 I/O 响应,也就是在 ps 命令看到的 D 状态的进程。

因此,平均负载其实就是平均活跃进程数,可以更直观的理解成单位时间内的活跃进程数。

既然平均的是活跃进程数,那么最理想的,就是每个CPU上刚好运行着一个进程,这样每个CPU就得到了充分利用。 比如当平均负载为2时,意味着:

  • 在只有 2 个 CPU 的系统上,意味着所有的 CPU 都刚好被完全占用。
  • 在4个CPU的系统上,意味着 CPU 有 50% 的空闲。
  • 在只有 1 个 CPU 的系统中,则意味着有一半的进程竞争不到 CPU。

03 平均负载为多少时合理

在评判你当前的系统平均负载是否合理的时,首先你要知道系统有几个 CPU,可以通过 lscpu 命令或者从文件 /proc/cpuinfo 中读取

# lscpu 命令查看 CPU 个数
[root@lincoding ~]# lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4 # 这里数字表示 CPU 个数        
....

# 从文件 /proc/cpuinfo 中查看 CPU 个数
[root@lincoding ~]# grep 'model name' /proc/cpuinfo | wc -l
4

有了 CPU 个数,我们就可以判断出,当平均负载比 CPU 个数还大的时候,系统已经出现了过载。

这里我再举个例子,假设我们在一个单 CPU 系统上看到平均负载为 1.73,0.60,7.98

  • 在过去 1 分钟内,系统有 73% 的超载
  • 在过 15 分钟内,有 698%的超载,从整体趋势来看,系统的负载在降低。

平均负载高于 CPU 数量 70% 的时候,就应该分析排查负载高的问题了。一旦负载过高,就可能导致进程响应变慢,进而影响服务的正常功能。


04 平均负载与 CPU 使用率

我们经常容易把平均负载和 CPU 使用率混淆,所以在这里,我也做一个区分。

再次说明下,平均负载是指单位时间内,处于可运行状态和不可中断状态的进程数。所以,它不仅包括了正在使用 CPU 的进程,还包括等待 CPU等待 I/O 的进程。

而 CPU 使用率,是单位时间内 CPU 繁忙情况的统计,跟平均负载并不一定完全对应。比如:

  • CPU 密集型进程,使用大量 CPU 会导致平均负载升高,此时这两者是一致的;
  • I/O 密集型进程,等待 I/O 也会导致平均负载升高,但 CPU 使用率不一定很高;
  • 大量等待 CPU 的进程调度也会导致平均负载升高,此时的 CPU 使用率也会比较高。

05 平均负载升高分析命令

我们现在很清楚的知道导致平均负载高的情况,不只是看 CPU 的使用率,也要观察系统 I/O 等待时间高不高。

当发现平均负载升高时,可以使用 mpstat 命令查看 CPU 的性能。

# -P ALL 表示监控所有CPU,后面数字1表示间隔1秒后输出一组数据
$ mpstat -P ALL 1
Linux 2.6.32-431.el6.x86_64 (lzc)   11/05/2019  _x86_64_    (2 CPU)

07:51:45 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
07:51:50 PM  all   42.90    0.00   49.39    0.41    0.00    4.56    0.00    0.00    2.74
07:51:50 PM    0   44.38    0.00   48.67    0.41    0.00    2.86    0.00    0.00    3.68
07:51:50 PM    1   41.57    0.00   49.80    0.40    0.00    6.43    0.00    0.00    1.81

从上面发现

  • CPU 的用户层(%usr)使用率高达45%左右;
  • CPU 的系统层(%sys)使用率高达50%左右;
  • CPU 的 I/0 - 等待(%iowait)占用率为0.41%;
  • CPU 的空闲率(%idle)只有2~3%。

可以推断出是由于 CPU 使用率导致平均负载升高的情况。

假设只有 CPU 的I/0 等待(%iowait)占用率高,CPU 用户层和系统层使用率很轻松,那么导致平均负载升高的原因就是 iowait 的升高。

判断了是因为 CPU 使用率升高还是 iowait 升高导致平均负载升高后,我们还需要定位是哪个进程导致的。可以用 pidstat 来查询:

# 间隔1秒后输出一组数据,-u表示CPU指标
$ pidstat -u 1
08:07:55 PM       PID    %usr %system  %guest    %CPU   CPU  Command
08:07:56 PM         4    0.00    1.00    0.00    1.00     0  ksoftirqd/0
08:07:56 PM         9    0.00    1.00    0.00    1.00     1  ksoftirqd/1
08:07:56 PM        11    0.00   16.00    0.00   16.00     0  events/0
08:07:56 PM        12    0.00   20.00    0.00   20.00     1  events/1
08:07:56 PM       616    7.00    6.00    0.00   13.00     1  pppoe
08:07:56 PM      2745    6.00    6.00    0.00   12.00     1  pppoe

可以发现是 events/0 和 events/1 内核进程 CPU 使用率非常高,所以可能这两个进程导致平均负载升高。


06 小结

平均负载提供了一个快速查看系统整体性能的手段,反映了整体的负载情况。但只看平均负载本身,我们并不能直接发现,到底是哪里出现了瓶颈。所以,在理解平均负载时,也要注意:

  • 平均负载高有可能是 CPU 密集型进程导致的;
  • 平均负载高并不一定代表 CPU 使用率高,还有可能是 I/O 更繁忙了;
  • 当发现负载高的时候,你可以使用 mpstat、pidstat 等工具,辅助分析负载的来源。

需要C/C++ Linux服务器架构师学习资料私信“资料”(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),免费分享

相关推荐

梦幻诛仙12职业1亿元宝版本架设教程(包含资源下载)

架设教程:1;上传脚本zx到bin文件夹,给权限chmod-R777/bin2;输入zx安装宝塔面板输入对应序号,中途输入Y继续3;安装好之后,会给个宝塔地址及账号密码,复制地址...

Java零基础入门,科普Java你应该了解什么

最近很多人问我想学Java但是一点基础没有,网上看了一堆学习线路图还是无从下手。今天耗时3小时整理了一套保姆级的Java入门教程,建议收藏按照线路图一点点学习。一、Java的概况Java是1995年6...

01.Java发展历史(java发展历史简要)

1.Java发展历史Java由SunMicrosystems公司(现为Oracle公司)的JamesGosling及其团队在1991年开发,最初命名为"Oak",后改名为"...

Ubuntu16.04.1安装Java8(ubuntu终端安装java)

上篇文章讲解了怎么在Windows下安装Java8《Windows10安装Java8》,这里讲解下怎么在Linux下安装Java。由于之前已经安装了Ubuntu16.04.1《VmwareWorkst...

性能测试能力提升-JVM GC监控和优化

一、背景接着上一篇的知识:性能测试能力提升-JVMGC原理,本篇文章,我们将主要介绍JVMGC监控和优化相关的知识:命令行方式监控GC图形化方式监控GC什么时候需要开始GC优化?GC优化的目的GC...

Spring Boot Jar 包秒变 Docker 镜像实现多环境部署

你是否在互联网大厂后端开发工作中,遇到过这样的困扰?当完成一个SpringBoot项目开发,准备将Jar包部署到不同环境时,却发现各个环境依赖不同、配置复杂,部署过程繁琐又容易出错,不仅耗费...

「JDK 11」关于 Java 模块系统,看这一篇就够了

继2014年3月Java8发布之后,时隔4年,2018年9月,Java11如期发布,其间间隔了Java9和Java10两个非LTS(LongTermSupp...

对Java学习的10条建议(对java的认识和理解)

不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...

JAVA入门教程-第1章 概述(java入门指南)

大道至简-JAVA入门教程在本教程中,你将学习Java语言的基础知识。Java基础内容涵盖:Java基础概念、Java词法结构、Java数组、Java流程控制、Java字符串、Java...

推荐一款Java音频视频编码器,很赞

Jave2是什么JAVE2(Java音频视频编码器)库是ffmpeg项目上的Java包装器。开发人员可以利用JAVE2将音频和视频文件从一种格式转码为另一种格式。在示例中,您可以将AVI文件转换为MP...

【JAVA教程】JAVA入门及开发环境安装

一、Java开发环境概述Java开发需要三个核心组件:JDK(JavaDevelopmentKit)-Java开发工具包,开发、编译、调试Java程序JRE(JavaRuntimeE...

Windows和Linux环境下的JDK安装教程

JavaDevelopmentKit(简称JDK),是Java开发的核心工具包,提供了Java应用程序的编译、运行和开发所需的各类工具和类库。它包括了JRE(JavaRuntimeEnviro...

记Tomcat优化方案(tomcat优化的几种方法)

Tomcat服务吞吐量评估方案问题:评估方案在一台8核16G的linux服务器上,使用tomcat容器部署服务。在正常情况下如何评估这个tomcat服务可处理的连接数,即服务的吞吐量,请在正常情况下考...

JVM GC诡异问题排查,k8s差点害死我……

前言本文将通过一个真实的生产环境案例,详细展示如何系统性地排查和解决JVM垃圾收集问题。这个案例涵盖了从问题发现、分析诊断到最终解决的完整过程,对于理解JVM调优实战具有重要的参考价值。系统背景我们的...

Thorium Reader - 功能强大的跨平台免费电子书阅读器

在日常阅读日益普及的今天,选择一款合适的电子书阅读器至关重要。ThoriumReader作为一款独具特色的阅读应用,正逐渐在众多同类产品中崭露头角,为用户带来了卓越的阅读体验。  跨平台的便捷性...