性能测试必备知识(4)- 使用 stress 和 sysstat
做性能测试的必备知识系列,可以看下面链接的文章哦
https://www.cnblogs.com/poloyy/category/1806772.html
stress 介绍
Linux 系统压力测试工具,这里通过异常进程模拟平均负载升高的场景
来看看 stress 命令行参数的讲解

| 参数 | 含义 |
| -?、--help | 帮助文档 |
| --version、-v | 版本号 |
| -q | 退出 |
| -n | 显示已完成指令的情况 |
| -t N、--timeout N | 运行 N 秒后停止 |
| --backoff N | 等待 N 微秒后开始运行 |
| -c N、--cpu N |
|
| -i N、--io N |
|
| -m N、--vm N |
|
|
--vm-bytes B |
指定 malloc() 时内存的字节数,默认256MB |
| --vm-hang N | 指定执行 free() 前等待的秒数 |
| -d N、 --hdd N |
|
| --hdd-bytes B |
每个hdd worker写入B字节(默认为1GB) |
Numbers may be suffixed with s,m,h,d,y (time) or B,K,M,G (size)
时间单位可以为秒 s,分m,小时h,天d,年y,文件大小单位可以为 K,M,G
sysstat 介绍
- 包含了常用的 Linux 性能工具,用来监控和分析系统的性能
- 接下来会用到 mpstat 和 pidstat 两个命令
- 后面用单独一篇详细讲解里面包含的所有命令
mpstat
- 常用的多核 CPU 性能分析工具
- 实时查看每个 CPU 的性能指标以及所有 CPU 的平均指标
pidstat
- 常用的进程性能分析工具
- 实时查看进程的 CPU、内存、I/O 以及上下文切换等性能指标
安装两个工具
提供百度云盘链接
链接:https://pan.baidu.com/s/1YENSYaGw7Ar1Z8hf8CXGqA
提取码:2tpc
放到 Linux 下的某个目录
解压
tar -zxvf sysstat-12.1..tar.gz tar -zxvf stress-1.0..tar.gz
分别进入解压后的两个文件夹执行以下命令
./configure make&&make install
平均负载和 CPU 使用率的实际栗子
前言
- 前面一篇文章也讲到了平均负载和 CPU 使用率的三个场景,接下来我们分别对这三个场景举例子
- 需要打开三个终端访问同一个 Linux 机器哦
- 我的 Linux 是虚拟机,2个cpu,2核
CPU 密集型进程
第一个终端
在第一个终端运行 stress 命令,模拟一个 CPU 使用率 100% 的场景
stress -c -t

第二个终端
运行 uptime 查看系统平均负载情况,-d 参数表示高亮显示变化的区域
watch -d uptime

可以看到,1 分钟的平均负载会慢慢增加到 1.00
第三个终端
运行 mpstat 查看 CPU 使用率的变化情况
mpstat -P ALL

可以看出
- 仅有一个 CPU 的使用率接近 100%,但它的 iowait 只有 0
- 这说明,平均负载的升高正是由于 CPU 使用率为 100%
接下来,就要排查是哪个进程导致 CPU 的使用率这么高的
使用 pidstat 命令
间隔 5 秒后输出一组数据
pidstat -u

从这里可以明显看到,stress 进程的 CPU 使用接近 100%
I/O 密集型进程
第一个终端
运行 stress 命令,但这次模拟 I/O 压力,即不停地执行 sync()

第二个终端
运行 uptime 查看系统平均负载情况,-d 参数表示高亮显示变化的区域
watch -d uptime

可以看到,1 分钟的平均负载也会慢慢增加到 1.00
第三个终端
运行 mpstat 查看 CPU 使用率的变化情况
mpstat -P ALL 1

灵魂拷问
其实 iowait 并没有上去,反而还是系统态(%sys)升高了,这是怎么回事?难道是工具的问题?
回答
- iowait 无法升高是因为案例中 stress -i 使用的是 sync() 系统调用,它的作用是刷新缓冲区内存到磁盘中
- 对于新安装的虚拟机,缓冲区可能比较小,无法产生大的io压力
- 这样大部分都是系统调用的消耗了
- 所以,只看到系统 CPU 使用率升高
解决办法使用 stress 的另一个参数 -d ,含义上面已经说了哦
stress --hdd -t --hdd-bytes 4G
再通过 mpstat 看看指标
mpstat -P ALL

可以看到
- iowait 是明显升高了,虽然我们的 CPU 使用率也较高
- 当做了几次尝试之后,包括启动了 2个、4个进程,发现 CPU 使用率仍然保持在 30%+,而 iowait 则不断升高,最高可达到40%+,而且平均负载也在不断升高
- 所以可以看出平均负载的升高,很大原因是因为 iowait 的不断升高
接下来,就要排查是哪个进程导致 iowait 这么高了
使用 pidstat 命令
间隔 5 秒后输出一组数据,收集 10 次,查看最后的平均值
pidstat -u

可以看到
kworker 写入字节的进程 和 stress 进程的 CPU 使用率都是偏高的
大量进程的场景
目的
当系统中运行进程超出 CPU 运行能力时,就会出现等待 CPU 的进程
第一个终端
这次模拟 8 个进程
stress -c -t

第二个终端
运行 uptime 查看系统平均负载情况,-d 参数表示高亮显示变化的区域
watch -d uptime

