每次发现系统变慢时,我们通常做的第一件事,就是执行 top 或 uptime 命令:

  1. $ uptime
  2. 22:22:17 up 2 days, 20:14, 1 user, load average: 0.63, 0.83, 0.88
  3. // 22:22:17 当前时间 up 2 days, 20:14 系统运行时间 1 user 正在登录用户数
  4. // load average 过去 1 分钟、5 分钟、15 分钟的平均负载

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

  可运行状态的进程,是指正在使用 CPU 或者正在等待 CPU 的进程,也就是我们常用 ps 命令看到的,处于 R 状态(Running 或 Runnable)的进程。

  不可中断状态的进程,是正处于内核态关键流程中的进程,并且这些流程是不可打断的,比如最常见的是等待硬件设备的 I/O 响应,也就是我们在 ps 命令中看到的 D 状态(Uninterruptible Sleep,也称为 Disk Sleep)的进程。不可中断状态实际上是系统对进程和硬件设备的一种保护机制。

  平均负载为多少时合理:在实际生产环境中,一般平均负载应该低于CPU数量的70%才是正常的,否则可能影响进程响应速度。但该值并不是绝对的,最好的方式是将系统的平均负载监控起来,通过更多的历史数据,判断负载的变化趋势。查看CPU个数:grep 'model name' /proc/cpuinfo | wc -l,平均负载中有三个值,表示三个时间段,可以更全面的了解过去15分钟内的趋势变化。

  平均负载 VS CPU使用率:平均负载代表活跃进程数,平均负载高,不意味着CPU使用率高。平均负载是单位时间内,可运行状态和不可中断状态的进程数,包括了正在使用CPU的进程,还包括等到CPU和等待I/O的进程。而CPU使用率是单位时间内CPU繁忙情况的统计。例如:

    CPU密集型进程,大量使用CPU,导致CPU使用率和平均负载升高,是一致的;

    I/O密集型,等待I/O导致平均负载高,CPU使用率不一定高;

    等待CPU进程的调度,导致平均负载高,CPU使用率也高。

  

  CPU密集型进程例程

  1. $ sudo apt install stress-ng sysstat
  2. // stress-ng 系统压测工具 sysstat 性能监控和分析工具:mpstat 多核性能分析、pidstat进程性能分析
  3. $ stress-ng --cpu 1 --timeout 600
  4. // 模拟一个CPU使用率为100%
  5. $ watch -d uptime
  6. 11:25:06 up 13:04, 1 user, load average: 0.87, 0.41, 0.18
  7. $ mpstat -P ALL 5
  8. // -P ALL 监控所有CPU,5 每5秒输出一组数据
  9. 112450 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
  10. 112455 all 51.38 0.00 0.31 0.00 0.00 0.00 0.00 0.00 0.00 48.32
  11. 112455 0 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
  12. 112455 1 1.04 0.00 0.62 0.00 0.00 0.00 0.00 0.00 0.00 98.34
  13. $ pidstat -u 5 1
  14. // 间隔5秒,总共输出1次数据
  15. 113310 UID PID %usr %system %guest %CPU CPU Command
  16. 113315 1000 32091 98.60 1.20 0.00 99.80 1 stress-ng-cpu

  

  I/O密集型进程例程

  1. $ stress-ng -i 1 --timeout 600 stress-ng -i 1 --hdd 1 timeout 600
  2. // 模拟I/O压力,即不停地执行sync
  3. $ watch -d uptime
  4. 11:41:17 up 13:20, 1 user, load average: 0.99, 0.75, 0.44
  5. $ mpstat -P ALL 5 1
  6. 114159 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
  7. 114204 all 0.66 0.00 1.31 47.21 0.00 0.00 0.00 0.00 0.00 50.82
  8. 114204 0 0.62 0.00 1.87 40.96 0.00 0.00 0.00 0.00 0.00 56.55
  9. 114204 1 0.69 0.00 0.69 54.04 0.00 0.00 0.00 0.00 0.00 44.57
  10. $ pidstat -u 5 1
  11. // pidstat中没有%wait,需要更新成最新的版本,采用源码或者RPM安装。
  12. // %wait 表示等待CPU的进程已经在CPU就绪队列中,处于运行态。
  13. // 有别于 %iowait(wa),代表等待 I/O 的 CPU 时间,处于不可中断状态。
  14. 114217 UID PID %usr %system %guest %CPU CPU Command
  15. 114222 1000 315 0.00 4.00 0.00 4.00 1 stress-ng-iosyn

  

  大量进程的例程

  1. $ stress-ng -c 8 --timeout 600
  2. // 模拟8个进程
  3. $ uptime
  4. 11:53:18 up 13:32, 1 user, load average: 8.02, 6.47, 3.46
  5. $ mpstat -P ALL 5 1
  6. 114859 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
  7. 114904 all 98.00 0.00 2.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
  8. 114904 0 99.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
  9. 114904 1 96.80 0.00 3.20 0.00 0.00 0.00 0.00 0.00 0.00 0.00
  10. $ pidstat -u 5 1
  11. 114903 UID PID %usr %system %guest %CPU CPU Command
  12. 114908 1000 337 23.55 0.20 0.00 23.75 1 stress-ng-cpu
  13. 114908 1000 338 24.55 0.00 0.00 24.55 0 stress-ng-cpu
  14. 114908 1000 339 23.55 0.20 0.00 23.75 1 stress-ng-cpu
  15. 114908 1000 340 23.35 0.20 0.00 23.55 0 stress-ng-cpu
  16. 114908 1000 341 23.35 0.20 0.00 23.55 1 stress-ng-cpu
  17. 114908 1000 342 24.55 0.00 0.00 24.55 0 stress-ng-cpu
  18. 114908 1000 343 24.15 0.00 0.00 24.15 1 stress-ng-cpu
  19. 114908 1000 344 24.55 0.20 0.00 24.75 0 stress-ng-cpu

  

  uptime、mpstat、pidstat

  

  

  

  

  

