首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Linux 性能诊断:负载评估

Linux 性能诊断:负载评估

原创
作者头像
RiboseYim
发布于 2018-01-12 14:24:38
发布于 2018-01-12 14:24:38
2.5K0
举报
文章被收录于专栏:睿哥杂货铺睿哥杂货铺
负载诊断流程
  • 观察load average (平均负载)
  • 观察CPU、I/O是否存在瓶颈

从load avgerage等总括性的数据着手,参考CPU使用率和I/O等待时间等具体的数字,从而自顶向下快速排查各进程状态。

perf-flow
perf-flow

概念:什么是负载?

负载可以分为两大部分:CPU负载、I/O 负载 。

load average
代码语言:C
AI代码解释
复制
uptime
top
cat /proc/loadavg
代码语言:C
AI代码解释
复制
load average:0.65, 1.49, 1.76  (负载很低)
load average:3.49, 3.67, 3.75  (负载一般)
load average:33.20, 18.39, 15.21 (负载高)
load average:70.25, 80.50, 95.38 (负载非常高,需要干预)

load average:7.89, 11.42, 13.42  (当前负载趋于下降)
load average:17.89, 13.28, 4.45 (当前负载趋于上升)

依次时过去1分钟,5分钟,15分钟内,单位时间的等待任务数,也就是表示平均有多少任务正处于等待状态。在load average较高的情况下,就说明等待运行的任务较多,因此轮到该任务运行的等待时间就会出现较大延迟,即反映了此时负载较高。

linux内核的进程调度器(Process Scheduler)

负责决定任务运行的优先级,以及让任务等待或使之重新开始等核心工作。调度器划分并管理进程(Process)的状态。例如:

等待分配CPU资源的状态

等待磁盘输入输出完毕的状态

process-flow.png
process-flow.png

进程描述符的状态

|进程状态|PS Stat|说明|

|------|-----------------|

|TASK_RUNNING|R(Run)|运行状态。只要CPU空闲,随时都可以开始。|

|TASK_INTERRUPTIBLE|S(Sleep)|可中断的等待状态。例如系统睡眠或来自于用户输入的等待等。|

|TASK_UNINTERRUPTIBLE|D(Disk Sleep)|不可中断的等待状态。主要为短时间恢复时的等待状态。例如磁盘输入输出的等待|

|TASK_STOPPED||响应暂停信号而运行中断的状态。直到恢复(Resume)前都不会被调度|

|TASK_ZOMBIE|Z(Zombie)|僵死状态。虽然子进程已经终止(exit),但父进程尚未执行wait(),因此该进程的资源没有被系统释放|

  • TASK_RUNNING正在运行
  • TASK_RUNNING (等待状态,加权换算)
  • TASK_INTERRUPTIBLE(等待状态,加权换算)
  • TASK_UNINTERRUPTIBLE(等待状态,不加权换算)

load average 表示“等待进程的平均数”,除了“TASK_RUNNING正在运行”,其它三个都是等待状态。TASK_INTERRUPTIBLE不被换算。即只换算“虽然需要即刻运行处理,但是无论如何都必须等待”。

load average所描述的负载就是:需要运行处理,但又必需等待队列前的进程处理完成的进程个数。具体来说:要么等待授予CPU运行权限,要么等待磁盘I/O完成。

  • 内核函数:kernei/timer.c的calc-load();
  • 调用周期:每次计时器中断(centos为4ms)
CPU 还是 I/O ?

load average的数字只是表示等待的任务数,仅根据load average并不能判断具体是CPU负载高还是I/O负载高。

CPU密集型程序

I/O密集型程序

Sar (System Activity Reporter)

CPU使用率和I/O等待时间都是在不断变化的,可以通过sar 命令来确认这些指标。该工具包含在sysstat软件包内。