我的系统只有 4 个 CPU,比 8 个进程少得多,CPU 处于严重的过载状态,平均负载已经超过 8 了
第三个终端
pidstat -u

可以看到
- 8 个进程在竞争 4 个 CPU
- 每隔进程等待 CPU 的时间(%wait)高达 50%
- 这些超出 CPU 计算能力的进程,导致 CPU 过载
对于平均负载的一个理解和总结
平均负载提供了一个快速查看系统整体性能的手段,反映了整的负载情况
但只看平均负载本身,我们并不能直接发现到底是哪里出现了瓶颈
平均负载过高的分析排查思路
- 有可能是 CPU 即密集型进程导致的
- 平均负载过高不代表 CPU 使用率高,也有可能是 I/O 更密集了
- 当发现平均负载过高时,可以通过 mpstat、pidstat 等工具,辅助分析负载的来源
通俗总结
平均负载过高是出现性能瓶颈的表现,分析瓶颈产生的源头和原因,需要通过各类工具
性能测试必备知识(4)- 使用 stress 和 sysstat的更多相关文章
- 性能测试必备知识(6)- 如何查看“CPU 上下文切换”
做性能测试的必备知识系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1806772.html 课前准备,安装 sysbench 下载 sy ...
- 性能测试必备知识(11)- 怎么理解内存中的Buffer和Cache?
做性能测试的必备知识系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1806772.html 缓存 从 free 命令可以看到,缓存其实就 ...
- 性能测试必备知识(2)- 查看 Linux 的 CPU 相关信息
做性能测试的必备知识系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1806772.html 查看系统 CPU 信息 cat /proc/ ...
- 性能测试必备知识(5)- 深入理解“CPU 上下文切换”
做性能测试的必备知识系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1806772.html 前言 上一篇文章中,举例了大量进程等待 CP ...
- 性能测试必备知识(7)- 深入理解“CPU 使用率”
做性能测试的必备知识系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1806772.html 回顾 CPU 使用率是单位时间内 CPU 使 ...
- 性能测试必备知识(10)- Linux 是怎么管理内存的?
做性能测试的必备知识系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1806772.html 内存映射 日常生活常说的内存是什么 比方说, ...
- 性能测试必备命令(2)- uptime
性能测试必备的 Linux 命令系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1819490.html 介绍 系统启动up了(运行了)多 ...
- Java面试必备知识
JAVA面试必备知识 第一,谈谈final, finally, finalize的区别. 第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可 ...
- Apache Tomcat8必备知识
Apache Tomcat8必备知识 作者:chszs,转载需注明.博客主页: http://blog.csdn.net/chszs 一.Apache Tomcat 8介绍 Apache Tomcat ...
随机推荐
- 嵌入式QT开发视频教程-供参考
免费嵌入式QT开发视频教程 https://pan.baidu.com/s/1bprhJ2Z QT初级到高级编程视频教程--丁林松.rarhttp://www.jisoupan.com/share/2 ...
- 12个Python游戏中的龙穴探险,快速掌握基础,其实很简单
越来越多的人学习python编程,但更多的人,拿着教程却不知道该怎么学. 今天我给大家举一个例子,是我自己学习python时,用到的方法. 首先,我是一名普通的程序员,相对于十几年开发经验的程 ...
- 手摸手带你理解Vue响应式原理
前言 响应式原理作为 Vue 的核心,使用数据劫持实现数据驱动视图.在面试中是经常考查的知识点,也是面试加分项. 本文将会循序渐进的解析响应式原理的工作流程,主要以下面结构进行: 分析主要成员,了解它 ...
- angular 接入 IdentityServer4
angular 接入 IdentityServer4 Intro 最近把活动室预约的项目做了一个升级,预约活动室需要登录才能预约,并用 IdentityServer4 做了一个统一的登录注册中心,这样 ...
- Java 中的数据结构类 Vector 和 ArrayList
今天刷算法题目时,使用到了 Java 的内置栈类 Stack,好奇它是怎么实现的,发现它是继承于 Vector 这个类.那么,就先学习下 Vector 这个类的实现吧! Vector 和 ArrayL ...
- rodert单排学习redis进阶【白银一】
redis之白银一 说些题外话,最近帝都疫情又严重,大家都身处时代洪流中,这不是个别人能左右的,希望你能保护好自己,天天开心. 前言 1.Redis 客户端 1.1.Redis Desktop Man ...
- python解析json文件信息到csv中
json格式多种多样,本代码着重看函数部分 import json, csv, os import pandas as pd josns_root = 'jsons' csvs_root = 'csv ...
- ES6躬行记 笔记
ES6躬行记(18)--迭代器 要实现以下接口## next() ,return,throw 可以用for-of保证迭代对象的正确性 例如 var str = "向
- 告别传统机房:3D 机房数据可视化实现智能化与VR技术的新碰撞
前言 随着各行业对计算机依赖性的日益提高,计算机信息系统的发展使得作为其网络设备.主机服务器.数据存储设备.网络安全设备等核心设备存放地的计算机机房日益显现出它的重要地位,而机房的环境和动力设备如供配 ...
- 《The Google File System》论文研读
GFS 论文总结 说明:本文为论文 <The Google File System> 的个人总结,难免有理解不到位之处,欢迎交流与指正 . 论文地址:GFS Paper 阅读此论文的过程中 ...