Linux性能优化从入门到实战:02 CPU篇:平均负载的更多相关文章

  1. Linux性能优化从入门到实战:01 Linux性能优化学习路线

      我通过阅读各种相关书籍,从操作系统原理.到 Linux内核,再到硬件驱动程序等等.   把观察到的性能问题跟系统原理关联起来,特别是把系统从应用程序.库函数.系统调用.再到内核和硬件等不同的层级贯 ...

  2. Linux性能优化从入门到实战:16 文件系统篇:总结磁盘I/O指标/工具、问题定位和调优

    (1)磁盘 I/O 性能指标 文件系统和磁盘 I/O 指标对应的工具 文件系统和磁盘 I/O 工具对应的指标 (2)磁盘 I/O 问题定位分析思路 (3)I/O 性能优化思路 Step 1:首先采用 ...

  3. Linux性能优化从入门到实战:07 CPU篇:CPU性能优化方法

    性能优化方法论   动手优化性能之前,需要明确以下三个问题:   (1)如何评估性能优化的效果? 确定性能的量化指标.测试优化前的性能指标.测试优化后的性能指标.   量化指标的选择.至少要从应用程序 ...

  4. Linux性能优化从入门到实战:04 CPU篇:CPU使用率

      CPU使用率是单位时间内CPU使用情况的统计,以百分比方式展示. $ top top - 11:46:45 up 7 days, 11:52, 1 user, load average: 0.00 ...

  5. Linux性能优化从入门到实战:03 CPU篇:CPU上下文切换

      linux操作系统是将CPU轮流分配给任务,分时执行的.而每次执行任务时,CPU需要知道CPU寄存器(CPU内置的内存)和程序计数器PC(CPU正在执行指令和下一条指令的位置)值,这些值是CPU执 ...

  6. Linux性能优化从入门到实战:09 内存篇:Buffer和Cache

      Buffer 是缓冲区,而 Cache 是缓存,两者都是数据在内存中的临时存储.   避免跟文中的"缓存"一词混淆,而文中的"缓存",则通指内存中的临时存储 ...

  7. Linux性能优化从入门到实战:06 CPU篇:快速定位CPU瓶颈

    CPU性能指标      (1)CPU使用率:1) 用户态CPU使用率(包括用户态 user 和低优先级用户态 nice).2) 系统CPU使用率.3) 等待 I/O 的CPU使用率.4) 软中断和硬 ...

  8. Linux性能优化从入门到实战:17 网络篇:网络基础

    网络模型 为了解决网络互联中异构设备的兼容性问题,并解耦复杂的网络包处理流程,国际标准化组织制定了开放式系统互联通信参考模型(Open System Interconnection Reference ...

  9. Linux性能优化从入门到实战:15 文件系统篇:磁盘 I/O

    磁盘   磁盘是可以持久化存储的设备,按照存储介质来分类:   (1)机械磁盘(硬盘驱动器,Hard Disk Driver,HDD),主要由盘片和读写磁头组成,数据就存储在盘片的环状磁道中.在读写数 ...

随机推荐

  1. (10.1)Python学习笔记二

    1.在项目工程中要模块化测试一个开发的功能,在测试通过后交付给项目组其他人员继续开发.要保证代码开发的性能和效率以及可扩展性. 2.项目工程中的文件夹分类要功能模块明确清晰,在python中引入某一个 ...

  2. WEB Fuzz中需要关注的7种响应

    WEB应用模糊测试(WEB Fuzz)是一种特殊形式的网络协议模糊测试,专门关注遵循HTTP规范的网络数据包. WEB Fuzz并不是新的概念,目前有多种WEB应用模糊测试器(WEB Fuzzer), ...

  3. Rtmp AAC基本格式(转)

    第一个audio data包:AAC sequence header 第二个audio data包:AAC raw AF表示的含义: 1)第一个字节af,a就是10代表的意思是AAC, Format ...

  4. centos修改时区,同步时间

    查看当前系统时区 ls -la /etc/localtime 查看支持的时区 timedatectl list-timezones # 查看所有时区 timedatectl list-timezone ...

  5. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_1_缓冲流的原理

    一个字节一个字节的读取,先读取到a,a给到os操作系统.os再给JVM,.jVM再把a给java程序 读完a再读取b.这样一层层的返回,效率低下 一次读取,缓冲区数组返回来.

  6. Delphi控件-复合控件

     http://blog.csdn.net/cml2030/article/details/3166634 Delphi控件-复合控件 标签: delphidestructorbuttonstring ...

  7. myeclipse 2015 myeclipse2010破解共存

    1.高版本选择bling版本,低版本选择profession版本2.用高版本的公钥替换低版本的公钥3.先破解低版本的后破解高版本的4.最后用高版本的替换低版本的文件

  8. javascript实现保留两位小数的多种方法

    第一种方法:javascript实现保留两位小数一位自动补零代码实例:第一种方法介绍一下如何实现对数字保留两位小数效果,如果数字的原本小数位数不到两位,那么缺少的就自动补零,这个也是为了统一的效果,先 ...

  9. vue中的provide/inject讲解

    最近在看element-ui的源码,发现了一个这样的属性:inject.遂查看官网provider/inject provider/inject:简单的来说就是在父组件中通过provider来提供变量 ...

  10. linux启动内核源码分析

    内核的启动时从main.c这个文件里面的start_kernel函数开始的,这个文件在linux源码里面的init文件夹下面 下面我们来看看这个函数 这个函数很长,可以看个大概过去 asmlinkag ...