代码语言:C
AI代码解释
复制
$ sar
Linux    04/17/16        _x86\_64_        (24 CPU)
00:00:01        CPU     %user     %nice   %system   %iowait    %steal     %idle
00:10:02        all      1.26      0.00      0.55      0.00      0.00     98.19
00:20:01        all      1.58      0.00      1.04      0.00      0.00     97.38
00:30:01        all      1.23      0.00      0.56      0.00      0.00     98.21
00:40:01        all      1.59      0.00      1.01      0.00      0.00     97.40
00:50:01        all      1.35      0.00      0.59      0.00      0.00     98.06
01:00:01        all      1.63      0.00      1.10      0.00      0.00     97.27
01:10:01        all      1.22      0.00      0.54      0.00      0.00     98.24
01:20:01        all      1.68      0.00      1.06      0.00      0.00     97.25
01:30:01        all      1.23      0.00      0.54      0.00      0.00     98.23
代码语言:C
AI代码解释
复制
$ sar 1 10
18:54:58    %usr    %sys    %wio   %idle
18:54:59      18       3       0      79
18:55:00      46      14       0      40
18:55:01      38      13       0      49
18:55:02      17       4       0      79
18:55:03      11       4       0      85
18:55:04      12       5       0      83
18:55:05      20       4       0      76
18:55:06      22       3       0      75
18:55:07      21       4       0      75
18:55:08      17       4       0      79

输出参数:

  • %user:用户(一般的应用软件运作模式)CPU资源
  • %system:系统(内核运作)占用CPU资源
  • %iowait:I/O等待率。

进程详细

代码语言:C
AI代码解释
复制
$ ps auxw
test 1551 0.2 0.1 6452 4776 ? S 19:25 0:00  Test.pl CTP00004.PRS00034 1 300
test 1553 2.6 0.4 18196 16424 ? S 19:25 0:00  /Test.pl 00001.PRS00034
test 1555 2.6 0.4 18168 16396 ? S 19:25 0:00  /Test.pl 00002.PRS00034
test 1557 2.8 0.4 18132 16432 ? S 19:25 0:00  /Test.pl 00004.PRS00034
test 1606 0.0 0.0 50060 916 ? Sl 19:25 0:00 /bin/PingTest -f CTP00004
test 1612 2.5 0.4 18156 16452 ? S 19:25 0:00  /Test.pl 00014.PRS00034
test 1629 2.1 0.4 18416 16696 ? S 19:25 0:00  /Test.pl 00015.PRS00034
test 2253 2.7 0.3 12868 11160 ? R 19:25 0:00  -w mrtg MRTG\_00027.cfg log
test 2254 3.6 0.3 12864 11184 ? S 19:25 0:00  -w mrtg MRTG\_00028.cfg log
test 2261 2.4 0.2 12640 11004 ? S 19:25 0:00  -w mrtg MRTG\_00030.cfg log

输出参数:

  • %CPU:该进程的CPU使用率
  • %memb:物理内存百分比
  • VSZ、RSS:虚拟/物理内存
  • STAT:进程状态(非常重要)
  • TIME:CPU占用时间
SWAP吞吐
代码语言:C
AI代码解释
复制
$sar -W
17:20:01     pswpin/s pswpout/s
17:30:01         0.00      0.00
17:40:01         0.00      0.00
17:50:01         0.00      0.00
18:00:01         0.00      0.00
18:10:01         0.00      0.00
18:20:01         0.00      0.00
18:30:01         0.00      0.00
18:40:01         0.00      0.00
18:50:02         0.00      0.00
19:00:01         0.00      0.00
19:10:02         0.00      0.00
Average:         0.00      0.00

输出参数:

  • pswpin/s:每秒系统换入的页面数
  • pswpout/s:每秒系统换出的页面数

发生频繁的交换时,服务器的吞吐量性能会大幅下降。

vmstat(Report Virtual Memory Statistics)

实时确认CPU使用率及实际的I/O等待时间

代码语言:C
AI代码解释
复制
$ vmstat
 kthr      memory            page            disk          faults      cpu
 r b w   swap  free  re  mf pi po fr de sr s2 s2 s2 s2   in   sy   cs us sy id
 0 0 0 45411448 17973032 140 1470 13 41 33 0 0 -0 -0 -0 -0 2753 313459 4984 16 3 81
解决方案

优化的真正工作是“找出系统瓶颈并加以解决”,我们所能做的就是“充分发挥硬/软件本来的性能,解决可能存在的问题”。例如,同样是I/O问题,我们可以通过增加内存来缓解,也可以调整调度方案来优化(时间换空间),但是更多的情况是,优化应用程序的I/O算法效果更佳。

最后,重温一句经典格言

别臆断,请监控

扩展阅读:Linux 操作系统

推荐:电子书《Linux Perf Master》

发表在GitBook平台,欢迎订阅、下载、批评指正:

https://www.gitbook.com/book/riboseyim/linux-perf-master/details

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
javascript异步编程之generator(生成器函数)与asnyc/await语法糖
相比于传统回调函数的方式处理异步调用,Promise最大的优势就是可以链式调用解决回调嵌套的问题。但是这样写依然会有大量的回调函数,虽然他们之间没有嵌套,但是还是没有达到传统同步代码的可读性。如果以下面的方式写异步代码,它是很简洁,也更容易阅读的。
开水泡饭
2022/12/26
4460
面试官: 说说你对async的理解
async是generator和promise的语法糖,利用迭代器的状态机和promise来进行自更新!
用户8200753
2023/10/22
2950
async/await 源码实现
如果你有一个这样的场景,b依赖于a,c依赖于b,那么我们只能通过promise then的方式实现。这样的的可读性就会变得很差,而且不利于流程控制,比如我想在某个条件下只走到 b 就不往下执行 c 了,这种时候就变得不是很好控制!
用户4131414
2020/03/19
1.4K0
字节前端高频手写面试题(持续更新中)1
观察者需要放到被观察者中,被观察者的状态变化需要通知观察者 我变化了 内部也是基于发布订阅模式,收集观察者,状态变化后要主动通知观察者
helloworld1024
2023/01/03
8440
Promise/async/Generator实现原理解析
笔者刚接触async/await时,就被其暂停执行的特性吸引了,心想在没有原生API支持的情况下,await居然能挂起当前方法,实现暂停执行,我感到十分好奇。好奇心驱使我一层一层剥开有关JS异步编程的一切。阅读完本文,读者应该能够了解:
Nealyang
2020/03/25
2K0
async/await 原理及执行顺序分析
之前写了篇文章《这一次,彻底理解Promise原理》,剖析了Promise的相关原理。我们都知道,Promise解决了回调地狱的问题,但是如果遇到复杂的业务,代码里面会包含大量的 then 函数,使得代码依然不是太容易阅读。
桃翁
2019/11/08
2.1K0
JavaScript 的 async/await : async 和 await 在干什么
async 是“异步”的简写,而 await 可以认为是 async wait 的简写。 async 用于申明一个 function 是异步的,而 await 用于等待一个异步方法执行完成。 await 只能出现在 async 函数中。
一个会写诗的程序员
2018/08/17
1.1K0
JavaScript 的 async/await : async 和 await 在干什么
如何写出一个惊艳面试官的 Promise【近 1W字】 前言源码1.Promise2.Generator3.async 和 await4.Pro
1.高级 WEB 面试会让你手写一个Promise,Generator 的 PolyFill(一段代码); 2.在写之前我们简单回顾下他们的作用; 3.手写模块见PolyFill.
火狼1
2020/05/09
8270
如何写出一个惊艳面试官的 Promise【近 1W字】
                            前言源码1.Promise2.Generator3.async 和 await4.Pro
async与await的原理揭秘
async和await是es7语法,在babel中会被转译,我们看一下专一前和转译后的源码:
挥刀北上
2021/12/10
9300
async与await的原理揭秘
async/await剖析
JavaScript是单线程的,为了避免同步阻塞可能会带来的一些负面影响,引入了异步非阻塞机制,而对于异步执行的解决方案从最早的回调函数,到ES6的Promise对象以及Generator函数,每次都有所改进,但是却又美中不足,他们都有额外的复杂性,都需要理解抽象的底层运行机制,直到在ES7中引入了async/await,他可以简化使用多个Promise时的同步行为,在编程的时候甚至都不需要关心这个操作是否为异步操作。
WindRunnerMax
2020/08/27
3910
理解 ES6 generator
与 promise 对象类似,这里运用鸭子模型进行判断,如果对象中有 next 与 throw 两个方法,那么就认为这个对象是一个生成器对象。
翼德张
2022/01/13
3240
Promise 向左,Async/Await 向右?
1. 前言 从事前端开发至今,异步问题经历了 Callback Hell 的绝望,Promise/Deffered 的规范混战,到 Generator 的所向披靡,到如今 Async/Await 为大众所接受,这其中 Promise 和 Async/Await 依然活跃代码中,对他们的认识和评价也经历多次反转,也有各自的拥趸,形成了一直延续至今的爱恨情仇,其背后的思考和启发,依旧值得我们深思。 预先声明: 本文的目标并不是引发大家的论战,也不想去推崇其中任何一种方式来作为前端异步的唯一最佳实践,想在介绍下
用户1097444
2022/06/29
6250
Promise 向左,Async/Await 向右?
面试官问 async、await 函数原理是在问什么?
这周看的是 co 的源码,我对 co 比较陌生,没有了解和使用过。因此在看源码之前,我希望能大概了解 co 是什么,解决了什么问题。
若川
2021/09/27
7770
Generator函数
JavaScript是单线程的,异步编程对于 JavaScript语言非常重要。如果没有异步编程,根本没法用,得卡死不可。
木子星兮
2020/07/16
1.2K0
ES6读书笔记(三)
前段时间整理了ES6的读书笔记:《ES6读书笔记(一)》,《ES6读书笔记(二)》,现在为第三篇,本篇内容包括:
全栈程序员站长
2021/07/06
1.3K0
【ECMAScript6】es6 要点(二)Promise | 自个写一个Promise | Generator | Async/Await
但是,我们不能无限制地调用next从Generator实例中获取值。否则最后会返回undefined。原因:Generator犹如一种序列,一旦序列中的值被消费,你就不能再次消费它。即,序列为空后,再次调用就会返回undefined!。
前端修罗场
2023/10/07
5150
【ECMAScript6】es6 要点(二)Promise | 自个写一个Promise | Generator | Async/Await
手写async,await 理解内部原理
async await 底层并不是新东西,只是用起来比Generator函数更舒服的api...
心念
2023/01/11
8990
原生JS灵魂之问(下), 冲刺进阶最后一公里(附个人成长经验分享)
笔者最近在对原生JS的知识做系统梳理,因为我觉得JS作为前端工程师的根本技术,学再多遍都不为过。打算来做一个系列,一共分三次发,以一系列的问题为驱动,当然也会有追问和扩展,内容系统且完整,对初中级选手会有很好的提升,高级选手也会得到复习和巩固。这是本系列的第三篇。
用户4131414
2020/03/19
2.2K0
co 函数库的含义和用法
======================================== 以下是《深入掌握 ECMAScript 6 异步编程》系列文章的第三篇。 Generator函数的含义与用法 Th
ruanyf
2018/04/12
1.1K0
co 函数库的含义和用法
前端异步代码解决方案实践(二)
早前有针对 Promise 的语法写过博文,不过仅限入门级别,浅尝辄止食而无味。后面一直想写 Promise 实现,碍于理解程度有限,多次下笔未能满意。一拖再拖,时至今日。
前朝楚水
2018/07/26
3.6K0
推荐阅读
相关推荐
javascript异步编程之generator(生成器函数)与asnyc/await语法糖
更多 >
LV.1
txyWeb Front End
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
首页
学习
活动
专区
圈层
工具
MCP广场
首页
学习
活动
专区
圈层
工具
MCP广场